Migrate rustc_mir_dataflow to diagnostic structs
This commit is contained in:
parent
38528d4dc0
commit
ee2b16100e
8 changed files with 129 additions and 22 deletions
71
compiler/rustc_mir_dataflow/src/errors.rs
Normal file
71
compiler/rustc_mir_dataflow/src/errors.rs
Normal file
|
@ -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,
|
||||
}
|
|
@ -1,5 +1,8 @@
|
|||
//! A solver for dataflow problems.
|
||||
|
||||
use crate::errors::{
|
||||
DuplicateValuesFor, PathMustEndInFilename, RequiresAnArgument, UnknownFormatter,
|
||||
};
|
||||
use crate::framework::BitSetExt;
|
||||
|
||||
use std::ffi::OsString;
|
||||
|
@ -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(())
|
||||
}
|
||||
}
|
||||
|
@ -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(())
|
||||
}
|
||||
})
|
||||
|
@ -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(());
|
||||
}
|
||||
|
@ -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(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
@ -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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue