Add regression test
This commit is contained in:
parent
b6badee140
commit
d1bc941385
2 changed files with 337 additions and 0 deletions
99
src/test/ui/associated-types/issue-87261.rs
Normal file
99
src/test/ui/associated-types/issue-87261.rs
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
trait Foo {}
|
||||
|
||||
trait Trait {
|
||||
type Associated;
|
||||
}
|
||||
trait DerivedTrait: Trait {}
|
||||
trait GenericTrait<A> {
|
||||
type Associated;
|
||||
}
|
||||
|
||||
struct Impl;
|
||||
impl Foo for Impl {}
|
||||
impl Trait for Impl {
|
||||
type Associated = ();
|
||||
}
|
||||
impl DerivedTrait for Impl {}
|
||||
impl<A> GenericTrait<A> for Impl {
|
||||
type Associated = ();
|
||||
}
|
||||
|
||||
fn returns_opaque() -> impl Trait + 'static {
|
||||
Impl
|
||||
}
|
||||
fn returns_opaque_derived() -> impl DerivedTrait + 'static {
|
||||
Impl
|
||||
}
|
||||
fn returns_opaque_foo() -> impl Trait + Foo {
|
||||
Impl
|
||||
}
|
||||
fn returns_opaque_derived_foo() -> impl DerivedTrait + Foo {
|
||||
Impl
|
||||
}
|
||||
fn returns_opaque_generic() -> impl GenericTrait<()> + 'static {
|
||||
Impl
|
||||
}
|
||||
fn returns_opaque_generic_foo() -> impl GenericTrait<()> + Foo {
|
||||
Impl
|
||||
}
|
||||
fn returns_opaque_generic_duplicate() -> impl GenericTrait<()> + GenericTrait<u8> {
|
||||
Impl
|
||||
}
|
||||
|
||||
fn accepts_trait<T: Trait<Associated = ()>>(_: T) {}
|
||||
fn accepts_generic_trait<T: GenericTrait<(), Associated = ()>>(_: T) {}
|
||||
|
||||
fn check_generics<A, B, C, D, E, F, G>(a: A, b: B, c: C, d: D, e: E, f: F, g: G)
|
||||
where
|
||||
A: Trait + 'static,
|
||||
B: DerivedTrait + 'static,
|
||||
C: Trait + Foo,
|
||||
D: DerivedTrait + Foo,
|
||||
E: GenericTrait<()> + 'static,
|
||||
F: GenericTrait<()> + Foo,
|
||||
G: GenericTrait<()> + GenericTrait<u8>,
|
||||
{
|
||||
accepts_trait(a);
|
||||
//~^ ERROR type mismatch resolving `<A as Trait>::Associated == ()`
|
||||
|
||||
accepts_trait(b);
|
||||
//~^ ERROR type mismatch resolving `<B as Trait>::Associated == ()`
|
||||
|
||||
accepts_trait(c);
|
||||
//~^ ERROR type mismatch resolving `<C as Trait>::Associated == ()`
|
||||
|
||||
accepts_trait(d);
|
||||
//~^ ERROR type mismatch resolving `<D as Trait>::Associated == ()`
|
||||
|
||||
accepts_generic_trait(e);
|
||||
//~^ ERROR type mismatch resolving `<E as GenericTrait<()>>::Associated == ()`
|
||||
|
||||
accepts_generic_trait(f);
|
||||
//~^ ERROR type mismatch resolving `<F as GenericTrait<()>>::Associated == ()`
|
||||
|
||||
accepts_generic_trait(g);
|
||||
//~^ ERROR type mismatch resolving `<G as GenericTrait<()>>::Associated == ()`
|
||||
}
|
||||
|
||||
fn main() {
|
||||
accepts_trait(returns_opaque());
|
||||
//~^ ERROR type mismatch resolving `<impl Trait as Trait>::Associated == ()`
|
||||
|
||||
accepts_trait(returns_opaque_derived());
|
||||
//~^ ERROR type mismatch resolving `<impl DerivedTrait as Trait>::Associated == ()`
|
||||
|
||||
accepts_trait(returns_opaque_foo());
|
||||
//~^ ERROR type mismatch resolving `<impl Trait+Foo as Trait>::Associated == ()`
|
||||
|
||||
accepts_trait(returns_opaque_derived_foo());
|
||||
//~^ ERROR type mismatch resolving `<impl DerivedTrait+Foo as Trait>::Associated == ()`
|
||||
|
||||
accepts_generic_trait(returns_opaque_generic());
|
||||
//~^ ERROR type mismatch resolving `<impl GenericTrait<()> as GenericTrait<()>>::Associated == ()`
|
||||
|
||||
accepts_generic_trait(returns_opaque_generic_foo());
|
||||
//~^ ERROR type mismatch resolving `<impl GenericTrait<()>+Foo as GenericTrait<()>>::Associated == ()`
|
||||
|
||||
accepts_generic_trait(returns_opaque_generic_duplicate());
|
||||
//~^ ERROR type mismatch resolving `<impl GenericTrait<()>+GenericTrait<u8> as GenericTrait<()>>::Associated == ()`
|
||||
}
|
||||
238
src/test/ui/associated-types/issue-87261.stderr
Normal file
238
src/test/ui/associated-types/issue-87261.stderr
Normal file
|
|
@ -0,0 +1,238 @@
|
|||
error[E0271]: type mismatch resolving `<A as Trait>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:56:5
|
||||
|
|
||||
LL | fn accepts_trait<T: Trait<Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_trait`
|
||||
...
|
||||
LL | accepts_trait(a);
|
||||
| ^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<A as Trait>::Associated`
|
||||
help: consider constraining the associated type `<A as Trait>::Associated` to `()`
|
||||
|
|
||||
LL | A: Trait<Associated = ()> + 'static,
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0271]: type mismatch resolving `<B as Trait>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:59:5
|
||||
|
|
||||
LL | fn accepts_trait<T: Trait<Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_trait`
|
||||
...
|
||||
LL | accepts_trait(b);
|
||||
| ^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<B as Trait>::Associated`
|
||||
= help: consider constraining the associated type `<B as Trait>::Associated` to `()`
|
||||
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||
|
||||
error[E0271]: type mismatch resolving `<C as Trait>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:62:5
|
||||
|
|
||||
LL | fn accepts_trait<T: Trait<Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_trait`
|
||||
...
|
||||
LL | accepts_trait(c);
|
||||
| ^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<C as Trait>::Associated`
|
||||
help: consider constraining the associated type `<C as Trait>::Associated` to `()`
|
||||
|
|
||||
LL | C: Trait<Associated = ()> + Foo,
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0271]: type mismatch resolving `<D as Trait>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:65:5
|
||||
|
|
||||
LL | fn accepts_trait<T: Trait<Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_trait`
|
||||
...
|
||||
LL | accepts_trait(d);
|
||||
| ^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<D as Trait>::Associated`
|
||||
= help: consider constraining the associated type `<D as Trait>::Associated` to `()`
|
||||
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||
|
||||
error[E0271]: type mismatch resolving `<E as GenericTrait<()>>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:68:5
|
||||
|
|
||||
LL | fn accepts_generic_trait<T: GenericTrait<(), Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_generic_trait`
|
||||
...
|
||||
LL | accepts_generic_trait(e);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<E as GenericTrait<()>>::Associated`
|
||||
help: consider constraining the associated type `<E as GenericTrait<()>>::Associated` to `()`
|
||||
|
|
||||
LL | E: GenericTrait<(), Associated = ()> + 'static,
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0271]: type mismatch resolving `<F as GenericTrait<()>>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:71:5
|
||||
|
|
||||
LL | fn accepts_generic_trait<T: GenericTrait<(), Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_generic_trait`
|
||||
...
|
||||
LL | accepts_generic_trait(f);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<F as GenericTrait<()>>::Associated`
|
||||
help: consider constraining the associated type `<F as GenericTrait<()>>::Associated` to `()`
|
||||
|
|
||||
LL | F: GenericTrait<(), Associated = ()> + Foo,
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0271]: type mismatch resolving `<G as GenericTrait<()>>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:74:5
|
||||
|
|
||||
LL | fn accepts_generic_trait<T: GenericTrait<(), Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_generic_trait`
|
||||
...
|
||||
LL | accepts_generic_trait(g);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<G as GenericTrait<()>>::Associated`
|
||||
= help: consider constraining the associated type `<G as GenericTrait<()>>::Associated` to `()`
|
||||
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||
|
||||
error[E0271]: type mismatch resolving `<impl Trait as Trait>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:79:5
|
||||
|
|
||||
LL | fn returns_opaque() -> impl Trait + 'static {
|
||||
| -------------------- the found opaque type
|
||||
...
|
||||
LL | fn accepts_trait<T: Trait<Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_trait`
|
||||
...
|
||||
LL | accepts_trait(returns_opaque());
|
||||
| ^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<impl Trait as Trait>::Associated`
|
||||
help: consider constraining the associated type `<impl Trait as Trait>::Associated` to `()`
|
||||
|
|
||||
LL | fn returns_opaque() -> impl Trait<Associated = ()> + 'static {
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0271]: type mismatch resolving `<impl DerivedTrait as Trait>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:82:5
|
||||
|
|
||||
LL | fn returns_opaque_derived() -> impl DerivedTrait + 'static {
|
||||
| --------------------------- the found opaque type
|
||||
...
|
||||
LL | fn accepts_trait<T: Trait<Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_trait`
|
||||
...
|
||||
LL | accepts_trait(returns_opaque_derived());
|
||||
| ^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<impl DerivedTrait as Trait>::Associated`
|
||||
help: consider constraining the associated type `<impl DerivedTrait as Trait>::Associated` to `()`
|
||||
|
|
||||
LL | fn returns_opaque_derived() -> impl DerivedTrait<Associated = ()> + 'static {
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0271]: type mismatch resolving `<impl Trait+Foo as Trait>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:85:5
|
||||
|
|
||||
LL | fn returns_opaque_foo() -> impl Trait + Foo {
|
||||
| ---------------- the found opaque type
|
||||
...
|
||||
LL | fn accepts_trait<T: Trait<Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_trait`
|
||||
...
|
||||
LL | accepts_trait(returns_opaque_foo());
|
||||
| ^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<impl Trait+Foo as Trait>::Associated`
|
||||
help: consider constraining the associated type `<impl Trait+Foo as Trait>::Associated` to `()`
|
||||
|
|
||||
LL | fn returns_opaque_foo() -> impl Trait<Associated = ()> + Foo {
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0271]: type mismatch resolving `<impl DerivedTrait+Foo as Trait>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:88:5
|
||||
|
|
||||
LL | fn returns_opaque_derived_foo() -> impl DerivedTrait + Foo {
|
||||
| ----------------------- the found opaque type
|
||||
...
|
||||
LL | fn accepts_trait<T: Trait<Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_trait`
|
||||
...
|
||||
LL | accepts_trait(returns_opaque_derived_foo());
|
||||
| ^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<impl DerivedTrait+Foo as Trait>::Associated`
|
||||
= help: consider constraining the associated type `<impl DerivedTrait+Foo as Trait>::Associated` to `()`
|
||||
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||
|
||||
error[E0271]: type mismatch resolving `<impl GenericTrait<()> as GenericTrait<()>>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:91:5
|
||||
|
|
||||
LL | fn returns_opaque_generic() -> impl GenericTrait<()> + 'static {
|
||||
| ------------------------------- the found opaque type
|
||||
...
|
||||
LL | fn accepts_generic_trait<T: GenericTrait<(), Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_generic_trait`
|
||||
...
|
||||
LL | accepts_generic_trait(returns_opaque_generic());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<impl GenericTrait<()> as GenericTrait<()>>::Associated`
|
||||
help: consider constraining the associated type `<impl GenericTrait<()> as GenericTrait<()>>::Associated` to `()`
|
||||
|
|
||||
LL | fn returns_opaque_generic() -> impl GenericTrait<(), Associated = ()> + 'static {
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0271]: type mismatch resolving `<impl GenericTrait<()>+Foo as GenericTrait<()>>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:94:5
|
||||
|
|
||||
LL | fn returns_opaque_generic_foo() -> impl GenericTrait<()> + Foo {
|
||||
| --------------------------- the found opaque type
|
||||
...
|
||||
LL | fn accepts_generic_trait<T: GenericTrait<(), Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_generic_trait`
|
||||
...
|
||||
LL | accepts_generic_trait(returns_opaque_generic_foo());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<impl GenericTrait<()>+Foo as GenericTrait<()>>::Associated`
|
||||
help: consider constraining the associated type `<impl GenericTrait<()>+Foo as GenericTrait<()>>::Associated` to `()`
|
||||
|
|
||||
LL | fn returns_opaque_generic_foo() -> impl GenericTrait<(), Associated = ()> + Foo {
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0271]: type mismatch resolving `<impl GenericTrait<()>+GenericTrait<u8> as GenericTrait<()>>::Associated == ()`
|
||||
--> $DIR/issue-87261.rs:97:5
|
||||
|
|
||||
LL | fn returns_opaque_generic_duplicate() -> impl GenericTrait<()> + GenericTrait<u8> {
|
||||
| ---------------------------------------- the found opaque type
|
||||
...
|
||||
LL | fn accepts_generic_trait<T: GenericTrait<(), Associated = ()>>(_: T) {}
|
||||
| --------------- required by this bound in `accepts_generic_trait`
|
||||
...
|
||||
LL | accepts_generic_trait(returns_opaque_generic_duplicate());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found associated type `<impl GenericTrait<()>+GenericTrait<u8> as GenericTrait<()>>::Associated`
|
||||
= help: consider constraining the associated type `<impl GenericTrait<()>+GenericTrait<u8> as GenericTrait<()>>::Associated` to `()`
|
||||
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||
|
||||
error: aborting due to 14 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0271`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue