about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Schneider <github35764891676564198441@oli-obk.de>2018-07-16 17:17:01 +0200
committerOliver Schneider <github35764891676564198441@oli-obk.de>2018-07-18 10:53:09 +0200
commit0f05b4be82ae9e48b2c604b97f5436b1d43a194d (patch)
treedc5a9d99c85ea77cce83305bf87c8ab56ed8178e
parent35351591af5108e62127ce9f0beeca84392a06ab (diff)
downloadrust-0f05b4be82ae9e48b2c604b97f5436b1d43a194d.tar.gz
rust-0f05b4be82ae9e48b2c604b97f5436b1d43a194d.zip
Split monster tests into smaller ones
-rw-r--r--src/test/ui/existential_types/declared_but_never_defined.rs17
-rw-r--r--src/test/ui/existential_types/declared_but_never_defined.stderr8
-rw-r--r--src/test/ui/existential_types/declared_but_not_defined_in_scope.rs23
-rw-r--r--src/test/ui/existential_types/declared_but_not_defined_in_scope.stderr8
-rw-r--r--src/test/ui/existential_types/different_defining_uses.rs25
-rw-r--r--src/test/ui/existential_types/different_defining_uses.stderr18
-rw-r--r--src/test/ui/existential_types/different_defining_uses_never_type.rs29
-rw-r--r--src/test/ui/existential_types/different_defining_uses_never_type.stderr34
-rw-r--r--src/test/ui/existential_types/different_defining_uses_never_type2.rs54
-rw-r--r--src/test/ui/existential_types/existential_type.nll.stderr111
-rw-r--r--src/test/ui/existential_types/existential_type.rs95
-rw-r--r--src/test/ui/existential_types/existential_type.stderr120
-rw-r--r--src/test/ui/existential_types/generic_different_defining_uses.rs24
-rw-r--r--src/test/ui/existential_types/generic_different_defining_uses.stderr18
-rw-r--r--src/test/ui/existential_types/generic_nondefining_use.rs (renamed from src/test/ui/existential_types/existential_type4.rs)0
-rw-r--r--src/test/ui/existential_types/generic_nondefining_use.stderr (renamed from src/test/ui/existential_types/existential_type4.stderr)4
-rw-r--r--src/test/ui/existential_types/generic_not_used.rs (renamed from src/test/ui/existential_types/existential_type3.rs)0
-rw-r--r--src/test/ui/existential_types/generic_not_used.stderr (renamed from src/test/ui/existential_types/existential_type3.stderr)2
-rw-r--r--src/test/ui/existential_types/generic_type_does_not_live_long_enough.nll.stderr17
-rw-r--r--src/test/ui/existential_types/generic_type_does_not_live_long_enough.rs21
-rw-r--r--src/test/ui/existential_types/generic_type_does_not_live_long_enough.stderr18
-rw-r--r--src/test/ui/existential_types/generic_underconstrained.rs22
-rw-r--r--src/test/ui/existential_types/generic_underconstrained.stderr12
-rw-r--r--src/test/ui/existential_types/generic_underconstrained2.rs (renamed from src/test/ui/existential_types/existential_type2.rs)0
-rw-r--r--src/test/ui/existential_types/generic_underconstrained2.stderr (renamed from src/test/ui/existential_types/existential_type2.stderr)4
-rw-r--r--src/test/ui/existential_types/never_reveal_concrete_type.rs26
-rw-r--r--src/test/ui/existential_types/never_reveal_concrete_type.stderr21
-rw-r--r--src/test/ui/existential_types/no_revealing_outside_defining_module.rs33
-rw-r--r--src/test/ui/existential_types/no_revealing_outside_defining_module.stderr23
29 files changed, 456 insertions, 331 deletions
diff --git a/src/test/ui/existential_types/declared_but_never_defined.rs b/src/test/ui/existential_types/declared_but_never_defined.rs
new file mode 100644
index 00000000000..c0f08fe057f
--- /dev/null
+++ b/src/test/ui/existential_types/declared_but_never_defined.rs
@@ -0,0 +1,17 @@
+// 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.
+
+
+#![feature(existential_type)]
+
+fn main() {}
+
+// declared but never defined
+existential type Bar: std::fmt::Debug; //~ ERROR could not find defining uses
diff --git a/src/test/ui/existential_types/declared_but_never_defined.stderr b/src/test/ui/existential_types/declared_but_never_defined.stderr
new file mode 100644
index 00000000000..29ae10c1c48
--- /dev/null
+++ b/src/test/ui/existential_types/declared_but_never_defined.stderr
@@ -0,0 +1,8 @@
+error: could not find defining uses
+  --> $DIR/declared_but_never_defined.rs:17:1
+   |
+LL | existential type Bar: std::fmt::Debug; //~ ERROR could not find defining uses
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/existential_types/declared_but_not_defined_in_scope.rs b/src/test/ui/existential_types/declared_but_not_defined_in_scope.rs
new file mode 100644
index 00000000000..6d0a9b80a3f
--- /dev/null
+++ b/src/test/ui/existential_types/declared_but_not_defined_in_scope.rs
@@ -0,0 +1,23 @@
+// 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.
+
+
+#![feature(existential_type)]
+
+fn main() {}
+
+mod boo {
+    // declared in module but not defined inside of it
+    pub existential type Boo: ::std::fmt::Debug; //~ ERROR could not find defining uses
+}
+
+fn bomp() -> boo::Boo {
+    ""
+}
diff --git a/src/test/ui/existential_types/declared_but_not_defined_in_scope.stderr b/src/test/ui/existential_types/declared_but_not_defined_in_scope.stderr
new file mode 100644
index 00000000000..fcd8e2a7f84
--- /dev/null
+++ b/src/test/ui/existential_types/declared_but_not_defined_in_scope.stderr
@@ -0,0 +1,8 @@
+error: could not find defining uses
+  --> $DIR/declared_but_not_defined_in_scope.rs:18:5
+   |
+LL |     pub existential type Boo: ::std::fmt::Debug; //~ ERROR could not find defining uses
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/existential_types/different_defining_uses.rs b/src/test/ui/existential_types/different_defining_uses.rs
new file mode 100644
index 00000000000..c58ca3f6210
--- /dev/null
+++ b/src/test/ui/existential_types/different_defining_uses.rs
@@ -0,0 +1,25 @@
+// 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.
+
+
+#![feature(existential_type)]
+
+fn main() {}
+
+// two definitions with different types
+existential type Foo: std::fmt::Debug;
+
+fn foo() -> Foo {
+    ""
+}
+
+fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
+    42i32
+}
diff --git a/src/test/ui/existential_types/different_defining_uses.stderr b/src/test/ui/existential_types/different_defining_uses.stderr
new file mode 100644
index 00000000000..63177e8a123
--- /dev/null
+++ b/src/test/ui/existential_types/different_defining_uses.stderr
@@ -0,0 +1,18 @@
+error: defining existential type use differs from previous
+  --> $DIR/different_defining_uses.rs:23:1
+   |
+LL | / fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
+LL | |     42i32
+LL | | }
+   | |_^
+   |
+note: previous use here
+  --> $DIR/different_defining_uses.rs:19:1
+   |
+LL | / fn foo() -> Foo {
+LL | |     ""
+LL | | }
+   | |_^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/existential_types/different_defining_uses_never_type.rs b/src/test/ui/existential_types/different_defining_uses_never_type.rs
new file mode 100644
index 00000000000..5bf46ef91bf
--- /dev/null
+++ b/src/test/ui/existential_types/different_defining_uses_never_type.rs
@@ -0,0 +1,29 @@
+// 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.
+
+
+#![feature(existential_type)]
+
+fn main() {}
+
+// two definitions with different types
+existential type Foo: std::fmt::Debug;
+
+fn foo() -> Foo {
+    ""
+}
+
+fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
+    panic!()
+}
+
+fn boo() -> Foo { //~ ERROR defining existential type use differs from previous
+    loop {}
+}
diff --git a/src/test/ui/existential_types/different_defining_uses_never_type.stderr b/src/test/ui/existential_types/different_defining_uses_never_type.stderr
new file mode 100644
index 00000000000..f0e9f505f6e
--- /dev/null
+++ b/src/test/ui/existential_types/different_defining_uses_never_type.stderr
@@ -0,0 +1,34 @@
+error: defining existential type use differs from previous
+  --> $DIR/different_defining_uses_never_type.rs:23:1
+   |
+LL | / fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
+LL | |     panic!()
+LL | | }
+   | |_^
+   |
+note: previous use here
+  --> $DIR/different_defining_uses_never_type.rs:19:1
+   |
+LL | / fn foo() -> Foo {
+LL | |     ""
+LL | | }
+   | |_^
+
+error: defining existential type use differs from previous
+  --> $DIR/different_defining_uses_never_type.rs:27:1
+   |
+LL | / fn boo() -> Foo { //~ ERROR defining existential type use differs from previous
+LL | |     loop {}
+LL | | }
+   | |_^
+   |
+note: previous use here
+  --> $DIR/different_defining_uses_never_type.rs:19:1
+   |
+LL | / fn foo() -> Foo {
+LL | |     ""
+LL | | }
+   | |_^
+
+error: aborting due to 2 previous errors
+
diff --git a/src/test/ui/existential_types/different_defining_uses_never_type2.rs b/src/test/ui/existential_types/different_defining_uses_never_type2.rs
new file mode 100644
index 00000000000..0e40221d829
--- /dev/null
+++ b/src/test/ui/existential_types/different_defining_uses_never_type2.rs
@@ -0,0 +1,54 @@
+// 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.
+
+// compile-pass
+
+#![feature(existential_type)]
+
+fn main() {}
+
+// two definitions with different types
+existential type Foo: std::fmt::Debug;
+
+fn foo() -> Foo {
+    ""
+}
+
+fn bar(arg: bool) -> Foo {
+    if arg {
+        panic!()
+    } else {
+        "bar"
+    }
+}
+
+fn boo(arg: bool) -> Foo {
+    if arg {
+        loop {}
+    } else {
+        "boo"
+    }
+}
+
+fn bar2(arg: bool) -> Foo {
+    if arg {
+        "bar2"
+    } else {
+        panic!()
+    }
+}
+
+fn boo2(arg: bool) -> Foo {
+    if arg {
+        "boo2"
+    } else {
+        loop {}
+    }
+}
diff --git a/src/test/ui/existential_types/existential_type.nll.stderr b/src/test/ui/existential_types/existential_type.nll.stderr
deleted file mode 100644
index 90840bf205c..00000000000
--- a/src/test/ui/existential_types/existential_type.nll.stderr
+++ /dev/null
@@ -1,111 +0,0 @@
-error: defining existential type use differs from previous
-  --> $DIR/existential_type.rs:23:1
-   |
-LL | / fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
-LL | |     42i32
-LL | | }
-   | |_^
-   |
-note: previous use here
-  --> $DIR/existential_type.rs:19:1
-   |
-LL | / fn foo() -> Foo {
-LL | |     ""
-LL | | }
-   | |_^
-
-error[E0308]: mismatched types
-  --> $DIR/existential_type.rs:36:5
-   |
-LL | fn bomp() -> boo::Boo {
-   |              -------- expected `Boo` because of return type
-LL |     "" //~ ERROR mismatched types
-   |     ^^ expected anonymized type, found reference
-   |
-   = note: expected type `Boo`
-              found type `&'static str`
-
-error[E0308]: mismatched types
-  --> $DIR/existential_type.rs:50:23
-   |
-LL |         let _: &str = bomp(); //~ ERROR mismatched types
-   |                       ^^^^^^ expected &str, found anonymized type
-   |
-   = note: expected type `&str`
-              found type `Boo`
-
-error[E0308]: mismatched types
-  --> $DIR/existential_type.rs:54:9
-   |
-LL |     fn bomp() -> boo::Boo {
-   |                  -------- expected `Boo` because of return type
-LL |         "" //~ ERROR mismatched types
-   |         ^^ expected anonymized type, found reference
-   |
-   = note: expected type `Boo`
-              found type `&'static str`
-
-error[E0277]: the trait bound `T: Trait` is not satisfied
-  --> $DIR/existential_type.rs:61:1
-   |
-LL | existential type Underconstrained<T: Trait>: 'static; //~ ERROR the trait bound `T: Trait`
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `T`
-   |
-   = help: consider adding a `where T: Trait` bound
-   = note: the return type of a function must have a statically known size
-
-warning: not reporting region error due to nll
-  --> $DIR/existential_type.rs:78:1
-   |
-LL | existential type WrongGeneric<T>: 'static;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0308]: mismatched types
-  --> $DIR/existential_type.rs:93:27
-   |
-LL |     let _: &'static str = x; //~ mismatched types
-   |                           ^ expected reference, found anonymized type
-   |
-   = note: expected type `&'static str`
-              found type `NoReveal`
-
-error[E0605]: non-primitive cast: `NoReveal` as `&'static str`
-  --> $DIR/existential_type.rs:94:13
-   |
-LL |     let _ = x as &'static str; //~ non-primitive cast
-   |             ^^^^^^^^^^^^^^^^^
-   |
-   = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
-
-error: could not find defining uses
-  --> $DIR/existential_type.rs:28:1
-   |
-LL | existential type Bar: std::fmt::Debug; //~ ERROR could not find defining uses
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: could not find defining uses
-  --> $DIR/existential_type.rs:32:5
-   |
-LL |     pub existential type Boo: ::std::fmt::Debug; //~ ERROR could not find defining uses
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: defining existential type use differs from previous
-  --> $DIR/existential_type.rs:74:1
-   |
-LL | / fn my_iter2<T>(t: T) -> MyIter<T> { //~ ERROR defining existential type use differs from previous
-LL | |     Some(t).into_iter()
-LL | | }
-   | |_^
-   |
-note: previous use here
-  --> $DIR/existential_type.rs:70:1
-   |
-LL | / fn my_iter<T>(t: T) -> MyIter<T> {
-LL | |     std::iter::once(t)
-LL | | }
-   | |_^
-
-error: aborting due to 10 previous errors
-
-Some errors occurred: E0277, E0308, E0605.
-For more information about an error, try `rustc --explain E0277`.
diff --git a/src/test/ui/existential_types/existential_type.rs b/src/test/ui/existential_types/existential_type.rs
deleted file mode 100644
index 6824d362049..00000000000
--- a/src/test/ui/existential_types/existential_type.rs
+++ /dev/null
@@ -1,95 +0,0 @@
-// 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.
-
-
-#![feature(existential_type)]
-
-fn main() {}
-
-// two definitions with different types
-existential type Foo: std::fmt::Debug;
-
-fn foo() -> Foo {
-    ""
-}
-
-fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
-    42i32
-}
-
-// declared but never defined
-existential type Bar: std::fmt::Debug; //~ ERROR could not find defining uses
-
-mod boo {
-    // declared in module but not defined inside of it
-    pub existential type Boo: ::std::fmt::Debug; //~ ERROR could not find defining uses
-}
-
-fn bomp() -> boo::Boo {
-    "" //~ ERROR mismatched types
-}
-
-mod boo2 {
-    mod boo {
-        pub existential type Boo: ::std::fmt::Debug;
-        fn bomp() -> Boo {
-            ""
-        }
-    }
-
-    // don't actually know the type here
-
-    fn bomp2() {
-        let _: &str = bomp(); //~ ERROR mismatched types
-    }
-
-    fn bomp() -> boo::Boo {
-        "" //~ ERROR mismatched types
-    }
-}
-
-// generics
-
-trait Trait {}
-existential type Underconstrained<T: Trait>: 'static; //~ ERROR the trait bound `T: Trait`
-
-// no `Trait` bound
-fn underconstrain<T>(_: T) -> Underconstrained<T> {
-    unimplemented!()
-}
-
-existential type MyIter<T>: Iterator<Item = T>;
-
-fn my_iter<T>(t: T) -> MyIter<T> {
-    std::iter::once(t)
-}
-
-fn my_iter2<T>(t: T) -> MyIter<T> { //~ ERROR defining existential type use differs from previous
-    Some(t).into_iter()
-}
-
-existential type WrongGeneric<T>: 'static;
-//~^ ERROR the parameter type `T` may not live long enough
-
-fn wrong_generic<T>(t: T) -> WrongGeneric<T> {
-    t
-}
-
-// don't reveal the concrete type
-existential type NoReveal: std::fmt::Debug;
-
-fn define_no_reveal() -> NoReveal {
-    ""
-}
-
-fn no_reveal(x: NoReveal) {
-    let _: &'static str = x; //~ mismatched types
-    let _ = x as &'static str; //~ non-primitive cast
-}
diff --git a/src/test/ui/existential_types/existential_type.stderr b/src/test/ui/existential_types/existential_type.stderr
deleted file mode 100644
index 3e7476448bf..00000000000
--- a/src/test/ui/existential_types/existential_type.stderr
+++ /dev/null
@@ -1,120 +0,0 @@
-error: defining existential type use differs from previous
-  --> $DIR/existential_type.rs:23:1
-   |
-LL | / fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
-LL | |     42i32
-LL | | }
-   | |_^
-   |
-note: previous use here
-  --> $DIR/existential_type.rs:19:1
-   |
-LL | / fn foo() -> Foo {
-LL | |     ""
-LL | | }
-   | |_^
-
-error[E0308]: mismatched types
-  --> $DIR/existential_type.rs:36:5
-   |
-LL | fn bomp() -> boo::Boo {
-   |              -------- expected `Boo` because of return type
-LL |     "" //~ ERROR mismatched types
-   |     ^^ expected anonymized type, found reference
-   |
-   = note: expected type `Boo`
-              found type `&'static str`
-
-error[E0308]: mismatched types
-  --> $DIR/existential_type.rs:50:23
-   |
-LL |         let _: &str = bomp(); //~ ERROR mismatched types
-   |                       ^^^^^^ expected &str, found anonymized type
-   |
-   = note: expected type `&str`
-              found type `Boo`
-
-error[E0308]: mismatched types
-  --> $DIR/existential_type.rs:54:9
-   |
-LL |     fn bomp() -> boo::Boo {
-   |                  -------- expected `Boo` because of return type
-LL |         "" //~ ERROR mismatched types
-   |         ^^ expected anonymized type, found reference
-   |
-   = note: expected type `Boo`
-              found type `&'static str`
-
-error[E0277]: the trait bound `T: Trait` is not satisfied
-  --> $DIR/existential_type.rs:61:1
-   |
-LL | existential type Underconstrained<T: Trait>: 'static; //~ ERROR the trait bound `T: Trait`
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `T`
-   |
-   = help: consider adding a `where T: Trait` bound
-   = note: the return type of a function must have a statically known size
-
-error[E0310]: the parameter type `T` may not live long enough
-  --> $DIR/existential_type.rs:78:1
-   |
-LL | existential type WrongGeneric<T>: 'static;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-...
-LL | fn wrong_generic<T>(t: T) -> WrongGeneric<T> {
-   |                  - help: consider adding an explicit lifetime bound `T: 'static`...
-   |
-note: ...so that the type `T` will meet its required lifetime bounds
-  --> $DIR/existential_type.rs:78:1
-   |
-LL | existential type WrongGeneric<T>: 'static;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0308]: mismatched types
-  --> $DIR/existential_type.rs:93:27
-   |
-LL |     let _: &'static str = x; //~ mismatched types
-   |                           ^ expected reference, found anonymized type
-   |
-   = note: expected type `&'static str`
-              found type `NoReveal`
-
-error[E0605]: non-primitive cast: `NoReveal` as `&'static str`
-  --> $DIR/existential_type.rs:94:13
-   |
-LL |     let _ = x as &'static str; //~ non-primitive cast
-   |             ^^^^^^^^^^^^^^^^^
-   |
-   = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
-
-error: could not find defining uses
-  --> $DIR/existential_type.rs:28:1
-   |
-LL | existential type Bar: std::fmt::Debug; //~ ERROR could not find defining uses
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: could not find defining uses
-  --> $DIR/existential_type.rs:32:5
-   |
-LL |     pub existential type Boo: ::std::fmt::Debug; //~ ERROR could not find defining uses
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: defining existential type use differs from previous
-  --> $DIR/existential_type.rs:74:1
-   |
-LL | / fn my_iter2<T>(t: T) -> MyIter<T> { //~ ERROR defining existential type use differs from previous
-LL | |     Some(t).into_iter()
-LL | | }
-   | |_^
-   |
-note: previous use here
-  --> $DIR/existential_type.rs:70:1
-   |
-LL | / fn my_iter<T>(t: T) -> MyIter<T> {
-LL | |     std::iter::once(t)
-LL | | }
-   | |_^
-
-error: aborting due to 11 previous errors
-
-Some errors occurred: E0277, E0308, E0310, E0605.
-For more information about an error, try `rustc --explain E0277`.
diff --git a/src/test/ui/existential_types/generic_different_defining_uses.rs b/src/test/ui/existential_types/generic_different_defining_uses.rs
new file mode 100644
index 00000000000..109f1cd9132
--- /dev/null
+++ b/src/test/ui/existential_types/generic_different_defining_uses.rs
@@ -0,0 +1,24 @@
+// 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.
+
+
+#![feature(existential_type)]
+
+fn main() {}
+
+existential type MyIter<T>: Iterator<Item = T>;
+
+fn my_iter<T>(t: T) -> MyIter<T> {
+    std::iter::once(t)
+}
+
+fn my_iter2<T>(t: T) -> MyIter<T> { //~ ERROR defining existential type use differs from previous
+    Some(t).into_iter()
+}
diff --git a/src/test/ui/existential_types/generic_different_defining_uses.stderr b/src/test/ui/existential_types/generic_different_defining_uses.stderr
new file mode 100644
index 00000000000..bc71af4c9af
--- /dev/null
+++ b/src/test/ui/existential_types/generic_different_defining_uses.stderr
@@ -0,0 +1,18 @@
+error: defining existential type use differs from previous
+  --> $DIR/generic_different_defining_uses.rs:22:1
+   |
+LL | / fn my_iter2<T>(t: T) -> MyIter<T> { //~ ERROR defining existential type use differs from previous
+LL | |     Some(t).into_iter()
+LL | | }
+   | |_^
+   |
+note: previous use here
+  --> $DIR/generic_different_defining_uses.rs:18:1
+   |
+LL | / fn my_iter<T>(t: T) -> MyIter<T> {
+LL | |     std::iter::once(t)
+LL | | }
+   | |_^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/existential_types/existential_type4.rs b/src/test/ui/existential_types/generic_nondefining_use.rs
index a4b74d6751b..a4b74d6751b 100644
--- a/src/test/ui/existential_types/existential_type4.rs
+++ b/src/test/ui/existential_types/generic_nondefining_use.rs
diff --git a/src/test/ui/existential_types/existential_type4.stderr b/src/test/ui/existential_types/generic_nondefining_use.stderr
index b11988746ea..3c826708649 100644
--- a/src/test/ui/existential_types/existential_type4.stderr
+++ b/src/test/ui/existential_types/generic_nondefining_use.stderr
@@ -1,5 +1,5 @@
 error: non-defining existential type use in defining scope
-  --> $DIR/existential_type4.rs:19:1
+  --> $DIR/generic_nondefining_use.rs:19:1
    |
 LL | / fn cmp() -> Cmp<u32> { //~ ERROR non-defining existential type use in defining scope
 LL | |     5u32
@@ -7,7 +7,7 @@ LL | | }
    | |_^
    |
 note: used non-generic type u32 for generic parameter
-  --> $DIR/existential_type4.rs:16:22
+  --> $DIR/generic_nondefining_use.rs:16:22
    |
 LL | existential type Cmp<T>: 'static;
    |                      ^
diff --git a/src/test/ui/existential_types/existential_type3.rs b/src/test/ui/existential_types/generic_not_used.rs
index b090cf26b87..b090cf26b87 100644
--- a/src/test/ui/existential_types/existential_type3.rs
+++ b/src/test/ui/existential_types/generic_not_used.rs
diff --git a/src/test/ui/existential_types/existential_type3.stderr b/src/test/ui/existential_types/generic_not_used.stderr
index 90800728d7c..34d82c0ddb0 100644
--- a/src/test/ui/existential_types/existential_type3.stderr
+++ b/src/test/ui/existential_types/generic_not_used.stderr
@@ -1,5 +1,5 @@
 error: type parameter `V` is part of concrete type but not used in parameter list for existential type
-  --> $DIR/existential_type3.rs:18:73
+  --> $DIR/generic_not_used.rs:18:73
    |
 LL |   fn wrong_generic<U: 'static, V: 'static>(_: U, v: V) -> WrongGeneric<U> {
    |  _________________________________________________________________________^
diff --git a/src/test/ui/existential_types/generic_type_does_not_live_long_enough.nll.stderr b/src/test/ui/existential_types/generic_type_does_not_live_long_enough.nll.stderr
new file mode 100644
index 00000000000..8a6cae08ce0
--- /dev/null
+++ b/src/test/ui/existential_types/generic_type_does_not_live_long_enough.nll.stderr
@@ -0,0 +1,17 @@
+warning: not reporting region error due to nll
+  --> $DIR/generic_type_does_not_live_long_enough.rs:16:1
+   |
+LL | existential type WrongGeneric<T>: 'static;
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0310]: the parameter type `T` may not live long enough
+  --> $DIR/generic_type_does_not_live_long_enough.rs:20:5
+   |
+LL |     t
+   |     ^
+   |
+   = help: consider adding an explicit lifetime bound `T: 'static`...
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0310`.
diff --git a/src/test/ui/existential_types/generic_type_does_not_live_long_enough.rs b/src/test/ui/existential_types/generic_type_does_not_live_long_enough.rs
new file mode 100644
index 00000000000..092aa1eda16
--- /dev/null
+++ b/src/test/ui/existential_types/generic_type_does_not_live_long_enough.rs
@@ -0,0 +1,21 @@
+// 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.
+
+
+#![feature(existential_type)]
+
+fn main() {}
+
+existential type WrongGeneric<T>: 'static;
+//~^ ERROR the parameter type `T` may not live long enough
+
+fn wrong_generic<T>(t: T) -> WrongGeneric<T> {
+    t
+}
diff --git a/src/test/ui/existential_types/generic_type_does_not_live_long_enough.stderr b/src/test/ui/existential_types/generic_type_does_not_live_long_enough.stderr
new file mode 100644
index 00000000000..cbf994defc8
--- /dev/null
+++ b/src/test/ui/existential_types/generic_type_does_not_live_long_enough.stderr
@@ -0,0 +1,18 @@
+error[E0310]: the parameter type `T` may not live long enough
+  --> $DIR/generic_type_does_not_live_long_enough.rs:16:1
+   |
+LL | existential type WrongGeneric<T>: 'static;
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+...
+LL | fn wrong_generic<T>(t: T) -> WrongGeneric<T> {
+   |                  - help: consider adding an explicit lifetime bound `T: 'static`...
+   |
+note: ...so that the type `T` will meet its required lifetime bounds
+  --> $DIR/generic_type_does_not_live_long_enough.rs:16:1
+   |
+LL | existential type WrongGeneric<T>: 'static;
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0310`.
diff --git a/src/test/ui/existential_types/generic_underconstrained.rs b/src/test/ui/existential_types/generic_underconstrained.rs
new file mode 100644
index 00000000000..fdc7a7935a2
--- /dev/null
+++ b/src/test/ui/existential_types/generic_underconstrained.rs
@@ -0,0 +1,22 @@
+// 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.
+
+
+#![feature(existential_type)]
+
+fn main() {}
+
+trait Trait {}
+existential type Underconstrained<T: Trait>: 'static; //~ ERROR the trait bound `T: Trait`
+
+// no `Trait` bound
+fn underconstrain<T>(_: T) -> Underconstrained<T> {
+    unimplemented!()
+}
diff --git a/src/test/ui/existential_types/generic_underconstrained.stderr b/src/test/ui/existential_types/generic_underconstrained.stderr
new file mode 100644
index 00000000000..1454ba575b1
--- /dev/null
+++ b/src/test/ui/existential_types/generic_underconstrained.stderr
@@ -0,0 +1,12 @@
+error[E0277]: the trait bound `T: Trait` is not satisfied
+  --> $DIR/generic_underconstrained.rs:17:1
+   |
+LL | existential type Underconstrained<T: Trait>: 'static; //~ ERROR the trait bound `T: Trait`
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `T`
+   |
+   = help: consider adding a `where T: Trait` bound
+   = note: the return type of a function must have a statically known size
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/src/test/ui/existential_types/existential_type2.rs b/src/test/ui/existential_types/generic_underconstrained2.rs
index bffb6b5ee10..bffb6b5ee10 100644
--- a/src/test/ui/existential_types/existential_type2.rs
+++ b/src/test/ui/existential_types/generic_underconstrained2.rs
diff --git a/src/test/ui/existential_types/existential_type2.stderr b/src/test/ui/existential_types/generic_underconstrained2.stderr
index 53003a4f05d..78e79e7fc86 100644
--- a/src/test/ui/existential_types/existential_type2.stderr
+++ b/src/test/ui/existential_types/generic_underconstrained2.stderr
@@ -1,5 +1,5 @@
 error[E0277]: `U` doesn't implement `std::fmt::Debug`
-  --> $DIR/existential_type2.rs:16:1
+  --> $DIR/generic_underconstrained2.rs:16:1
    |
 LL | existential type Underconstrained<T: std::fmt::Debug>: 'static;
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `U` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
@@ -9,7 +9,7 @@ LL | existential type Underconstrained<T: std::fmt::Debug>: 'static;
    = note: the return type of a function must have a statically known size
 
 error[E0277]: `V` doesn't implement `std::fmt::Debug`
-  --> $DIR/existential_type2.rs:24:1
+  --> $DIR/generic_underconstrained2.rs:24:1
    |
 LL | existential type Underconstrained2<T: std::fmt::Debug>: 'static;
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `V` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
diff --git a/src/test/ui/existential_types/never_reveal_concrete_type.rs b/src/test/ui/existential_types/never_reveal_concrete_type.rs
new file mode 100644
index 00000000000..4517eca60ed
--- /dev/null
+++ b/src/test/ui/existential_types/never_reveal_concrete_type.rs
@@ -0,0 +1,26 @@
+// 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.
+
+
+#![feature(existential_type)]
+
+fn main() {}
+
+// don't reveal the concrete type
+existential type NoReveal: std::fmt::Debug;
+
+fn define_no_reveal() -> NoReveal {
+    ""
+}
+
+fn no_reveal(x: NoReveal) {
+    let _: &'static str = x; //~ mismatched types
+    let _ = x as &'static str; //~ non-primitive cast
+}
diff --git a/src/test/ui/existential_types/never_reveal_concrete_type.stderr b/src/test/ui/existential_types/never_reveal_concrete_type.stderr
new file mode 100644
index 00000000000..449799c91b7
--- /dev/null
+++ b/src/test/ui/existential_types/never_reveal_concrete_type.stderr
@@ -0,0 +1,21 @@
+error[E0308]: mismatched types
+  --> $DIR/never_reveal_concrete_type.rs:24:27
+   |
+LL |     let _: &'static str = x; //~ mismatched types
+   |                           ^ expected reference, found anonymized type
+   |
+   = note: expected type `&'static str`
+              found type `NoReveal`
+
+error[E0605]: non-primitive cast: `NoReveal` as `&'static str`
+  --> $DIR/never_reveal_concrete_type.rs:25:13
+   |
+LL |     let _ = x as &'static str; //~ non-primitive cast
+   |             ^^^^^^^^^^^^^^^^^
+   |
+   = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
+
+error: aborting due to 2 previous errors
+
+Some errors occurred: E0308, E0605.
+For more information about an error, try `rustc --explain E0308`.
diff --git a/src/test/ui/existential_types/no_revealing_outside_defining_module.rs b/src/test/ui/existential_types/no_revealing_outside_defining_module.rs
new file mode 100644
index 00000000000..086df13ba70
--- /dev/null
+++ b/src/test/ui/existential_types/no_revealing_outside_defining_module.rs
@@ -0,0 +1,33 @@
+// 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.
+
+
+#![feature(existential_type)]
+
+fn main() {}
+
+mod boo2 {
+    mod boo {
+        pub existential type Boo: ::std::fmt::Debug;
+        fn bomp() -> Boo {
+            ""
+        }
+    }
+
+    // don't actually know the type here
+
+    fn bomp2() {
+        let _: &str = bomp(); //~ ERROR mismatched types
+    }
+
+    fn bomp() -> boo::Boo {
+        "" //~ ERROR mismatched types
+    }
+}
diff --git a/src/test/ui/existential_types/no_revealing_outside_defining_module.stderr b/src/test/ui/existential_types/no_revealing_outside_defining_module.stderr
new file mode 100644
index 00000000000..eebd3295489
--- /dev/null
+++ b/src/test/ui/existential_types/no_revealing_outside_defining_module.stderr
@@ -0,0 +1,23 @@
+error[E0308]: mismatched types
+  --> $DIR/no_revealing_outside_defining_module.rs:27:23
+   |
+LL |         let _: &str = bomp(); //~ ERROR mismatched types
+   |                       ^^^^^^ expected &str, found anonymized type
+   |
+   = note: expected type `&str`
+              found type `Boo`
+
+error[E0308]: mismatched types
+  --> $DIR/no_revealing_outside_defining_module.rs:31:9
+   |
+LL |     fn bomp() -> boo::Boo {
+   |                  -------- expected `Boo` because of return type
+LL |         "" //~ ERROR mismatched types
+   |         ^^ expected anonymized type, found reference
+   |
+   = note: expected type `Boo`
+              found type `&'static str`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.