trait Tr {
type Ty = u8;
- fn make() -> Self::Ty;
+ fn make() -> Self::Ty {
+ 0u8
+ //~^ error: mismatched types
+ }
}
struct A<T>(T);
fn make() -> u8 { 255 }
}
-fn main() {}
+struct E<T>(T);
+impl<T> Tr for E<T> {
+ default fn make() -> Self::Ty { panic!(); }
+}
+
+// This impl specializes and sets `Ty`, it can rely on `Ty=String`.
+impl Tr for E<bool> {
+ type Ty = String;
+
+ fn make() -> String { String::new() }
+}
+
+fn main() {
+ // Test that we can assume the right set of assoc. types from outside the impl
+
+ // This is a `default impl`, which does *not* mean that `A`/`A2` actually implement the trait.
+ // cf. https://github.com/rust-lang/rust/issues/48515
+ //let _: <A<()> as Tr>::Ty = 0u8;
+ //let _: <A2<()> as Tr>::Ty = 0u8;
+
+ let _: <B<()> as Tr>::Ty = 0u8; //~ error: mismatched types
+ let _: <B<()> as Tr>::Ty = true; //~ error: mismatched types
+ let _: <B2<()> as Tr>::Ty = 0u8; //~ error: mismatched types
+ let _: <B2<()> as Tr>::Ty = true; //~ error: mismatched types
+
+ let _: <C<()> as Tr>::Ty = true;
+
+ let _: <D<()> as Tr>::Ty = 0u8;
+ let _: <D<bool> as Tr>::Ty = 0u8;
+}
error[E0053]: method `make` has an incompatible type for trait
- --> $DIR/defaults-specialization.rs:17:18
+ --> $DIR/defaults-specialization.rs:20:18
|
-LL | fn make() -> Self::Ty;
+LL | fn make() -> Self::Ty {
| -------- type in trait
...
LL | fn make() -> u8 { 0 }
found type `fn() -> u8`
error[E0053]: method `make` has an incompatible type for trait
- --> $DIR/defaults-specialization.rs:33:18
+ --> $DIR/defaults-specialization.rs:36:18
|
-LL | fn make() -> Self::Ty;
+LL | fn make() -> Self::Ty {
| -------- type in trait
...
LL | fn make() -> bool { true }
found type `fn() -> bool`
error[E0308]: mismatched types
- --> $DIR/defaults-specialization.rs:24:29
+ --> $DIR/defaults-specialization.rs:11:9
+ |
+LL | fn make() -> Self::Ty {
+ | -------- expected `<Self as Tr>::Ty` because of return type
+LL | 0u8
+ | ^^^ expected associated type, found u8
+ |
+ = note: expected type `<Self as Tr>::Ty`
+ found type `u8`
+
+error[E0308]: mismatched types
+ --> $DIR/defaults-specialization.rs:27:29
|
LL | fn make() -> Self::Ty { 0u8 }
| -------- ^^^ expected associated type, found u8
found type `u8`
error[E0308]: mismatched types
- --> $DIR/defaults-specialization.rs:42:29
+ --> $DIR/defaults-specialization.rs:45:29
|
LL | fn make() -> Self::Ty { true }
| -------- ^^^^ expected associated type, found bool
= note: expected type `<B2<T> as Tr>::Ty`
found type `bool`
-error: aborting due to 4 previous errors
+error[E0308]: mismatched types
+ --> $DIR/defaults-specialization.rs:87:32
+ |
+LL | let _: <B<()> as Tr>::Ty = 0u8;
+ | ^^^ expected associated type, found u8
+ |
+ = note: expected type `<B<()> as Tr>::Ty`
+ found type `u8`
+
+error[E0308]: mismatched types
+ --> $DIR/defaults-specialization.rs:88:32
+ |
+LL | let _: <B<()> as Tr>::Ty = true;
+ | ^^^^ expected associated type, found bool
+ |
+ = note: expected type `<B<()> as Tr>::Ty`
+ found type `bool`
+
+error[E0308]: mismatched types
+ --> $DIR/defaults-specialization.rs:89:33
+ |
+LL | let _: <B2<()> as Tr>::Ty = 0u8;
+ | ^^^ expected associated type, found u8
+ |
+ = note: expected type `<B2<()> as Tr>::Ty`
+ found type `u8`
+
+error[E0308]: mismatched types
+ --> $DIR/defaults-specialization.rs:90:33
+ |
+LL | let _: <B2<()> as Tr>::Ty = true;
+ | ^^^^ expected associated type, found bool
+ |
+ = note: expected type `<B2<()> as Tr>::Ty`
+ found type `bool`
+
+error: aborting due to 9 previous errors
Some errors have detailed explanations: E0053, E0308.
For more information about an error, try `rustc --explain E0053`.