Skip to content

Commit

Permalink
Rollup merge of #98415 - compiler-errors:rustc-borrowck-session-diagn…
Browse files Browse the repository at this point in the history
…ostic-1, r=davidtwco

Migrate some `rustc_borrowck` diagnostics to `SessionDiagnostic`

Self-explanatory

r? ```@davidtwco```
  • Loading branch information
Dylan-DPC committed Jun 29, 2022
2 parents 66c83ff + 98af1bf commit d10497b
Show file tree
Hide file tree
Showing 20 changed files with 122 additions and 43 deletions.
1 change: 1 addition & 0 deletions Cargo.lock
Expand Up @@ -3595,6 +3595,7 @@ dependencies = [
"rustc_index",
"rustc_infer",
"rustc_lexer",
"rustc_macros",
"rustc_middle",
"rustc_mir_dataflow",
"rustc_serialize",
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_borrowck/Cargo.toml
Expand Up @@ -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" }
Expand Down
27 changes: 18 additions & 9 deletions compiler/rustc_borrowck/src/diagnostics/bound_region_errors.rs
Expand Up @@ -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)]
Expand Down Expand Up @@ -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 }),
);
}
}
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
9 changes: 6 additions & 3 deletions compiler/rustc_borrowck/src/diagnostics/region_errors.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
},
));
}
}
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_borrowck/src/lib.rs
Expand Up @@ -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;
Expand Down
44 changes: 44 additions & 0 deletions compiler/rustc_borrowck/src/session_diagnostics.rs
@@ -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,
}
13 changes: 2 additions & 11 deletions compiler/rustc_borrowck/src/type_check/mod.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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},
Expand Down Expand Up @@ -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 });
}
}
}
Expand Down
18 changes: 18 additions & 0 deletions compiler/rustc_error_messages/locales/en-US/borrowck.ftl
@@ -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
1 change: 1 addition & 0 deletions compiler/rustc_error_messages/src/lib.rs
Expand Up @@ -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};
Expand Down
14 changes: 12 additions & 2 deletions compiler/rustc_errors/src/emitter.rs
Expand Up @@ -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![];
Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/dst/dst-index.stderr
@@ -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
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/error-codes/E0161.base.stderr
@@ -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

Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/higher-rank-trait-bounds/issue-59311.stderr
Expand Up @@ -4,15 +4,15 @@ 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
|
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

2 changes: 1 addition & 1 deletion src/test/ui/lifetimes/re-empty-in-error.stderr
Expand Up @@ -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

2 changes: 1 addition & 1 deletion src/test/ui/mir/issue-67947.rs
@@ -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
}

Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/mir/issue-67947.stderr
@@ -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
Expand Down
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/unsized/return-unsized-from-trait-method.rs
Expand Up @@ -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]`
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/unsized/return-unsized-from-trait-method.stderr
@@ -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

Expand Down

0 comments on commit d10497b

Please sign in to comment.