diff options
| author | Alexander Regueiro <alexreg@me.com> | 2018-11-01 18:17:58 +0000 |
|---|---|---|
| committer | Alexander Regueiro <alexreg@me.com> | 2018-11-03 04:09:35 +0000 |
| commit | c04559fe9eb14e59cfe35c2676cd5d93a5eab326 (patch) | |
| tree | 1f9b88d88f54fe90d5d1e5e438c7fc6ca210d82b | |
| parent | a62d0785a6b0770f2241a3e91853d842609d4d7c (diff) | |
| download | rust-c04559fe9eb14e59cfe35c2676cd5d93a5eab326.tar.gz rust-c04559fe9eb14e59cfe35c2676cd5d93a5eab326.zip | |
Added WF checking for trait alias definitions.
| -rw-r--r-- | src/librustc_typeck/check/wfcheck.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/traits/trait-alias-fail1.stderr | 46 | ||||
| -rw-r--r-- | src/test/ui/traits/trait-alias-fail2.stderr | 19 | ||||
| -rw-r--r-- | src/test/ui/traits/trait-alias-impl.rs | 17 | ||||
| -rw-r--r-- | src/test/ui/traits/trait-alias-impl.stderr | 9 | ||||
| -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.stderr | 18 | ||||
| -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.stderr | 16 |
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`. |
