Skip to content

Commit

Permalink
Rollup merge of #100514 - compiler-errors:issue-100191, r=spastorino
Browse files Browse the repository at this point in the history
Delay span bug when failing to normalize negative coherence impl subject due to other malformed impls

Fixes #100191

r? ``@spastorino``
  • Loading branch information
matthiaskrgr authored Aug 15, 2022
2 parents e369ec8 + c436930 commit a1fdea2
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 1 deletion.
8 changes: 7 additions & 1 deletion compiler/rustc_trait_selection/src/traits/coherence.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/coherence/issue-100191-2.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 14 additions & 0 deletions src/test/ui/coherence/issue-100191-2.stderr
Original file line number Diff line number Diff line change
@@ -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 changes: 21 additions & 0 deletions src/test/ui/coherence/issue-100191.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 12 additions & 0 deletions src/test/ui/coherence/issue-100191.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit a1fdea2

Please sign in to comment.