about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlexander Regueiro <alexreg@me.com>2018-11-01 18:17:58 +0000
committerAlexander Regueiro <alexreg@me.com>2018-11-03 04:09:35 +0000
commitc04559fe9eb14e59cfe35c2676cd5d93a5eab326 (patch)
tree1f9b88d88f54fe90d5d1e5e438c7fc6ca210d82b
parenta62d0785a6b0770f2241a3e91853d842609d4d7c (diff)
downloadrust-c04559fe9eb14e59cfe35c2676cd5d93a5eab326.tar.gz
rust-c04559fe9eb14e59cfe35c2676cd5d93a5eab326.zip
Added WF checking for trait alias definitions.
-rw-r--r--src/librustc_typeck/check/wfcheck.rs3
-rw-r--r--src/test/ui/traits/trait-alias-fail1.stderr46
-rw-r--r--src/test/ui/traits/trait-alias-fail2.stderr19
-rw-r--r--src/test/ui/traits/trait-alias-impl.rs17
-rw-r--r--src/test/ui/traits/trait-alias-impl.stderr9
-rw-r--r--src/test/ui/traits/trait-alias-objects.rs (renamed from src/test/ui/traits/trait-alias-fail2.rs)0
-rw-r--r--src/test/ui/traits/trait-alias-objects.stderr18
-rw-r--r--src/test/ui/traits/trait-alias-wf.rs (renamed from src/test/ui/traits/trait-alias-fail1.rs)7
-rw-r--r--src/test/ui/traits/trait-alias-wf.stderr16
9 files changed, 64 insertions, 71 deletions
diff --git a/src/librustc_typeck/check/wfcheck.rs b/src/librustc_typeck/check/wfcheck.rs
index ea84e874b1a..527ba276de2 100644
--- a/src/librustc_typeck/check/wfcheck.rs
+++ b/src/librustc_typeck/check/wfcheck.rs
@@ -153,6 +153,9 @@ pub fn check_item_well_formed<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: Def
         hir::ItemKind::Trait(..) => {
             check_trait(tcx, item);
         }
+        hir::ItemKind::TraitAlias(..) => {
+            check_trait(tcx, item);
+        }
         _ => {}
     }
 }
diff --git a/src/test/ui/traits/trait-alias-fail1.stderr b/src/test/ui/traits/trait-alias-fail1.stderr
deleted file mode 100644
index 447f4b1b9de..00000000000
--- a/src/test/ui/traits/trait-alias-fail1.stderr
+++ /dev/null
@@ -1,46 +0,0 @@
-error: type parameters on the left side of a trait alias cannot be bounded
-  --> $DIR/trait-alias-fail1.rs:14:20
-   |
-LL | trait BoundedAlias<T: Clone = ()> = Default;
-   |                    ^
-
-error: type parameters on the left side of a trait alias cannot have defaults
-  --> $DIR/trait-alias-fail1.rs:14:20
-   |
-LL | trait BoundedAlias<T: Clone = ()> = Default;
-   |                    ^
-
-error[E0404]: expected trait, found trait alias `CloneDefault`
-  --> $DIR/trait-alias-fail1.rs:19:6
-   |
-LL | impl CloneDefault for () {}
-   |      ^^^^^^^^^^^^ not a trait
-
-error[E0658]: trait aliases are experimental (see issue #41517)
-  --> $DIR/trait-alias-fail1.rs:13:1
-   |
-LL | trait CloneDefault<T> = Default where T: Clone;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = help: add #![feature(trait_alias)] to the crate attributes to enable
-
-error[E0658]: trait aliases are experimental (see issue #41517)
-  --> $DIR/trait-alias-fail1.rs:14:1
-   |
-LL | trait BoundedAlias<T: Clone = ()> = Default;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = help: add #![feature(trait_alias)] to the crate attributes to enable
-
-error[E0658]: trait aliases are experimental (see issue #41517)
-  --> $DIR/trait-alias-fail1.rs:17:1
-   |
-LL | trait B<T> = A<T>; // FIXME: parameter T should need a bound here, or semantics should be changed
-   | ^^^^^^^^^^^^^^^^^^
-   |
-   = help: add #![feature(trait_alias)] to the crate attributes to enable
-
-error: aborting due to 6 previous errors
-
-Some errors occurred: E0404, E0658.
-For more information about an error, try `rustc --explain E0404`.
diff --git a/src/test/ui/traits/trait-alias-fail2.stderr b/src/test/ui/traits/trait-alias-fail2.stderr
deleted file mode 100644
index 6ebd8b5e731..00000000000
--- a/src/test/ui/traits/trait-alias-fail2.stderr
+++ /dev/null
@@ -1,19 +0,0 @@
-error[E0658]: trait aliases are experimental (see issue #41517)
-  --> $DIR/trait-alias-fail2.rs:13:1
-   |
-LL | trait EqAlias = Eq;
-   | ^^^^^^^^^^^^^^^^^^^
-   |
-   = help: add #![feature(trait_alias)] to the crate attributes to enable
-
-error[E0658]: trait aliases are experimental (see issue #41517)
-  --> $DIR/trait-alias-fail2.rs:14:1
-   |
-LL | trait IteratorAlias = Iterator;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = help: add #![feature(trait_alias)] to the crate attributes to enable
-
-error: aborting due to 2 previous errors
-
-For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/traits/trait-alias-impl.rs b/src/test/ui/traits/trait-alias-impl.rs
new file mode 100644
index 00000000000..bf3483000e3
--- /dev/null
+++ b/src/test/ui/traits/trait-alias-impl.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(trait_alias)]
+
+trait DefaultAlias = Default;
+
+impl DefaultAlias for () {}
+
+fn main() {}
diff --git a/src/test/ui/traits/trait-alias-impl.stderr b/src/test/ui/traits/trait-alias-impl.stderr
new file mode 100644
index 00000000000..9ad625176b1
--- /dev/null
+++ b/src/test/ui/traits/trait-alias-impl.stderr
@@ -0,0 +1,9 @@
+error[E0404]: expected trait, found trait alias `DefaultAlias`
+  --> $DIR/trait-alias-impl.rs:15:6
+   |
+LL | impl DefaultAlias for () {}
+   |      ^^^^^^^^^^^^ not a trait
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0404`.
diff --git a/src/test/ui/traits/trait-alias-fail2.rs b/src/test/ui/traits/trait-alias-objects.rs
index 3adcd8436d8..3adcd8436d8 100644
--- a/src/test/ui/traits/trait-alias-fail2.rs
+++ b/src/test/ui/traits/trait-alias-objects.rs
diff --git a/src/test/ui/traits/trait-alias-objects.stderr b/src/test/ui/traits/trait-alias-objects.stderr
new file mode 100644
index 00000000000..8f9681e898f
--- /dev/null
+++ b/src/test/ui/traits/trait-alias-objects.stderr
@@ -0,0 +1,18 @@
+error[E0038]: the trait `EqAlias` cannot be made into an object
+  --> $DIR/trait-alias-objects.rs:17:13
+   |
+LL |     let _: &dyn EqAlias = &123;
+   |             ^^^^^^^^^^^ the trait `EqAlias` cannot be made into an object
+   |
+   = note: the trait cannot use `Self` as a type parameter in the supertraits or where-clauses
+
+error[E0191]: the value of the associated type `Item` (from the trait `std::iter::Iterator`) must be specified
+  --> $DIR/trait-alias-objects.rs:18:13
+   |
+LL |     let _: &dyn IteratorAlias = &vec![123].into_iter();
+   |             ^^^^^^^^^^^^^^^^^ missing associated type `Item` value
+
+error: aborting due to 2 previous errors
+
+Some errors occurred: E0038, E0191.
+For more information about an error, try `rustc --explain E0038`.
diff --git a/src/test/ui/traits/trait-alias-fail1.rs b/src/test/ui/traits/trait-alias-wf.rs
index 25c850db6ce..8c8ce1221ba 100644
--- a/src/test/ui/traits/trait-alias-fail1.rs
+++ b/src/test/ui/traits/trait-alias-wf.rs
@@ -1,4 +1,4 @@
-// Copyright 2017-2018 The Rust Project Developers. See the COPYRIGHT
+// 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.
 //
@@ -10,13 +10,8 @@
 
 #![feature(trait_alias)]
 
-trait CloneDefault<T> = Default where T: Clone;
-trait BoundedAlias<T: Clone = ()> = Default;
-
 trait Foo {}
 trait A<T: Foo> {}
 trait B<T> = A<T>; // T cannot be unbounded
 
-impl CloneDefault for () {}
-
 fn main() {}
diff --git a/src/test/ui/traits/trait-alias-wf.stderr b/src/test/ui/traits/trait-alias-wf.stderr
new file mode 100644
index 00000000000..e8c81c87796
--- /dev/null
+++ b/src/test/ui/traits/trait-alias-wf.stderr
@@ -0,0 +1,16 @@
+error[E0277]: the trait bound `T: Foo` is not satisfied
+  --> $DIR/trait-alias-wf.rs:15:1
+   |
+LL | trait B<T> = A<T>; // T cannot be unbounded
+   | ^^^^^^^^^^^^^^^^^^ the trait `Foo` is not implemented for `T`
+   |
+   = help: consider adding a `where T: Foo` bound
+note: required by `A`
+  --> $DIR/trait-alias-wf.rs:14:1
+   |
+LL | trait A<T: Foo> {}
+   | ^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.