diff options
| author | Michael Goulet <michael@errs.io> | 2023-06-21 16:41:23 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2023-06-21 16:41:52 +0000 |
| commit | c4cd6071007d12867112eb2a9ae10d07332d1d9a (patch) | |
| tree | faf9b6ad1df31d32dbb247157f2aea80ff666306 /tests | |
| parent | 5344ed23fadce0bd2af6a50cb4623704b1fe6383 (diff) | |
| download | rust-c4cd6071007d12867112eb2a9ae10d07332d1d9a.tar.gz rust-c4cd6071007d12867112eb2a9ae10d07332d1d9a.zip | |
Additional test demonstrating check for full trait ref
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ui/type-alias-impl-trait/not-matching-trait-refs-isnt-defining.rs | 33 | ||||
| -rw-r--r-- | tests/ui/type-alias-impl-trait/not-matching-trait-refs-isnt-defining.stderr | 22 |
2 files changed, 55 insertions, 0 deletions
diff --git a/tests/ui/type-alias-impl-trait/not-matching-trait-refs-isnt-defining.rs b/tests/ui/type-alias-impl-trait/not-matching-trait-refs-isnt-defining.rs new file mode 100644 index 00000000000..131f8d999d8 --- /dev/null +++ b/tests/ui/type-alias-impl-trait/not-matching-trait-refs-isnt-defining.rs @@ -0,0 +1,33 @@ +#![feature(impl_trait_in_assoc_type)] + +trait Foo<T> { + type Assoc; + + fn test() -> u32; +} + +struct DefinesOpaque; +impl Foo<DefinesOpaque> for () { + type Assoc = impl Sized; + + // This test's return type is `u32`, *not* the opaque that is defined above. + // Previously we were only checking that the self type of the assoc matched, + // but this doesn't account for other impls with different trait substs. + fn test() -> <() as Foo<NoOpaques>>::Assoc { + let _: <Self as Foo<DefinesOpaque>>::Assoc = ""; + //~^ ERROR mismatched types + + 1 + } +} + +struct NoOpaques; +impl Foo<NoOpaques> for () { + type Assoc = u32; + + fn test() -> u32 { + 1 + } +} + +fn main() {} diff --git a/tests/ui/type-alias-impl-trait/not-matching-trait-refs-isnt-defining.stderr b/tests/ui/type-alias-impl-trait/not-matching-trait-refs-isnt-defining.stderr new file mode 100644 index 00000000000..d2d00749091 --- /dev/null +++ b/tests/ui/type-alias-impl-trait/not-matching-trait-refs-isnt-defining.stderr @@ -0,0 +1,22 @@ +error[E0308]: mismatched types + --> $DIR/not-matching-trait-refs-isnt-defining.rs:17:54 + | +LL | type Assoc = impl Sized; + | ---------- the expected opaque type +... +LL | let _: <Self as Foo<DefinesOpaque>>::Assoc = ""; + | ----------------------------------- ^^ expected opaque type, found `&str` + | | + | expected due to this + | + = note: expected opaque type `<() as Foo<DefinesOpaque>>::Assoc` + found reference `&'static str` +note: this item must have the opaque type in its signature in order to be able to register hidden types + --> $DIR/not-matching-trait-refs-isnt-defining.rs:16:5 + | +LL | fn test() -> <() as Foo<NoOpaques>>::Assoc { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. |
