mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Migrate some rustc_borrowck diagnostics to SessionDiagnostic
This commit is contained in:
parent
8308806403
commit
98af1bfecc
@ -3595,6 +3595,7 @@ dependencies = [
|
||||
"rustc_index",
|
||||
"rustc_infer",
|
||||
"rustc_lexer",
|
||||
"rustc_macros",
|
||||
"rustc_middle",
|
||||
"rustc_mir_dataflow",
|
||||
"rustc_serialize",
|
||||
|
@ -19,6 +19,7 @@ rustc_hir = { path = "../rustc_hir" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
rustc_infer = { path = "../rustc_infer" }
|
||||
rustc_lexer = { path = "../rustc_lexer" }
|
||||
rustc_macros = { path = "../rustc_macros" }
|
||||
rustc_middle = { path = "../rustc_middle" }
|
||||
rustc_const_eval = { path = "../rustc_const_eval" }
|
||||
rustc_mir_dataflow = { path = "../rustc_mir_dataflow" }
|
||||
|
@ -19,6 +19,9 @@ use std::fmt;
|
||||
use std::rc::Rc;
|
||||
|
||||
use crate::region_infer::values::RegionElement;
|
||||
use crate::session_diagnostics::HigherRankedErrorCause;
|
||||
use crate::session_diagnostics::HigherRankedLifetimeError;
|
||||
use crate::session_diagnostics::HigherRankedSubtypeError;
|
||||
use crate::MirBorrowckCtxt;
|
||||
|
||||
#[derive(Clone)]
|
||||
@ -69,7 +72,7 @@ impl<'tcx> UniverseInfo<'tcx> {
|
||||
// up in the existing UI tests. Consider investigating this
|
||||
// some more.
|
||||
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>,
|
||||
span: Span,
|
||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||
let mut err = tcx.sess.struct_span_err(span, "higher-ranked lifetime error");
|
||||
err.note(&format!("could not prove {}", self.canonical_query.value.value.predicate));
|
||||
err
|
||||
tcx.sess.create_err(HigherRankedLifetimeError {
|
||||
cause: Some(HigherRankedErrorCause::CouldNotProve {
|
||||
predicate: self.canonical_query.value.value.predicate.to_string(),
|
||||
}),
|
||||
span,
|
||||
})
|
||||
}
|
||||
|
||||
fn base_universe(&self) -> ty::UniverseIndex {
|
||||
@ -263,9 +269,12 @@ where
|
||||
tcx: TyCtxt<'tcx>,
|
||||
span: Span,
|
||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||
let mut err = tcx.sess.struct_span_err(span, "higher-ranked lifetime error");
|
||||
err.note(&format!("could not normalize `{}`", self.canonical_query.value.value.value));
|
||||
err
|
||||
tcx.sess.create_err(HigherRankedLifetimeError {
|
||||
cause: Some(HigherRankedErrorCause::CouldNotNormalize {
|
||||
value: self.canonical_query.value.value.value.to_string(),
|
||||
}),
|
||||
span,
|
||||
})
|
||||
}
|
||||
|
||||
fn base_universe(&self) -> ty::UniverseIndex {
|
||||
@ -326,7 +335,7 @@ impl<'tcx> TypeOpInfo<'tcx> for AscribeUserTypeQuery<'tcx> {
|
||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||
// 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.
|
||||
tcx.sess.struct_span_err(span, "higher-ranked lifetime error")
|
||||
tcx.sess.create_err(HigherRankedLifetimeError { cause: None, span })
|
||||
}
|
||||
|
||||
fn base_universe(&self) -> ty::UniverseIndex {
|
||||
@ -366,7 +375,7 @@ impl<'tcx> TypeOpInfo<'tcx> for crate::type_check::InstantiateOpaqueType<'tcx> {
|
||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||
// 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.
|
||||
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 {
|
||||
|
@ -24,6 +24,7 @@ use rustc_span::symbol::Ident;
|
||||
use rustc_span::Span;
|
||||
|
||||
use crate::borrowck_errors;
|
||||
use crate::session_diagnostics::GenericDoesNotLiveLongEnough;
|
||||
|
||||
use super::{OutlivesSuggestionBuilder, RegionName};
|
||||
use crate::region_infer::BlameConstraint;
|
||||
@ -196,9 +197,11 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||
// to report it; we could probably handle it by
|
||||
// iterating over the universal regions and reporting
|
||||
// an error that multiple bounds are required.
|
||||
self.buffer_error(self.infcx.tcx.sess.struct_span_err(
|
||||
type_test_span,
|
||||
&format!("`{}` does not live long enough", type_test.generic_kind),
|
||||
self.buffer_error(self.infcx.tcx.sess.create_err(
|
||||
GenericDoesNotLiveLongEnough {
|
||||
kind: type_test.generic_kind.to_string(),
|
||||
span: type_test_span,
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
|
@ -76,6 +76,7 @@ mod places_conflict;
|
||||
mod prefixes;
|
||||
mod region_infer;
|
||||
mod renumber;
|
||||
mod session_diagnostics;
|
||||
mod type_check;
|
||||
mod universal_regions;
|
||||
mod used_muts;
|
||||
|
44
compiler/rustc_borrowck/src/session_diagnostics.rs
Normal file
44
compiler/rustc_borrowck/src/session_diagnostics.rs
Normal 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,
|
||||
}
|
@ -9,7 +9,6 @@ use hir::OpaqueTyOrigin;
|
||||
use rustc_data_structures::frozen::Frozen;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_data_structures::vec_map::VecMap;
|
||||
use rustc_errors::struct_span_err;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::DefKind;
|
||||
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::ResultsCursor;
|
||||
|
||||
use crate::session_diagnostics::MoveUnsized;
|
||||
use crate::{
|
||||
borrow_set::BorrowSet,
|
||||
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
|
||||
// to check all temps, return slots and locals.
|
||||
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
|
||||
// an NLL error, it's a required check to prevent creation
|
||||
// of unsized rvalues in a call expression.
|
||||
diag.emit();
|
||||
self.tcx().sess.emit_err(MoveUnsized { ty, span });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
18
compiler/rustc_error_messages/locales/en-US/borrowck.ftl
Normal file
18
compiler/rustc_error_messages/locales/en-US/borrowck.ftl
Normal 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
|
@ -35,6 +35,7 @@ fluent_messages! {
|
||||
privacy => "../locales/en-US/privacy.ftl",
|
||||
typeck => "../locales/en-US/typeck.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};
|
||||
|
@ -281,9 +281,19 @@ pub trait Emitter {
|
||||
let message = bundle.get_message(&identifier).expect("missing diagnostic in fluent bundle");
|
||||
let value = match 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![];
|
||||
|
@ -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
|
||||
|
|
||||
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
|
||||
|
|
||||
LL | T[0];
|
||||
| ^^^^
|
||||
| ^^^^ the size of `dyn Debug` cannot be statically determined
|
||||
|
||||
error[E0507]: cannot move out of index of `S`
|
||||
--> $DIR/dst-index.rs:31:5
|
||||
|
@ -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
|
||||
|
|
||||
LL | x.f();
|
||||
| ^^^^^
|
||||
| ^^^^^ the size of `dyn Bar` cannot be statically determined
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,7 +4,7 @@ error: higher-ranked lifetime error
|
||||
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
|
||||
--> $DIR/issue-59311.rs:17:9
|
||||
@ -12,7 +12,7 @@ error: higher-ranked lifetime error
|
||||
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
|
||||
|
||||
|
@ -4,7 +4,7 @@ error: higher-ranked lifetime error
|
||||
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
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
struct Bug {
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
|
||||
LL | A: [(); { *"" }.len()],
|
||||
| ^^^^^^^
|
||||
| ^^^^^^^ the size of `str` cannot be statically determined
|
||||
|
||||
error[E0507]: cannot move out of a shared reference
|
||||
--> $DIR/issue-67947.rs:2:15
|
||||
|
@ -12,7 +12,7 @@ trait Baz {
|
||||
}
|
||||
|
||||
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() { }
|
||||
|
@ -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
|
||||
|
|
||||
LL | t.bar()
|
||||
| ^^^^^^^
|
||||
| ^^^^^^^ the size of `dyn Bar` cannot be statically determined
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -7,7 +7,7 @@ trait Foo {
|
||||
fn foo(f: Option<&dyn Foo>) {
|
||||
if let Some(f) = f {
|
||||
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]`
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
|
||||
LL | let _ = f.foo();
|
||||
| ^^^^^^^
|
||||
| ^^^^^^^ the size of `[u8]` cannot be statically determined
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user