about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/test/ui/type-mismatch.rs86
-rw-r--r--src/test/ui/type-mismatch.stderr432
2 files changed, 518 insertions, 0 deletions
diff --git a/src/test/ui/type-mismatch.rs b/src/test/ui/type-mismatch.rs
new file mode 100644
index 00000000000..2592b07eda7
--- /dev/null
+++ b/src/test/ui/type-mismatch.rs
@@ -0,0 +1,86 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+trait Qux {}
+struct A;
+struct B;
+impl Qux for A {}
+impl Qux for B {}
+
+struct Foo<T, U: Qux = A, V: Qux = B>(T, U, V);
+
+struct foo;
+struct bar;
+
+fn want<T>(t: T) {}
+
+fn have_usize(f: usize) {
+    want::<foo>(f); //~ ERROR mismatched types
+    want::<bar>(f); //~ ERROR mismatched types
+    want::<Foo<usize>>(f); //~ ERROR mismatched types
+    want::<Foo<usize, B>>(f); //~ ERROR mismatched types
+    want::<Foo<foo>>(f); //~ ERROR mismatched types
+    want::<Foo<foo, B>>(f); //~ ERROR mismatched types
+    want::<Foo<bar>>(f); //~ ERROR mismatched types
+    want::<Foo<bar, B>>(f); //~ ERROR mismatched types
+}
+
+fn have_foo(f: foo) {
+    want::<usize>(f); //~ ERROR mismatched types
+    want::<bar>(f); //~ ERROR mismatched types
+    want::<Foo<usize>>(f); //~ ERROR mismatched types
+    want::<Foo<usize, B>>(f); //~ ERROR mismatched types
+    want::<Foo<foo>>(f); //~ ERROR mismatched types
+    want::<Foo<foo, B>>(f); //~ ERROR mismatched types
+    want::<Foo<bar>>(f); //~ ERROR mismatched types
+    want::<Foo<bar, B>>(f); //~ ERROR mismatched types
+}
+
+fn have_foo_foo(f: Foo<foo>) {
+    want::<usize>(f); //~ ERROR mismatched types
+    want::<foo>(f); //~ ERROR mismatched types
+    want::<bar>(f); //~ ERROR mismatched types
+    want::<Foo<usize>>(f); //~ ERROR mismatched types
+    want::<Foo<usize, B>>(f); //~ ERROR mismatched types
+    want::<Foo<foo, B>>(f); //~ ERROR mismatched types
+    want::<Foo<bar>>(f); //~ ERROR mismatched types
+    want::<Foo<bar, B>>(f); //~ ERROR mismatched types
+    want::<&Foo<foo>>(f); //~ ERROR mismatched types
+    want::<&Foo<foo, B>>(f); //~ ERROR mismatched types
+}
+
+fn have_foo_foo_b(f: Foo<foo, B>) {
+    want::<usize>(f); //~ ERROR mismatched types
+    want::<foo>(f); //~ ERROR mismatched types
+    want::<bar>(f); //~ ERROR mismatched types
+    want::<Foo<usize>>(f); //~ ERROR mismatched types
+    want::<Foo<usize, B>>(f); //~ ERROR mismatched types
+    want::<Foo<foo>>(f); //~ ERROR mismatched types
+    want::<Foo<bar>>(f); //~ ERROR mismatched types
+    want::<Foo<bar, B>>(f); //~ ERROR mismatched types
+    want::<&Foo<foo>>(f); //~ ERROR mismatched types
+    want::<&Foo<foo, B>>(f); //~ ERROR mismatched types
+}
+
+fn have_foo_foo_b_a(f: Foo<foo, B, A>) {
+    want::<usize>(f); //~ ERROR mismatched types
+    want::<foo>(f); //~ ERROR mismatched types
+    want::<bar>(f); //~ ERROR mismatched types
+    want::<Foo<usize>>(f); //~ ERROR mismatched types
+    want::<Foo<usize, B>>(f); //~ ERROR mismatched types
+    want::<Foo<foo>>(f); //~ ERROR mismatched types
+    want::<Foo<foo, B>>(f); //~ ERROR mismatched types
+    want::<Foo<bar>>(f); //~ ERROR mismatched types
+    want::<Foo<bar, B>>(f); //~ ERROR mismatched types
+    want::<&Foo<foo>>(f); //~ ERROR mismatched types
+    want::<&Foo<foo, B>>(f); //~ ERROR mismatched types
+}
+
+fn main() {}
diff --git a/src/test/ui/type-mismatch.stderr b/src/test/ui/type-mismatch.stderr
new file mode 100644
index 00000000000..634f3b402a1
--- /dev/null
+++ b/src/test/ui/type-mismatch.stderr
@@ -0,0 +1,432 @@
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:25:17
+   |
+LL |     want::<foo>(f); //~ ERROR mismatched types
+   |                 ^ expected struct `foo`, found usize
+   |
+   = note: expected type `foo`
+              found type `usize`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:26:17
+   |
+LL |     want::<bar>(f); //~ ERROR mismatched types
+   |                 ^ expected struct `bar`, found usize
+   |
+   = note: expected type `bar`
+              found type `usize`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:27:24
+   |
+LL |     want::<Foo<usize>>(f); //~ ERROR mismatched types
+   |                        ^ expected struct `Foo`, found usize
+   |
+   = note: expected type `Foo<usize>`
+              found type `usize`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:28:27
+   |
+LL |     want::<Foo<usize, B>>(f); //~ ERROR mismatched types
+   |                           ^ expected struct `Foo`, found usize
+   |
+   = note: expected type `Foo<usize, B>`
+              found type `usize`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:29:22
+   |
+LL |     want::<Foo<foo>>(f); //~ ERROR mismatched types
+   |                      ^ expected struct `Foo`, found usize
+   |
+   = note: expected type `Foo<foo>`
+              found type `usize`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:30:25
+   |
+LL |     want::<Foo<foo, B>>(f); //~ ERROR mismatched types
+   |                         ^ expected struct `Foo`, found usize
+   |
+   = note: expected type `Foo<foo, B>`
+              found type `usize`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:31:22
+   |
+LL |     want::<Foo<bar>>(f); //~ ERROR mismatched types
+   |                      ^ expected struct `Foo`, found usize
+   |
+   = note: expected type `Foo<bar>`
+              found type `usize`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:32:25
+   |
+LL |     want::<Foo<bar, B>>(f); //~ ERROR mismatched types
+   |                         ^ expected struct `Foo`, found usize
+   |
+   = note: expected type `Foo<bar, B>`
+              found type `usize`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:36:19
+   |
+LL |     want::<usize>(f); //~ ERROR mismatched types
+   |                   ^ expected usize, found struct `foo`
+   |
+   = note: expected type `usize`
+              found type `foo`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:37:17
+   |
+LL |     want::<bar>(f); //~ ERROR mismatched types
+   |                 ^ expected struct `bar`, found struct `foo`
+   |
+   = note: expected type `bar`
+              found type `foo`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:38:24
+   |
+LL |     want::<Foo<usize>>(f); //~ ERROR mismatched types
+   |                        ^ expected struct `Foo`, found struct `foo`
+   |
+   = note: expected type `Foo<usize>`
+              found type `foo`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:39:27
+   |
+LL |     want::<Foo<usize, B>>(f); //~ ERROR mismatched types
+   |                           ^ expected struct `Foo`, found struct `foo`
+   |
+   = note: expected type `Foo<usize, B>`
+              found type `foo`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:40:22
+   |
+LL |     want::<Foo<foo>>(f); //~ ERROR mismatched types
+   |                      ^ expected struct `Foo`, found struct `foo`
+   |
+   = note: expected type `Foo<foo, A, B>`
+              found type `foo`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:41:25
+   |
+LL |     want::<Foo<foo, B>>(f); //~ ERROR mismatched types
+   |                         ^ expected struct `Foo`, found struct `foo`
+   |
+   = note: expected type `Foo<foo, B, B>`
+              found type `foo`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:42:22
+   |
+LL |     want::<Foo<bar>>(f); //~ ERROR mismatched types
+   |                      ^ expected struct `Foo`, found struct `foo`
+   |
+   = note: expected type `Foo<bar>`
+              found type `foo`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:43:25
+   |
+LL |     want::<Foo<bar, B>>(f); //~ ERROR mismatched types
+   |                         ^ expected struct `Foo`, found struct `foo`
+   |
+   = note: expected type `Foo<bar, B>`
+              found type `foo`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:47:19
+   |
+LL |     want::<usize>(f); //~ ERROR mismatched types
+   |                   ^ expected usize, found struct `Foo`
+   |
+   = note: expected type `usize`
+              found type `Foo<foo>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:48:17
+   |
+LL |     want::<foo>(f); //~ ERROR mismatched types
+   |                 ^ expected struct `foo`, found struct `Foo`
+   |
+   = note: expected type `foo`
+              found type `Foo<foo, A, B>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:49:17
+   |
+LL |     want::<bar>(f); //~ ERROR mismatched types
+   |                 ^ expected struct `bar`, found struct `Foo`
+   |
+   = note: expected type `bar`
+              found type `Foo<foo>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:50:24
+   |
+LL |     want::<Foo<usize>>(f); //~ ERROR mismatched types
+   |                        ^ expected usize, found struct `foo`
+   |
+   = note: expected type `Foo<usize, _, _>`
+              found type `Foo<foo, _, _>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:51:27
+   |
+LL |     want::<Foo<usize, B>>(f); //~ ERROR mismatched types
+   |                           ^ expected usize, found struct `foo`
+   |
+   = note: expected type `Foo<usize, B, _>`
+              found type `Foo<foo, A, _>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:52:25
+   |
+LL |     want::<Foo<foo, B>>(f); //~ ERROR mismatched types
+   |                         ^ expected struct `B`, found struct `A`
+   |
+   = note: expected type `Foo<_, B, _>`
+              found type `Foo<_, A, _>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:53:22
+   |
+LL |     want::<Foo<bar>>(f); //~ ERROR mismatched types
+   |                      ^ expected struct `bar`, found struct `foo`
+   |
+   = note: expected type `Foo<bar, _, _>`
+              found type `Foo<foo, _, _>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:54:25
+   |
+LL |     want::<Foo<bar, B>>(f); //~ ERROR mismatched types
+   |                         ^ expected struct `bar`, found struct `foo`
+   |
+   = note: expected type `Foo<bar, B, _>`
+              found type `Foo<foo, A, _>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:55:23
+   |
+LL |     want::<&Foo<foo>>(f); //~ ERROR mismatched types
+   |                       ^
+   |                       |
+   |                       expected &Foo<foo>, found struct `Foo`
+   |                       help: consider borrowing here: `&f`
+   |
+   = note: expected type `&Foo<foo>`
+              found type `Foo<foo>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:56:26
+   |
+LL |     want::<&Foo<foo, B>>(f); //~ ERROR mismatched types
+   |                          ^ expected reference, found struct `Foo`
+   |
+   = note: expected type `&Foo<foo, B>`
+              found type `Foo<foo>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:60:19
+   |
+LL |     want::<usize>(f); //~ ERROR mismatched types
+   |                   ^ expected usize, found struct `Foo`
+   |
+   = note: expected type `usize`
+              found type `Foo<foo, B>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:61:17
+   |
+LL |     want::<foo>(f); //~ ERROR mismatched types
+   |                 ^ expected struct `foo`, found struct `Foo`
+   |
+   = note: expected type `foo`
+              found type `Foo<foo, B, B>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:62:17
+   |
+LL |     want::<bar>(f); //~ ERROR mismatched types
+   |                 ^ expected struct `bar`, found struct `Foo`
+   |
+   = note: expected type `bar`
+              found type `Foo<foo, B>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:63:24
+   |
+LL |     want::<Foo<usize>>(f); //~ ERROR mismatched types
+   |                        ^ expected usize, found struct `foo`
+   |
+   = note: expected type `Foo<usize, A, _>`
+              found type `Foo<foo, B, _>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:64:27
+   |
+LL |     want::<Foo<usize, B>>(f); //~ ERROR mismatched types
+   |                           ^ expected usize, found struct `foo`
+   |
+   = note: expected type `Foo<usize, _, _>`
+              found type `Foo<foo, _, _>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:65:22
+   |
+LL |     want::<Foo<foo>>(f); //~ ERROR mismatched types
+   |                      ^ expected struct `A`, found struct `B`
+   |
+   = note: expected type `Foo<_, A, _>`
+              found type `Foo<_, B, _>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:66:22
+   |
+LL |     want::<Foo<bar>>(f); //~ ERROR mismatched types
+   |                      ^ expected struct `bar`, found struct `foo`
+   |
+   = note: expected type `Foo<bar, A, _>`
+              found type `Foo<foo, B, _>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:67:25
+   |
+LL |     want::<Foo<bar, B>>(f); //~ ERROR mismatched types
+   |                         ^ expected struct `bar`, found struct `foo`
+   |
+   = note: expected type `Foo<bar, _, _>`
+              found type `Foo<foo, _, _>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:68:23
+   |
+LL |     want::<&Foo<foo>>(f); //~ ERROR mismatched types
+   |                       ^ expected &Foo<foo>, found struct `Foo`
+   |
+   = note: expected type `&Foo<foo>`
+              found type `Foo<foo, B>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:69:26
+   |
+LL |     want::<&Foo<foo, B>>(f); //~ ERROR mismatched types
+   |                          ^
+   |                          |
+   |                          expected reference, found struct `Foo`
+   |                          help: consider borrowing here: `&f`
+   |
+   = note: expected type `&Foo<foo, B>`
+              found type `Foo<foo, B>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:73:19
+   |
+LL |     want::<usize>(f); //~ ERROR mismatched types
+   |                   ^ expected usize, found struct `Foo`
+   |
+   = note: expected type `usize`
+              found type `Foo<foo, B, A>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:74:17
+   |
+LL |     want::<foo>(f); //~ ERROR mismatched types
+   |                 ^ expected struct `foo`, found struct `Foo`
+   |
+   = note: expected type `foo`
+              found type `Foo<foo, B, A>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:75:17
+   |
+LL |     want::<bar>(f); //~ ERROR mismatched types
+   |                 ^ expected struct `bar`, found struct `Foo`
+   |
+   = note: expected type `bar`
+              found type `Foo<foo, B, A>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:76:24
+   |
+LL |     want::<Foo<usize>>(f); //~ ERROR mismatched types
+   |                        ^ expected usize, found struct `foo`
+   |
+   = note: expected type `Foo<usize, A, B>`
+              found type `Foo<foo, B, A>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:77:27
+   |
+LL |     want::<Foo<usize, B>>(f); //~ ERROR mismatched types
+   |                           ^ expected usize, found struct `foo`
+   |
+   = note: expected type `Foo<usize, _, B>`
+              found type `Foo<foo, _, A>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:78:22
+   |
+LL |     want::<Foo<foo>>(f); //~ ERROR mismatched types
+   |                      ^ expected struct `A`, found struct `B`
+   |
+   = note: expected type `Foo<_, A, B>`
+              found type `Foo<_, B, A>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:79:25
+   |
+LL |     want::<Foo<foo, B>>(f); //~ ERROR mismatched types
+   |                         ^ expected struct `B`, found struct `A`
+   |
+   = note: expected type `Foo<_, _, B>`
+              found type `Foo<_, _, A>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:80:22
+   |
+LL |     want::<Foo<bar>>(f); //~ ERROR mismatched types
+   |                      ^ expected struct `bar`, found struct `foo`
+   |
+   = note: expected type `Foo<bar, A, B>`
+              found type `Foo<foo, B, A>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:81:25
+   |
+LL |     want::<Foo<bar, B>>(f); //~ ERROR mismatched types
+   |                         ^ expected struct `bar`, found struct `foo`
+   |
+   = note: expected type `Foo<bar, _, B>`
+              found type `Foo<foo, _, A>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:82:23
+   |
+LL |     want::<&Foo<foo>>(f); //~ ERROR mismatched types
+   |                       ^ expected &Foo<foo>, found struct `Foo`
+   |
+   = note: expected type `&Foo<foo>`
+              found type `Foo<foo, B, A>`
+
+error[E0308]: mismatched types
+  --> $DIR/type-mismatch.rs:83:26
+   |
+LL |     want::<&Foo<foo, B>>(f); //~ ERROR mismatched types
+   |                          ^ expected reference, found struct `Foo`
+   |
+   = note: expected type `&Foo<foo, B>`
+              found type `Foo<foo, B, A>`
+
+error: aborting due to 47 previous errors
+
+For more information about this error, try `rustc --explain E0308`.