Skip to content

Commit

Permalink
Migrate rustc_mir_dataflow to diagnostic structs
Browse files Browse the repository at this point in the history
  • Loading branch information
5225225 committed Aug 23, 2022
1 parent 38528d4 commit ee2b161
Show file tree
Hide file tree
Showing 8 changed files with 129 additions and 22 deletions.
3 changes: 3 additions & 0 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4213,11 +4213,14 @@ dependencies = [
"regex",
"rustc_ast",
"rustc_data_structures",
"rustc_errors",
"rustc_graphviz",
"rustc_hir",
"rustc_index",
"rustc_macros",
"rustc_middle",
"rustc_serialize",
"rustc_session",
"rustc_span",
"rustc_target",
"smallvec",
Expand Down
29 changes: 29 additions & 0 deletions compiler/rustc_error_messages/locales/en-US/rustc_mir_dataflow.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
rustc_mir_dataflow_path_must_end_in_filename =
path must end in a filename
rustc_mir_dataflow_unknown_formatter =
unknown formatter
rustc_mir_dataflow_duplicate_values_for =
duplicate values for `{$name}`
rustc_mir_dataflow_requires_an_argument =
`{$name}` requires an argument
rustc_mir_dataflow_stop_after_dataflow_ended_compilation =
stop_after_dataflow ended compilation
rustc_mir_dataflow_peek_must_be_place_or_ref_place =
rustc_peek: argument expression must be either `place` or `&place`
rustc_mir_dataflow_peek_must_be_not_temporary =
dataflow::sanity_check cannot feed a non-temp to rustc_peek.
rustc_mir_dataflow_peek_bit_not_set =
rustc_peek: bit not set
rustc_mir_dataflow_peek_argument_not_a_local =
rustc_peek: argument was not a local
rustc_mir_dataflow_peek_argument_untracked =
rustc_peek: argument untracked
1 change: 1 addition & 0 deletions compiler/rustc_error_messages/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ fluent_messages! {
passes => "../locales/en-US/passes.ftl",
privacy => "../locales/en-US/privacy.ftl",
typeck => "../locales/en-US/typeck.ftl",
rustc_mir_dataflow => "../locales/en-US/rustc_mir_dataflow.ftl",
}

pub use fluent_generated::{self as fluent, DEFAULT_LOCALE_RESOURCES};
Expand Down
3 changes: 3 additions & 0 deletions compiler/rustc_mir_dataflow/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,13 @@ smallvec = { version = "1.8.1", features = ["union", "may_dangle"] }
tracing = "0.1"
rustc_ast = { path = "../rustc_ast" }
rustc_data_structures = { path = "../rustc_data_structures" }
rustc_errors = { path = "../rustc_errors" }
rustc_graphviz = { path = "../rustc_graphviz" }
rustc_hir = { path = "../rustc_hir" }
rustc_index = { path = "../rustc_index" }
rustc_macros = { path = "../rustc_macros" }
rustc_middle = { path = "../rustc_middle" }
rustc_serialize = { path = "../rustc_serialize" }
rustc_session = { path = "../rustc_session" }
rustc_target = { path = "../rustc_target" }
rustc_span = { path = "../rustc_span" }
71 changes: 71 additions & 0 deletions compiler/rustc_mir_dataflow/src/errors.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
use rustc_macros::SessionDiagnostic;
use rustc_span::{Span, Symbol};

#[derive(SessionDiagnostic)]
#[diag(rustc_mir_dataflow::path_must_end_in_filename)]
pub(crate) struct PathMustEndInFilename {
#[primary_span]
pub span: Span,
}

#[derive(SessionDiagnostic)]
#[diag(rustc_mir_dataflow::unknown_formatter)]
pub(crate) struct UnknownFormatter {
#[primary_span]
pub span: Span,
}

#[derive(SessionDiagnostic)]
#[diag(rustc_mir_dataflow::duplicate_values_for)]
pub(crate) struct DuplicateValuesFor {
#[primary_span]
pub span: Span,
pub name: Symbol,
}

#[derive(SessionDiagnostic)]
#[diag(rustc_mir_dataflow::requires_an_argument)]
pub(crate) struct RequiresAnArgument {
#[primary_span]
pub span: Span,
pub name: Symbol,
}

#[derive(SessionDiagnostic)]
#[diag(rustc_mir_dataflow::stop_after_dataflow_ended_compilation)]
pub(crate) struct StopAfterDataFlowEndedCompilation;

#[derive(SessionDiagnostic)]
#[diag(rustc_mir_dataflow::peek_must_be_place_or_ref_place)]
pub(crate) struct PeekMustBePlaceOrRefPlace {
#[primary_span]
pub span: Span,
}

#[derive(SessionDiagnostic)]
#[diag(rustc_mir_dataflow::peek_must_be_not_temporary)]
pub(crate) struct PeekMustBeNotTemporary {
#[primary_span]
pub span: Span,
}

#[derive(SessionDiagnostic)]
#[diag(rustc_mir_dataflow::peek_bit_not_set)]
pub(crate) struct PeekBitNotSet {
#[primary_span]
pub span: Span,
}

#[derive(SessionDiagnostic)]
#[diag(rustc_mir_dataflow::peek_argument_not_a_local)]
pub(crate) struct PeekArgumentNotALocal {
#[primary_span]
pub span: Span,
}

#[derive(SessionDiagnostic)]
#[diag(rustc_mir_dataflow::peek_argument_untracked)]
pub(crate) struct PeekArgumentUntracked {
#[primary_span]
pub span: Span,
}
13 changes: 7 additions & 6 deletions compiler/rustc_mir_dataflow/src/framework/engine.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
//! A solver for dataflow problems.

use crate::errors::{
DuplicateValuesFor, PathMustEndInFilename, RequiresAnArgument, UnknownFormatter,
};
use crate::framework::BitSetExt;

use std::ffi::OsString;
Expand Down Expand Up @@ -347,7 +350,7 @@ impl RustcMirAttrs {
match path.file_name() {
Some(_) => Ok(path),
None => {
tcx.sess.span_err(attr.span(), "path must end in a filename");
tcx.sess.emit_err(PathMustEndInFilename { span: attr.span() });
Err(())
}
}
Expand All @@ -356,7 +359,7 @@ impl RustcMirAttrs {
Self::set_field(&mut ret.formatter, tcx, &attr, |s| match s {
sym::gen_kill | sym::two_phase => Ok(s),
_ => {
tcx.sess.span_err(attr.span(), "unknown formatter");
tcx.sess.emit_err(UnknownFormatter { span: attr.span() });
Err(())
}
})
Expand All @@ -377,8 +380,7 @@ impl RustcMirAttrs {
mapper: impl FnOnce(Symbol) -> Result<T, ()>,
) -> Result<(), ()> {
if field.is_some() {
tcx.sess
.span_err(attr.span(), &format!("duplicate values for `{}`", attr.name_or_empty()));
tcx.sess.emit_err(DuplicateValuesFor { span: attr.span(), name: attr.name_or_empty() });

return Err(());
}
Expand All @@ -387,8 +389,7 @@ impl RustcMirAttrs {
*field = Some(mapper(s)?);
Ok(())
} else {
tcx.sess
.span_err(attr.span(), &format!("`{}` requires an argument", attr.name_or_empty()));
tcx.sess.emit_err(RequiresAnArgument { span: attr.span(), name: attr.name_or_empty() });
Err(())
}
}
Expand Down
3 changes: 3 additions & 0 deletions compiler/rustc_mir_dataflow/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#![feature(stmt_expr_attributes)]
#![feature(trusted_step)]
#![recursion_limit = "256"]
#![deny(rustc::untranslatable_diagnostic)]
#![deny(rustc::diagnostic_outside_of_impl)]

#[macro_use]
extern crate tracing;
Expand All @@ -33,6 +35,7 @@ use self::move_paths::MoveData;

pub mod drop_flag_effects;
pub mod elaborate_drops;
mod errors;
mod framework;
pub mod impls;
pub mod move_paths;
Expand Down
28 changes: 12 additions & 16 deletions compiler/rustc_mir_dataflow/src/rustc_peek.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ use rustc_middle::mir::MirPass;
use rustc_middle::mir::{self, Body, Local, Location};
use rustc_middle::ty::{self, Ty, TyCtxt};

use crate::errors::{
PeekArgumentNotALocal, PeekArgumentUntracked, PeekBitNotSet, PeekMustBeNotTemporary,
PeekMustBePlaceOrRefPlace, StopAfterDataFlowEndedCompilation,
};
use crate::framework::BitSetExt;
use crate::impls::{
DefinitelyInitializedPlaces, MaybeInitializedPlaces, MaybeLiveLocals, MaybeUninitializedPlaces,
Expand Down Expand Up @@ -64,7 +68,7 @@ impl<'tcx> MirPass<'tcx> for SanityCheck {
}

if has_rustc_mir_with(tcx, def_id, sym::stop_after_dataflow).is_some() {
tcx.sess.fatal("stop_after_dataflow ended compilation");
tcx.sess.emit_fatal(StopAfterDataFlowEndedCompilation);
}
}
}
Expand Down Expand Up @@ -133,9 +137,7 @@ pub fn sanity_check_via_rustc_peek<'tcx, A>(
}

_ => {
let msg = "rustc_peek: argument expression \
must be either `place` or `&place`";
tcx.sess.span_err(call.span, msg);
tcx.sess.emit_err(PeekMustBePlaceOrRefPlace { span: call.span });
}
}
}
Expand Down Expand Up @@ -204,18 +206,12 @@ impl PeekCall {
if let Some(local) = place.as_local() {
local
} else {
tcx.sess.diagnostic().span_err(
span,
"dataflow::sanity_check cannot feed a non-temp to rustc_peek.",
);
tcx.sess.emit_err(PeekMustBeNotTemporary { span });
return None;
}
}
_ => {
tcx.sess.diagnostic().span_err(
span,
"dataflow::sanity_check cannot feed a non-temp to rustc_peek.",
);
tcx.sess.emit_err(PeekMustBeNotTemporary { span });
return None;
}
};
Expand Down Expand Up @@ -255,12 +251,12 @@ where
let bit_state = flow_state.contains(peek_mpi);
debug!("rustc_peek({:?} = &{:?}) bit_state: {}", call.arg, place, bit_state);
if !bit_state {
tcx.sess.span_err(call.span, "rustc_peek: bit not set");
tcx.sess.emit_err(PeekBitNotSet { span: call.span });
}
}

LookupResult::Parent(..) => {
tcx.sess.span_err(call.span, "rustc_peek: argument untracked");
tcx.sess.emit_err(PeekArgumentUntracked { span: call.span });
}
}
}
Expand All @@ -276,12 +272,12 @@ impl<'tcx> RustcPeekAt<'tcx> for MaybeLiveLocals {
) {
info!(?place, "peek_at");
let Some(local) = place.as_local() else {
tcx.sess.span_err(call.span, "rustc_peek: argument was not a local");
tcx.sess.emit_err(PeekArgumentNotALocal { span: call.span });
return;
};

if !flow_state.contains(local) {
tcx.sess.span_err(call.span, "rustc_peek: bit not set");
tcx.sess.emit_err(PeekBitNotSet { span: call.span });
}
}
}

0 comments on commit ee2b161

Please sign in to comment.