diff options
| author | Michael Goulet <michael@errs.io> | 2022-08-13 22:04:50 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-08-13 22:11:42 +0000 |
| commit | c436930f91a4befefa602f2d64d06fc9613d507b (patch) | |
| tree | 26b6b133c54ecb148de867e05c13d4134358a89a | |
| parent | 75b7e52e92c3b00fc891b47f5b2efdff0a2be55a (diff) | |
| download | rust-c436930f91a4befefa602f2d64d06fc9613d507b.tar.gz rust-c436930f91a4befefa602f2d64d06fc9613d507b.zip | |
Delay span bug when failing to normalize negative coherence impl subject due to other malformed impls
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/coherence.rs | 8 | ||||
| -rw-r--r-- | src/test/ui/coherence/issue-100191-2.rs | 12 | ||||
| -rw-r--r-- | src/test/ui/coherence/issue-100191-2.stderr | 14 | ||||
| -rw-r--r-- | src/test/ui/coherence/issue-100191.rs | 21 | ||||
| -rw-r--r-- | src/test/ui/coherence/issue-100191.stderr | 12 |
5 files changed, 66 insertions, 1 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/coherence.rs b/compiler/rustc_trait_selection/src/traits/coherence.rs index 8ab1aa65d3a..38e2500da9b 100644 --- a/compiler/rustc_trait_selection/src/traits/coherence.rs +++ b/compiler/rustc_trait_selection/src/traits/coherence.rs @@ -307,7 +307,13 @@ fn negative_impl<'cx, 'tcx>( tcx.impl_subject(impl1_def_id), ) { Ok(s) => s, - Err(err) => bug!("failed to fully normalize {:?}: {:?}", impl1_def_id, err), + Err(err) => { + tcx.sess.delay_span_bug( + tcx.def_span(impl1_def_id), + format!("failed to fully normalize {:?}: {:?}", impl1_def_id, err), + ); + return false; + } }; // Attempt to prove that impl2 applies, given all of the above. diff --git a/src/test/ui/coherence/issue-100191-2.rs b/src/test/ui/coherence/issue-100191-2.rs new file mode 100644 index 00000000000..1c8316f87fa --- /dev/null +++ b/src/test/ui/coherence/issue-100191-2.rs @@ -0,0 +1,12 @@ +//~ ERROR overflow evaluating the requirement `T: Trait<_>` + +#![feature(specialization, with_negative_coherence)] +#![allow(incomplete_features)] + +pub trait Trait<T> {} + +default impl<T, U> Trait<T> for U {} + +impl<T> Trait<<T as Iterator>::Item> for T {} + +fn main() {} diff --git a/src/test/ui/coherence/issue-100191-2.stderr b/src/test/ui/coherence/issue-100191-2.stderr new file mode 100644 index 00000000000..ea09fb15bdf --- /dev/null +++ b/src/test/ui/coherence/issue-100191-2.stderr @@ -0,0 +1,14 @@ +error[E0275]: overflow evaluating the requirement `T: Trait<_>` + | + = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_100191_2`) +note: required because of the requirements on the impl of `Trait<_>` for `T` + --> $DIR/issue-100191-2.rs:8:20 + | +LL | default impl<T, U> Trait<T> for U {} + | ^^^^^^^^ ^ + = note: 128 redundant requirements hidden + = note: required because of the requirements on the impl of `Trait<_>` for `T` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0275`. diff --git a/src/test/ui/coherence/issue-100191.rs b/src/test/ui/coherence/issue-100191.rs new file mode 100644 index 00000000000..e8597fde54d --- /dev/null +++ b/src/test/ui/coherence/issue-100191.rs @@ -0,0 +1,21 @@ +#![crate_type = "lib"] +#![feature(specialization, with_negative_coherence)] +#![allow(incomplete_features)] + +trait X {} +trait Y: X {} +trait Z { + type Assoc: Y; +} +struct A<T>(T); + +impl<T> Y for T where T: X {} +impl<T: X> Z for A<T> { + type Assoc = T; +} + +// this impl is invalid, but causes an ICE anyway +impl<T> From<<A<T> as Z>::Assoc> for T {} +//~^ ERROR type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`) + +fn main() {} diff --git a/src/test/ui/coherence/issue-100191.stderr b/src/test/ui/coherence/issue-100191.stderr new file mode 100644 index 00000000000..1adb0f1e4fa --- /dev/null +++ b/src/test/ui/coherence/issue-100191.stderr @@ -0,0 +1,12 @@ +error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`) + --> $DIR/issue-100191.rs:18:6 + | +LL | impl<T> From<<A<T> as Z>::Assoc> for T {} + | ^ type parameter `T` must be used as the type parameter for some local type + | + = note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local + = note: only traits defined in the current crate can be implemented for a type parameter + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0210`. |
