improve normalize cycle error
This commit is contained in:
parent
d7ecc8c9bc
commit
6c4d5d9896
5 changed files with 31 additions and 21 deletions
|
|
@ -1117,7 +1117,7 @@ rustc_queries! {
|
|||
query normalize_generic_arg_after_erasing_regions(
|
||||
goal: ParamEnvAnd<'tcx, GenericArg<'tcx>>
|
||||
) -> GenericArg<'tcx> {
|
||||
desc { "normalizing `{:?}`", goal }
|
||||
desc { "normalizing `{}`", goal.value }
|
||||
}
|
||||
|
||||
query implied_outlives_bounds(
|
||||
|
|
|
|||
|
|
@ -94,14 +94,12 @@ impl TypeFolder<'tcx> for NormalizeAfterErasingRegionsFolder<'tcx> {
|
|||
}
|
||||
|
||||
fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
self.tcx
|
||||
.normalize_generic_arg_after_erasing_regions(self.param_env.and(ty.into()))
|
||||
.expect_ty()
|
||||
let arg = self.param_env.and(ty.into());
|
||||
self.tcx.normalize_generic_arg_after_erasing_regions(arg).expect_ty()
|
||||
}
|
||||
|
||||
fn fold_const(&mut self, c: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> {
|
||||
self.tcx
|
||||
.normalize_generic_arg_after_erasing_regions(self.param_env.and(c.into()))
|
||||
.expect_const()
|
||||
let arg = self.param_env.and(c.into());
|
||||
self.tcx.normalize_generic_arg_after_erasing_regions(arg).expect_const()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
// build-fail
|
||||
//~^ ERROR cycle detected when normalizing `<() as Tr>::A`
|
||||
|
||||
// Cyclic assoc. const defaults don't error unless *used*
|
||||
trait Tr {
|
||||
const A: u8 = Self::B;
|
||||
//~^ ERROR cycle detected when const-evaluating + checking `Tr::A`
|
||||
|
||||
const B: u8 = Self::A;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,30 +1,42 @@
|
|||
error[E0391]: cycle detected when const-evaluating + checking `Tr::A`
|
||||
--> $DIR/defaults-cyclic-fail.rs:5:5
|
||||
error[E0391]: cycle detected when normalizing `<() as Tr>::A`
|
||||
|
|
||||
note: ...which requires const-evaluating + checking `Tr::A`...
|
||||
--> $DIR/defaults-cyclic-fail.rs:6:5
|
||||
|
|
||||
LL | const A: u8 = Self::B;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: ...which requires const-evaluating `Tr::A`...
|
||||
--> $DIR/defaults-cyclic-fail.rs:5:19
|
||||
note: ...which requires const-evaluating + checking `Tr::A`...
|
||||
--> $DIR/defaults-cyclic-fail.rs:6:5
|
||||
|
|
||||
LL | const A: u8 = Self::B;
|
||||
| ^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires const-evaluating `Tr::A`...
|
||||
--> $DIR/defaults-cyclic-fail.rs:6:5
|
||||
|
|
||||
LL | const A: u8 = Self::B;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: ...which requires normalizing `<() as Tr>::B`...
|
||||
note: ...which requires const-evaluating + checking `Tr::B`...
|
||||
--> $DIR/defaults-cyclic-fail.rs:8:5
|
||||
|
|
||||
LL | const B: u8 = Self::A;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires const-evaluating + checking `Tr::B`...
|
||||
--> $DIR/defaults-cyclic-fail.rs:8:5
|
||||
|
|
||||
LL | const B: u8 = Self::A;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...which requires const-evaluating `Tr::B`...
|
||||
--> $DIR/defaults-cyclic-fail.rs:8:19
|
||||
--> $DIR/defaults-cyclic-fail.rs:8:5
|
||||
|
|
||||
LL | const B: u8 = Self::A;
|
||||
| ^^^^^^^
|
||||
= note: ...which again requires const-evaluating + checking `Tr::A`, completing the cycle
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: ...which again requires normalizing `<() as Tr>::A`, completing the cycle
|
||||
note: cycle used when const-evaluating `main`
|
||||
--> $DIR/defaults-cyclic-fail.rs:16:16
|
||||
--> $DIR/defaults-cyclic-fail.rs:14:1
|
||||
|
|
||||
LL | assert_eq!(<() as Tr>::A, 0);
|
||||
| ^^^^^^^^^^^^^
|
||||
LL | fn main() {
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ note: ...which requires const-evaluating + checking `std::intrinsics::size_of`..
|
|||
LL | pub fn size_of<T>() -> usize;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: ...which requires computing layout of `Foo`...
|
||||
= note: ...which requires normalizing `ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: All, def_id: None }, value: [u8; _] }`...
|
||||
= note: ...which requires normalizing `[u8; _]`...
|
||||
= note: ...which again requires const-evaluating + checking `Foo::bytes::{{constant}}#0`, completing the cycle
|
||||
note: cycle used when processing `Foo`
|
||||
--> $DIR/const-size_of-cycle.rs:7:1
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue