Migrate some rustc_borrowck diagnostics to SessionDiagnostic

This commit is contained in:
Michael Goulet 2022-06-22 21:43:01 -07:00
parent 8308806403
commit 98af1bfecc
20 changed files with 122 additions and 43 deletions

View File

@ -3595,6 +3595,7 @@ dependencies = [
"rustc_index", "rustc_index",
"rustc_infer", "rustc_infer",
"rustc_lexer", "rustc_lexer",
"rustc_macros",
"rustc_middle", "rustc_middle",
"rustc_mir_dataflow", "rustc_mir_dataflow",
"rustc_serialize", "rustc_serialize",

View File

@ -19,6 +19,7 @@ rustc_hir = { path = "../rustc_hir" }
rustc_index = { path = "../rustc_index" } rustc_index = { path = "../rustc_index" }
rustc_infer = { path = "../rustc_infer" } rustc_infer = { path = "../rustc_infer" }
rustc_lexer = { path = "../rustc_lexer" } rustc_lexer = { path = "../rustc_lexer" }
rustc_macros = { path = "../rustc_macros" }
rustc_middle = { path = "../rustc_middle" } rustc_middle = { path = "../rustc_middle" }
rustc_const_eval = { path = "../rustc_const_eval" } rustc_const_eval = { path = "../rustc_const_eval" }
rustc_mir_dataflow = { path = "../rustc_mir_dataflow" } rustc_mir_dataflow = { path = "../rustc_mir_dataflow" }

View File

@ -19,6 +19,9 @@ use std::fmt;
use std::rc::Rc; use std::rc::Rc;
use crate::region_infer::values::RegionElement; use crate::region_infer::values::RegionElement;
use crate::session_diagnostics::HigherRankedErrorCause;
use crate::session_diagnostics::HigherRankedLifetimeError;
use crate::session_diagnostics::HigherRankedSubtypeError;
use crate::MirBorrowckCtxt; use crate::MirBorrowckCtxt;
#[derive(Clone)] #[derive(Clone)]
@ -69,7 +72,7 @@ impl<'tcx> UniverseInfo<'tcx> {
// up in the existing UI tests. Consider investigating this // up in the existing UI tests. Consider investigating this
// some more. // some more.
mbcx.buffer_error( mbcx.buffer_error(
mbcx.infcx.tcx.sess.struct_span_err(cause.span, "higher-ranked subtype error"), mbcx.infcx.tcx.sess.create_err(HigherRankedSubtypeError { span: cause.span }),
); );
} }
} }
@ -216,9 +219,12 @@ impl<'tcx> TypeOpInfo<'tcx> for PredicateQuery<'tcx> {
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
span: Span, span: Span,
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
let mut err = tcx.sess.struct_span_err(span, "higher-ranked lifetime error"); tcx.sess.create_err(HigherRankedLifetimeError {
err.note(&format!("could not prove {}", self.canonical_query.value.value.predicate)); cause: Some(HigherRankedErrorCause::CouldNotProve {
err predicate: self.canonical_query.value.value.predicate.to_string(),
}),
span,
})
} }
fn base_universe(&self) -> ty::UniverseIndex { fn base_universe(&self) -> ty::UniverseIndex {
@ -263,9 +269,12 @@ where
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
span: Span, span: Span,
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
let mut err = tcx.sess.struct_span_err(span, "higher-ranked lifetime error"); tcx.sess.create_err(HigherRankedLifetimeError {
err.note(&format!("could not normalize `{}`", self.canonical_query.value.value.value)); cause: Some(HigherRankedErrorCause::CouldNotNormalize {
err value: self.canonical_query.value.value.value.to_string(),
}),
span,
})
} }
fn base_universe(&self) -> ty::UniverseIndex { fn base_universe(&self) -> ty::UniverseIndex {
@ -326,7 +335,7 @@ impl<'tcx> TypeOpInfo<'tcx> for AscribeUserTypeQuery<'tcx> {
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
// FIXME: This error message isn't great, but it doesn't show up in the existing UI tests, // FIXME: This error message isn't great, but it doesn't show up in the existing UI tests,
// and is only the fallback when the nice error fails. Consider improving this some more. // and is only the fallback when the nice error fails. Consider improving this some more.
tcx.sess.struct_span_err(span, "higher-ranked lifetime error") tcx.sess.create_err(HigherRankedLifetimeError { cause: None, span })
} }
fn base_universe(&self) -> ty::UniverseIndex { fn base_universe(&self) -> ty::UniverseIndex {
@ -366,7 +375,7 @@ impl<'tcx> TypeOpInfo<'tcx> for crate::type_check::InstantiateOpaqueType<'tcx> {
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
// FIXME: This error message isn't great, but it doesn't show up in the existing UI tests, // FIXME: This error message isn't great, but it doesn't show up in the existing UI tests,
// and is only the fallback when the nice error fails. Consider improving this some more. // and is only the fallback when the nice error fails. Consider improving this some more.
tcx.sess.struct_span_err(span, "higher-ranked lifetime error for opaque type!") tcx.sess.create_err(HigherRankedLifetimeError { cause: None, span })
} }
fn base_universe(&self) -> ty::UniverseIndex { fn base_universe(&self) -> ty::UniverseIndex {

View File

@ -24,6 +24,7 @@ use rustc_span::symbol::Ident;
use rustc_span::Span; use rustc_span::Span;
use crate::borrowck_errors; use crate::borrowck_errors;
use crate::session_diagnostics::GenericDoesNotLiveLongEnough;
use super::{OutlivesSuggestionBuilder, RegionName}; use super::{OutlivesSuggestionBuilder, RegionName};
use crate::region_infer::BlameConstraint; use crate::region_infer::BlameConstraint;
@ -196,9 +197,11 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
// to report it; we could probably handle it by // to report it; we could probably handle it by
// iterating over the universal regions and reporting // iterating over the universal regions and reporting
// an error that multiple bounds are required. // an error that multiple bounds are required.
self.buffer_error(self.infcx.tcx.sess.struct_span_err( self.buffer_error(self.infcx.tcx.sess.create_err(
type_test_span, GenericDoesNotLiveLongEnough {
&format!("`{}` does not live long enough", type_test.generic_kind), kind: type_test.generic_kind.to_string(),
span: type_test_span,
},
)); ));
} }
} }

View File

@ -76,6 +76,7 @@ mod places_conflict;
mod prefixes; mod prefixes;
mod region_infer; mod region_infer;
mod renumber; mod renumber;
mod session_diagnostics;
mod type_check; mod type_check;
mod universal_regions; mod universal_regions;
mod used_muts; mod used_muts;

View File

@ -0,0 +1,44 @@
use rustc_macros::{SessionDiagnostic, SessionSubdiagnostic};
use rustc_middle::ty::Ty;
use rustc_span::Span;
#[derive(SessionDiagnostic)]
#[error(borrowck::move_unsized, code = "E0161")]
pub(crate) struct MoveUnsized<'tcx> {
pub ty: Ty<'tcx>,
#[primary_span]
#[label]
pub span: Span,
}
#[derive(SessionDiagnostic)]
#[error(borrowck::higher_ranked_lifetime_error)]
pub(crate) struct HigherRankedLifetimeError {
#[subdiagnostic]
pub cause: Option<HigherRankedErrorCause>,
#[primary_span]
pub span: Span,
}
#[derive(SessionSubdiagnostic)]
pub(crate) enum HigherRankedErrorCause {
#[note(borrowck::could_not_prove)]
CouldNotProve { predicate: String },
#[note(borrowck::could_not_normalize)]
CouldNotNormalize { value: String },
}
#[derive(SessionDiagnostic)]
#[error(borrowck::higher_ranked_subtype_error)]
pub(crate) struct HigherRankedSubtypeError {
#[primary_span]
pub span: Span,
}
#[derive(SessionDiagnostic)]
#[error(borrowck::generic_does_not_live_long_enough)]
pub(crate) struct GenericDoesNotLiveLongEnough {
pub kind: String,
#[primary_span]
pub span: Span,
}

View File

@ -9,7 +9,6 @@ use hir::OpaqueTyOrigin;
use rustc_data_structures::frozen::Frozen; use rustc_data_structures::frozen::Frozen;
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_data_structures::vec_map::VecMap; use rustc_data_structures::vec_map::VecMap;
use rustc_errors::struct_span_err;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
use rustc_hir::def_id::LocalDefId; use rustc_hir::def_id::LocalDefId;
@ -48,6 +47,7 @@ use rustc_mir_dataflow::impls::MaybeInitializedPlaces;
use rustc_mir_dataflow::move_paths::MoveData; use rustc_mir_dataflow::move_paths::MoveData;
use rustc_mir_dataflow::ResultsCursor; use rustc_mir_dataflow::ResultsCursor;
use crate::session_diagnostics::MoveUnsized;
use crate::{ use crate::{
borrow_set::BorrowSet, borrow_set::BorrowSet,
constraints::{OutlivesConstraint, OutlivesConstraintSet}, constraints::{OutlivesConstraint, OutlivesConstraintSet},
@ -1780,19 +1780,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
// slot or local, so to find all unsized rvalues it is enough // slot or local, so to find all unsized rvalues it is enough
// to check all temps, return slots and locals. // to check all temps, return slots and locals.
if self.reported_errors.replace((ty, span)).is_none() { if self.reported_errors.replace((ty, span)).is_none() {
let mut diag = struct_span_err!(
self.tcx().sess,
span,
E0161,
"cannot move a value of type {0}: the size of {0} \
cannot be statically determined",
ty
);
// While this is located in `nll::typeck` this error is not // While this is located in `nll::typeck` this error is not
// an NLL error, it's a required check to prevent creation // an NLL error, it's a required check to prevent creation
// of unsized rvalues in a call expression. // of unsized rvalues in a call expression.
diag.emit(); self.tcx().sess.emit_err(MoveUnsized { ty, span });
} }
} }
} }

View File

@ -0,0 +1,18 @@
borrowck-move-unsized =
cannot move a value of type `{$ty}`
.label = the size of `{$ty}` cannot be statically determined
borrowck-higher-ranked-lifetime-error =
higher-ranked lifetime error
borrowck-could-not-prove =
could not prove `{$predicate}`
borrowck-could-not-normalize =
could not normalize `{$value}`
borrowck-higher-ranked-subtype-error =
higher-ranked subtype error
generic-does-not-live-long-enough =
`{$kind}` does not live long enough

View File

@ -35,6 +35,7 @@ fluent_messages! {
privacy => "../locales/en-US/privacy.ftl", privacy => "../locales/en-US/privacy.ftl",
typeck => "../locales/en-US/typeck.ftl", typeck => "../locales/en-US/typeck.ftl",
builtin_macros => "../locales/en-US/builtin_macros.ftl", builtin_macros => "../locales/en-US/builtin_macros.ftl",
borrowck => "../locales/en-US/borrowck.ftl",
} }
pub use fluent_generated::{self as fluent, DEFAULT_LOCALE_RESOURCES}; pub use fluent_generated::{self as fluent, DEFAULT_LOCALE_RESOURCES};

View File

@ -281,9 +281,19 @@ pub trait Emitter {
let message = bundle.get_message(&identifier).expect("missing diagnostic in fluent bundle"); let message = bundle.get_message(&identifier).expect("missing diagnostic in fluent bundle");
let value = match attr { let value = match attr {
Some(attr) => { Some(attr) => {
message.get_attribute(attr).expect("missing attribute in fluent message").value() if let Some(attr) = message.get_attribute(attr) {
attr.value()
} else {
panic!("missing attribute `{attr}` in fluent message `{identifier}`")
}
}
None => {
if let Some(value) = message.value() {
value
} else {
panic!("missing value in fluent message `{identifier}`")
}
} }
None => message.value().expect("missing value in fluent message"),
}; };
let mut err = vec![]; let mut err = vec![];

View File

@ -1,14 +1,14 @@
error[E0161]: cannot move a value of type str: the size of str cannot be statically determined error[E0161]: cannot move a value of type `str`
--> $DIR/dst-index.rs:31:5 --> $DIR/dst-index.rs:31:5
| |
LL | S[0]; LL | S[0];
| ^^^^ | ^^^^ the size of `str` cannot be statically determined
error[E0161]: cannot move a value of type dyn Debug: the size of dyn Debug cannot be statically determined error[E0161]: cannot move a value of type `dyn Debug`
--> $DIR/dst-index.rs:34:5 --> $DIR/dst-index.rs:34:5
| |
LL | T[0]; LL | T[0];
| ^^^^ | ^^^^ the size of `dyn Debug` cannot be statically determined
error[E0507]: cannot move out of index of `S` error[E0507]: cannot move out of index of `S`
--> $DIR/dst-index.rs:31:5 --> $DIR/dst-index.rs:31:5

View File

@ -1,8 +1,8 @@
error[E0161]: cannot move a value of type dyn Bar: the size of dyn Bar cannot be statically determined error[E0161]: cannot move a value of type `dyn Bar`
--> $DIR/E0161.rs:16:5 --> $DIR/E0161.rs:16:5
| |
LL | x.f(); LL | x.f();
| ^^^^^ | ^^^^^ the size of `dyn Bar` cannot be statically determined
error: aborting due to previous error error: aborting due to previous error

View File

@ -4,7 +4,7 @@ error: higher-ranked lifetime error
LL | v.t(|| {}); LL | v.t(|| {});
| ^^^^^^^^^^ | ^^^^^^^^^^
| |
= note: could not prove [closure@$DIR/issue-59311.rs:17:9: 17:14] well-formed = note: could not prove `[closure@$DIR/issue-59311.rs:17:9: 17:14] well-formed`
error: higher-ranked lifetime error error: higher-ranked lifetime error
--> $DIR/issue-59311.rs:17:9 --> $DIR/issue-59311.rs:17:9
@ -12,7 +12,7 @@ error: higher-ranked lifetime error
LL | v.t(|| {}); LL | v.t(|| {});
| ^^^^^ | ^^^^^
| |
= note: could not prove for<'a> &'a V: 'static = note: could not prove `for<'a> &'a V: 'static`
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View File

@ -4,7 +4,7 @@ error: higher-ranked lifetime error
LL | foo(&10); LL | foo(&10);
| ^^^^^^^^ | ^^^^^^^^
| |
= note: could not prove for<'b, 'r> &'b (): 'r = note: could not prove `for<'b, 'r> &'b (): 'r`
error: aborting due to previous error error: aborting due to previous error

View File

@ -1,6 +1,6 @@
struct Bug { struct Bug {
A: [(); { *"" }.len()], A: [(); { *"" }.len()],
//~^ ERROR: cannot move a value of type str //~^ ERROR: cannot move a value of type `str`
//~| ERROR: cannot move out of a shared reference //~| ERROR: cannot move out of a shared reference
} }

View File

@ -1,8 +1,8 @@
error[E0161]: cannot move a value of type str: the size of str cannot be statically determined error[E0161]: cannot move a value of type `str`
--> $DIR/issue-67947.rs:2:13 --> $DIR/issue-67947.rs:2:13
| |
LL | A: [(); { *"" }.len()], LL | A: [(); { *"" }.len()],
| ^^^^^^^ | ^^^^^^^ the size of `str` cannot be statically determined
error[E0507]: cannot move out of a shared reference error[E0507]: cannot move out of a shared reference
--> $DIR/issue-67947.rs:2:15 --> $DIR/issue-67947.rs:2:15

View File

@ -12,7 +12,7 @@ trait Baz {
} }
fn use_bar(t: Box<dyn Bar>) { fn use_bar(t: Box<dyn Bar>) {
t.bar() //~ ERROR cannot move a value of type dyn Bar t.bar() //~ ERROR cannot move a value of type `dyn Bar`
} }
fn main() { } fn main() { }

View File

@ -1,8 +1,8 @@
error[E0161]: cannot move a value of type dyn Bar: the size of dyn Bar cannot be statically determined error[E0161]: cannot move a value of type `dyn Bar`
--> $DIR/object-safety-by-value-self-use.rs:15:5 --> $DIR/object-safety-by-value-self-use.rs:15:5
| |
LL | t.bar() LL | t.bar()
| ^^^^^^^ | ^^^^^^^ the size of `dyn Bar` cannot be statically determined
error: aborting due to previous error error: aborting due to previous error

View File

@ -7,7 +7,7 @@ trait Foo {
fn foo(f: Option<&dyn Foo>) { fn foo(f: Option<&dyn Foo>) {
if let Some(f) = f { if let Some(f) = f {
let _ = f.foo(); let _ = f.foo();
//~^ ERROR cannot move a value of type [u8]: the size of [u8] cannot be statically determined //~^ ERROR cannot move a value of type `[u8]`
} }
} }

View File

@ -1,8 +1,8 @@
error[E0161]: cannot move a value of type [u8]: the size of [u8] cannot be statically determined error[E0161]: cannot move a value of type `[u8]`
--> $DIR/return-unsized-from-trait-method.rs:9:17 --> $DIR/return-unsized-from-trait-method.rs:9:17
| |
LL | let _ = f.foo(); LL | let _ = f.foo();
| ^^^^^^^ | ^^^^^^^ the size of `[u8]` cannot be statically determined
error: aborting due to previous error error: aborting due to previous error