about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/ui/associated-types/defaults-specialization.rs36
-rw-r--r--src/test/ui/associated-types/defaults-specialization.stderr61
2 files changed, 88 insertions, 9 deletions
diff --git a/src/test/ui/associated-types/defaults-specialization.rs b/src/test/ui/associated-types/defaults-specialization.rs
index e3a5db0960c..833981fc8e3 100644
--- a/src/test/ui/associated-types/defaults-specialization.rs
+++ b/src/test/ui/associated-types/defaults-specialization.rs
@@ -7,7 +7,10 @@
 trait Tr {
     type Ty = u8;
 
-    fn make() -> Self::Ty;
+    fn make() -> Self::Ty {
+        0u8
+        //~^ error: mismatched types
+    }
 }
 
 struct A<T>(T);
@@ -61,4 +64,33 @@ impl Tr for D<bool> {
     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;
+}
diff --git a/src/test/ui/associated-types/defaults-specialization.stderr b/src/test/ui/associated-types/defaults-specialization.stderr
index 2b2adfdb7c9..bd0fd7166f6 100644
--- a/src/test/ui/associated-types/defaults-specialization.stderr
+++ b/src/test/ui/associated-types/defaults-specialization.stderr
@@ -1,7 +1,7 @@
 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 }
@@ -11,9 +11,9 @@ 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 }
@@ -23,7 +23,18 @@ 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
@@ -34,7 +45,7 @@ LL |     fn make() -> Self::Ty { 0u8 }
               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
@@ -44,7 +55,43 @@ LL |     fn make() -> Self::Ty { true }
    = 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`.