diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2020-08-01 08:02:12 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-01 08:02:12 +0900 |
| commit | 3ad6feda56d4033a498e20c2d385147fe411678f (patch) | |
| tree | 26942eb99a26384da18915d2efee52b3eea548a1 | |
| parent | ff5ccc82eb58d76f5f4335dad4642becd1c69539 (diff) | |
| parent | 96b5dee9ab3b4b0c8f5086011b7a15b7c4aed48c (diff) | |
Rollup merge of #74991 - JulianKnodt:74199, r=lcnr
Fix Const-Generic Cycle ICE #74199 This PR intends to fix the bug in Issue #74199 by following the suggestion provided of ignoring the error that causes the ICE. This does not fix the underlying cycle detection issue, but fixes the ICE. Also adds a test to check that it doesn't causes an ICE but returns a valid error for now. r? @lcnr Edit: Also it's funny how this PR number is an anagram of the issue number
| -rw-r--r-- | src/librustc_typeck/variance/constraints.rs | 1 | ||||
| -rw-r--r-- | src/test/ui/const-generics/nested-type.rs | 18 | ||||
| -rw-r--r-- | src/test/ui/const-generics/nested-type.stderr | 159 |
3 files changed, 178 insertions, 0 deletions
diff --git a/src/librustc_typeck/variance/constraints.rs b/src/librustc_typeck/variance/constraints.rs index cae09267994..b810c9824ce 100644 --- a/src/librustc_typeck/variance/constraints.rs +++ b/src/librustc_typeck/variance/constraints.rs @@ -161,6 +161,7 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> { self.add_constraints_from_sig(current_item, tcx.fn_sig(def_id), self.covariant); } + ty::Error(_) => {} _ => { span_bug!( tcx.def_span(def_id), diff --git a/src/test/ui/const-generics/nested-type.rs b/src/test/ui/const-generics/nested-type.rs new file mode 100644 index 00000000000..12ea850c8f6 --- /dev/null +++ b/src/test/ui/const-generics/nested-type.rs @@ -0,0 +1,18 @@ +#![feature(const_generics)] +#![allow(incomplete_features)] + +struct Foo<const N: [u8; { +//~^ ERROR cycle detected +//~| ERROR cycle detected + struct Foo<const N: usize>; + + impl<const N: usize> Foo<N> { + fn value() -> usize { + N + } + } + + Foo::<17>::value() +}]>; + +fn main() {} diff --git a/src/test/ui/const-generics/nested-type.stderr b/src/test/ui/const-generics/nested-type.stderr new file mode 100644 index 00000000000..da0e8032404 --- /dev/null +++ b/src/test/ui/const-generics/nested-type.stderr @@ -0,0 +1,159 @@ +error[E0391]: cycle detected when computing type of `Foo` + --> $DIR/nested-type.rs:4:1 + | +LL | struct Foo<const N: [u8; { + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: ...which requires computing type of `Foo::N`... + --> $DIR/nested-type.rs:4:18 + | +LL | struct Foo<const N: [u8; { + | ^ +note: ...which requires const-evaluating + checking `Foo::{{constant}}#0`... + --> $DIR/nested-type.rs:4:26 + | +LL | struct Foo<const N: [u8; { + | __________________________^ +LL | | +LL | | +LL | | struct Foo<const N: usize>; +... | +LL | | Foo::<17>::value() +LL | | }]>; + | |_^ +note: ...which requires const-evaluating + checking `Foo::{{constant}}#0`... + --> $DIR/nested-type.rs:4:26 + | +LL | struct Foo<const N: [u8; { + | __________________________^ +LL | | +LL | | +LL | | struct Foo<const N: usize>; +... | +LL | | Foo::<17>::value() +LL | | }]>; + | |_^ +note: ...which requires const-evaluating `Foo::{{constant}}#0`... + --> $DIR/nested-type.rs:4:26 + | +LL | struct Foo<const N: [u8; { + | __________________________^ +LL | | +LL | | +LL | | struct Foo<const N: usize>; +... | +LL | | Foo::<17>::value() +LL | | }]>; + | |_^ +note: ...which requires type-checking `Foo::{{constant}}#0`... + --> $DIR/nested-type.rs:4:26 + | +LL | struct Foo<const N: [u8; { + | __________________________^ +LL | | +LL | | +LL | | struct Foo<const N: usize>; +... | +LL | | Foo::<17>::value() +LL | | }]>; + | |_^ +note: ...which requires computing the variances of `Foo::{{constant}}#0::Foo`... + --> $DIR/nested-type.rs:7:5 + | +LL | struct Foo<const N: usize>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: ...which requires computing the variances for items in this crate... + = note: ...which again requires computing type of `Foo`, completing the cycle +note: cycle used when collecting item types in top-level module + --> $DIR/nested-type.rs:1:1 + | +LL | / #![feature(const_generics)] +LL | | #![allow(incomplete_features)] +LL | | +LL | | struct Foo<const N: [u8; { +... | +LL | | +LL | | fn main() {} + | |____________^ + +error[E0391]: cycle detected when computing type of `Foo` + --> $DIR/nested-type.rs:4:1 + | +LL | struct Foo<const N: [u8; { + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: ...which requires computing type of `Foo::N`... + --> $DIR/nested-type.rs:4:18 + | +LL | struct Foo<const N: [u8; { + | ^ +note: ...which requires const-evaluating + checking `Foo::{{constant}}#0`... + --> $DIR/nested-type.rs:4:26 + | +LL | struct Foo<const N: [u8; { + | __________________________^ +LL | | +LL | | +LL | | struct Foo<const N: usize>; +... | +LL | | Foo::<17>::value() +LL | | }]>; + | |_^ +note: ...which requires const-evaluating + checking `Foo::{{constant}}#0`... + --> $DIR/nested-type.rs:4:26 + | +LL | struct Foo<const N: [u8; { + | __________________________^ +LL | | +LL | | +LL | | struct Foo<const N: usize>; +... | +LL | | Foo::<17>::value() +LL | | }]>; + | |_^ +note: ...which requires const-evaluating `Foo::{{constant}}#0`... + --> $DIR/nested-type.rs:4:26 + | +LL | struct Foo<const N: [u8; { + | __________________________^ +LL | | +LL | | +LL | | struct Foo<const N: usize>; +... | +LL | | Foo::<17>::value() +LL | | }]>; + | |_^ +note: ...which requires type-checking `Foo::{{constant}}#0`... + --> $DIR/nested-type.rs:4:26 + | +LL | struct Foo<const N: [u8; { + | __________________________^ +LL | | +LL | | +LL | | struct Foo<const N: usize>; +... | +LL | | Foo::<17>::value() +LL | | }]>; + | |_^ +note: ...which requires computing the variances of `Foo::{{constant}}#0::Foo`... + --> $DIR/nested-type.rs:7:5 + | +LL | struct Foo<const N: usize>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: ...which requires computing the variances for items in this crate... + = note: ...which again requires computing type of `Foo`, completing the cycle +note: cycle used when collecting item types in top-level module + --> $DIR/nested-type.rs:1:1 + | +LL | / #![feature(const_generics)] +LL | | #![allow(incomplete_features)] +LL | | +LL | | struct Foo<const N: [u8; { +... | +LL | | +LL | | fn main() {} + | |____________^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0391`. |
