Don't ICE when auto trait has assoc ty in old solver

This commit is contained in:
Michael Goulet 2024-07-24 17:19:41 -04:00
parent 2ccafed862
commit 0919d0714e
6 changed files with 103 additions and 23 deletions

View File

@ -1202,6 +1202,12 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
false
}
}
} else if tcx.trait_is_auto(trait_ref.def_id) {
tcx.dcx().span_delayed_bug(
tcx.def_span(obligation.predicate.def_id),
"associated types not allowed on auto traits",
);
false
} else {
bug!("unexpected builtin trait with associated type: {trait_ref:?}")
}

View File

@ -1,14 +0,0 @@
//@ known-bug: #117829
#![feature(auto_traits)]
trait B {}
auto trait Z<T>
where
T: Z<u16>,
<T as Z<u16>>::W: B,
{
type W;
}
fn main() {}

View File

@ -1,9 +0,0 @@
//@ known-bug: #117829
auto trait Z<'a, T: ?Sized>
where
T: Z<'a, u16>,
for<'b> <T as Z<'b, u16>>::W: Clone,
{
type W: ?Sized;
}

View File

@ -0,0 +1,40 @@
error[E0380]: auto traits cannot have associated items
--> $DIR/assoc-ty.rs:10:10
|
LL | auto trait Trait {
| ----- auto traits cannot have associated items
LL |
LL | type Output;
| -----^^^^^^- help: remove these associated items
error[E0658]: auto traits are experimental and possibly buggy
--> $DIR/assoc-ty.rs:8:1
|
LL | / auto trait Trait {
LL | |
LL | | type Output;
LL | |
LL | | }
| |_^
|
= note: see issue #13231 <https://github.com/rust-lang/rust/issues/13231> for more information
= help: add `#![feature(auto_traits)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0308]: mismatched types
--> $DIR/assoc-ty.rs:15:36
|
LL | let _: <() as Trait>::Output = ();
| --------------------- ^^ expected associated type, found `()`
| |
| expected due to this
|
= note: expected associated type `<() as Trait>::Output`
found unit type `()`
= help: consider constraining the associated type `<() as Trait>::Output` to `()` or calling a method that returns `<() as Trait>::Output`
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
error: aborting due to 3 previous errors
Some errors have detailed explanations: E0308, E0380, E0658.
For more information about an error, try `rustc --explain E0308`.

View File

@ -0,0 +1,40 @@
error[E0380]: auto traits cannot have associated items
--> $DIR/assoc-ty.rs:10:10
|
LL | auto trait Trait {
| ----- auto traits cannot have associated items
LL |
LL | type Output;
| -----^^^^^^- help: remove these associated items
error[E0658]: auto traits are experimental and possibly buggy
--> $DIR/assoc-ty.rs:8:1
|
LL | / auto trait Trait {
LL | |
LL | | type Output;
LL | |
LL | | }
| |_^
|
= note: see issue #13231 <https://github.com/rust-lang/rust/issues/13231> for more information
= help: add `#![feature(auto_traits)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0308]: mismatched types
--> $DIR/assoc-ty.rs:15:36
|
LL | let _: <() as Trait>::Output = ();
| --------------------- ^^ types differ
| |
| expected due to this
|
= note: expected associated type `<() as Trait>::Output`
found unit type `()`
= help: consider constraining the associated type `<() as Trait>::Output` to `()` or calling a method that returns `<() as Trait>::Output`
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
error: aborting due to 3 previous errors
Some errors have detailed explanations: E0308, E0380, E0658.
For more information about an error, try `rustc --explain E0308`.

View File

@ -0,0 +1,17 @@
//@ revisions: current next
//@[next] compile-flags: -Znext-solver
//@ ignore-compare-mode-next-solver (explicit revisions)
// Tests that projection doesn't explode if we accidentally
// put an associated type on an auto trait.
auto trait Trait {
//~^ ERROR auto traits are experimental and possibly buggy
type Output;
//~^ ERROR auto traits cannot have associated items
}
fn main() {
let _: <() as Trait>::Output = ();
//~^ ERROR mismatched types
}