Rollup merge of #99795 - compiler-errors:delay-specialization-normalize-error, r=spastorino
Delay a bug when failed to normalize trait ref during specialization The error messages still kinda suck here but they don't ICE anymore... Fixes #45814 Fixes #43037 r? types
This commit is contained in:
commit
02fcec2ac8
5 changed files with 64 additions and 4 deletions
|
@ -151,8 +151,6 @@ pub(super) fn specializes(tcx: TyCtxt<'_>, (impl1_def_id, impl2_def_id): (DefId,
|
||||||
|
|
||||||
// Create an infcx, taking the predicates of impl1 as assumptions:
|
// Create an infcx, taking the predicates of impl1 as assumptions:
|
||||||
tcx.infer_ctxt().enter(|infcx| {
|
tcx.infer_ctxt().enter(|infcx| {
|
||||||
// Normalize the trait reference. The WF rules ought to ensure
|
|
||||||
// that this always succeeds.
|
|
||||||
let impl1_trait_ref = match traits::fully_normalize(
|
let impl1_trait_ref = match traits::fully_normalize(
|
||||||
&infcx,
|
&infcx,
|
||||||
FulfillmentContext::new(),
|
FulfillmentContext::new(),
|
||||||
|
@ -161,8 +159,12 @@ pub(super) fn specializes(tcx: TyCtxt<'_>, (impl1_def_id, impl2_def_id): (DefId,
|
||||||
impl1_trait_ref,
|
impl1_trait_ref,
|
||||||
) {
|
) {
|
||||||
Ok(impl1_trait_ref) => impl1_trait_ref,
|
Ok(impl1_trait_ref) => impl1_trait_ref,
|
||||||
Err(err) => {
|
Err(_errors) => {
|
||||||
bug!("failed to fully normalize {:?}: {:?}", impl1_trait_ref, err);
|
tcx.sess.delay_span_bug(
|
||||||
|
tcx.def_span(impl1_def_id),
|
||||||
|
format!("failed to fully normalize {impl1_trait_ref}"),
|
||||||
|
);
|
||||||
|
impl1_trait_ref
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
20
src/test/ui/specialization/issue-43037.rs
Normal file
20
src/test/ui/specialization/issue-43037.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#![feature(specialization)]
|
||||||
|
#![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/specialization/issue-43037.stderr
Normal file
12
src/test/ui/specialization/issue-43037.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-43037.rs:17: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`.
|
12
src/test/ui/specialization/issue-45814.rs
Normal file
12
src/test/ui/specialization/issue-45814.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
//~ ERROR overflow evaluating the requirement `T: Trait<_>`
|
||||||
|
|
||||||
|
#![feature(specialization)]
|
||||||
|
#![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/specialization/issue-45814.stderr
Normal file
14
src/test/ui/specialization/issue-45814.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_45814`)
|
||||||
|
note: required because of the requirements on the impl of `Trait<_>` for `T`
|
||||||
|
--> $DIR/issue-45814.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`.
|
Loading…
Add table
Add a link
Reference in a new issue