diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2021-07-24 09:51:56 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-07-24 09:51:56 -0700 |
| commit | e4d8f0e3493d65f8d8d4121dd868402a1365d951 (patch) | |
| tree | 562e1aad089ca0d69b757af6665f2a1e003d0500 /src | |
| parent | 18840b0719aa766a1bc49ea2eb5dc2e4cde7da3f (diff) | |
| parent | d1bc9413858b334b6cdaf345bd6b50cb9aa4cec2 (diff) | |
| download | rust-e4d8f0e3493d65f8d8d4121dd868402a1365d951.tar.gz rust-e4d8f0e3493d65f8d8d4121dd868402a1365d951.zip | |
Rollup merge of #87348 - SkiFire13:fix-87261, r=oli-obk
Fix span when suggesting to add an associated type bound Fixes #87261 Note that this fix is not perfect, it ~~will still give incorrect~~ won't give suggestions in some situations: - If the associated type is defined on a supertrait of those contained in the opaque type, it will fallback to the previous behaviour, e.g. if `AssocTy` is defined on the trait `Foo`, `Bar` has `Foo` as supertrait and the opaque type is a `impl Bar + Baz`. - If the the associated type is defined on a generic trait and the opaque type includes two versions of that generic trait, e.g. the opaque type is `impl Foo<A> + Foo<B>`
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/associated-types/issue-87261.rs | 99 | ||||
| -rw-r--r-- | src/test/ui/associated-types/issue-87261.stderr | 238 |
2 files changed, 337 insertions, 0 deletions
diff --git a/src/test/ui/associated-types/issue-87261.rs b/src/test/ui/associated-types/issue-87261.rs new file mode 100644 index 00000000000..a70f771e482 --- /dev/null +++ b/src/test/ui/associated-types/issue-87261.rs @@ -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 == ()` +} diff --git a/src/test/ui/associated-types/issue-87261.stderr b/src/test/ui/associated-types/issue-87261.stderr new file mode 100644 index 00000000000..0725acfe537 --- /dev/null +++ b/src/test/ui/associated-types/issue-87261.stderr @@ -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`. |
