Delay span bug when failing to normalize negative coherence impl subject due to other malformed impls
This commit is contained in:
parent
75b7e52e92
commit
c436930f91
@ -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.
|
||||
|
12
src/test/ui/coherence/issue-100191-2.rs
Normal file
12
src/test/ui/coherence/issue-100191-2.rs
Normal file
@ -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() {}
|
14
src/test/ui/coherence/issue-100191-2.stderr
Normal file
14
src/test/ui/coherence/issue-100191-2.stderr
Normal file
@ -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`.
|
21
src/test/ui/coherence/issue-100191.rs
Normal file
21
src/test/ui/coherence/issue-100191.rs
Normal file
@ -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() {}
|
12
src/test/ui/coherence/issue-100191.stderr
Normal file
12
src/test/ui/coherence/issue-100191.stderr
Normal file
@ -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`.
|
Loading…
Reference in New Issue
Block a user