From a8fcfcef3087e9770fa016c5776ce5bf25558ed7 Mon Sep 17 00:00:00 2001 From: Alexander Regueiro Date: Thu, 25 Oct 2018 01:03:25 +0100 Subject: [PATCH] Add more tests. --- .../run-pass/traits/trait-alias-bounds.rs | 62 +++++++++++++++---- .../traits/trait-alias-object-type.rs | 8 ++- src/test/ui/traits/trait-alias-fail.stderr | 38 ------------ ...ait-alias-fail.rs => trait-alias-fail1.rs} | 9 +-- src/test/ui/traits/trait-alias-fail1.stderr | 46 ++++++++++++++ src/test/ui/traits/trait-alias-fail2.rs | 19 ++++++ src/test/ui/traits/trait-alias-fail2.stderr | 19 ++++++ 7 files changed, 147 insertions(+), 54 deletions(-) delete mode 100644 src/test/ui/traits/trait-alias-fail.stderr rename src/test/ui/traits/{trait-alias-fail.rs => trait-alias-fail1.rs} (68%) create mode 100644 src/test/ui/traits/trait-alias-fail1.stderr create mode 100644 src/test/ui/traits/trait-alias-fail2.rs create mode 100644 src/test/ui/traits/trait-alias-fail2.stderr diff --git a/src/test/run-pass/traits/trait-alias-bounds.rs b/src/test/run-pass/traits/trait-alias-bounds.rs index 0d59c8e0bd13..c1c3989107b2 100644 --- a/src/test/run-pass/traits/trait-alias-bounds.rs +++ b/src/test/run-pass/traits/trait-alias-bounds.rs @@ -10,9 +10,14 @@ #![feature(trait_alias)] +use std::marker::PhantomData; + trait SimpleAlias = Default; -trait GenericAlias = Iterator; -trait Partial = IntoIterator; +trait GenericAlias = Iterator; +trait Partial = IntoIterator; +trait SpecificAlias = GenericAlias; +trait PartialEqRef<'a, T> = PartialEq<&'a T>; +trait StaticAlias = 'static; trait Things {} trait Romeo {} @@ -26,19 +31,54 @@ impl Romeo for Fore {} trait WithWhere = Romeo + Romeo where Fore<(Art, Thou)>: Romeo; trait BareWhere = where The: Things; -trait CD = Clone + Default; +trait Empty {} +trait EmptyAlias = Empty; +trait CloneDefault = Clone + Default; +trait SendSyncAlias = Send + Sync; +trait WhereSendAlias = where Self: Send; +trait SendEqAlias = Send where T: PartialEq; +trait I32Iterator = Iterator; -fn foo() -> (T, T) { +#[allow(dead_code)] +struct Foo(PhantomData); +#[allow(dead_code)] +struct Bar(PhantomData) where T: SendSyncAlias; + +impl EmptyAlias {} + +impl Empty for T {} + +fn a() -> (T, T) { let one = T::default(); let two = one.clone(); (one, two) } -fn main() { - let both = foo::(); - assert_eq!(both.0, 0); - assert_eq!(both.1, 0); - let both: (i32, i32) = foo(); - assert_eq!(both.0, 0); - assert_eq!(both.1, 0); +fn b(x: &impl SendEqAlias) -> bool { + 22_i32 == *x +} + +fn c(x: &mut T) -> Option { + x.next() +} + +fn d() { + is_send_and_sync::(); +} + +fn is_send_and_sync() {} + +fn main() { + let both = a::(); + assert_eq!(both.0, 0); + assert_eq!(both.1, 0); + let both: (i32, i32) = a(); + assert_eq!(both.0, 0); + assert_eq!(both.1, 0); + + assert!(b(&22)); + + assert_eq!(c(&mut vec![22].into_iter()), Some(22)); + + d::(); } diff --git a/src/test/run-pass/traits/trait-alias-object-type.rs b/src/test/run-pass/traits/trait-alias-object-type.rs index 3f0be573b289..17e30922b2cb 100644 --- a/src/test/run-pass/traits/trait-alias-object-type.rs +++ b/src/test/run-pass/traits/trait-alias-object-type.rs @@ -13,9 +13,15 @@ trait Foo = PartialEq + Send; trait Bar = Foo + Sync; +trait I32Iterator = Iterator; + pub fn main() { - let a: &Bar = &123; + let a: &dyn Bar = &123; assert!(*a == 123); let b = Box::new(456) as Box; assert!(*b == 456); + + // FIXME(alexreg): associated type should be gotten from trait alias definition + // let c: &dyn I32Iterator = &vec![123].into_iter(); + // assert_eq!(c.next(), Some(123)); } diff --git a/src/test/ui/traits/trait-alias-fail.stderr b/src/test/ui/traits/trait-alias-fail.stderr deleted file mode 100644 index 829a316ccb81..000000000000 --- a/src/test/ui/traits/trait-alias-fail.stderr +++ /dev/null @@ -1,38 +0,0 @@ -error: type parameters on the left side of a trait alias cannot be bounded - --> $DIR/trait-alias-fail.rs:14:14 - | -LL | trait Alias2 = Default; - | ^ - -error: type parameters on the left side of a trait alias cannot have defaults - --> $DIR/trait-alias-fail.rs:14:14 - | -LL | trait Alias2 = Default; - | ^ - -error[E0404]: expected trait, found trait alias `Alias1` - --> $DIR/trait-alias-fail.rs:18:6 - | -LL | impl Alias1 for () {} - | ^^^^^^ not a trait - -error[E0658]: trait aliases are experimental (see issue #41517) - --> $DIR/trait-alias-fail.rs:13:1 - | -LL | trait Alias1 = 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-fail.rs:14:1 - | -LL | trait Alias2 = Default; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = help: add #![feature(trait_alias)] to the crate attributes to enable - -error: aborting due to 5 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-fail.rs b/src/test/ui/traits/trait-alias-fail1.rs similarity index 68% rename from src/test/ui/traits/trait-alias-fail.rs rename to src/test/ui/traits/trait-alias-fail1.rs index 3a47593a8e15..135fdf93c298 100644 --- a/src/test/ui/traits/trait-alias-fail.rs +++ b/src/test/ui/traits/trait-alias-fail1.rs @@ -10,11 +10,12 @@ // gate-test-trait_alias -trait Alias1 = Default where T: Clone; -trait Alias2 = Default; +trait CloneDefault = Default where T: Clone; +trait BoundedAlias = Default; -impl Alias1 {} +trait A {} +trait B = A; // FIXME: parameter T should need a bound here, or semantics should be changed -impl Alias1 for () {} +impl CloneDefault for () {} fn main() {} diff --git a/src/test/ui/traits/trait-alias-fail1.stderr b/src/test/ui/traits/trait-alias-fail1.stderr new file mode 100644 index 000000000000..565409be782e --- /dev/null +++ b/src/test/ui/traits/trait-alias-fail1.stderr @@ -0,0 +1,46 @@ +error: type parameters on the left side of a trait alias cannot be bounded + --> $DIR/trait-alias-fail1.rs:14:20 + | +LL | trait BoundedAlias = 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 = 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 = 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 = 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 = A; // FIXME: this should not work... or should it? + | ^^^^^^^^^^^^^^^^^^ + | + = 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.rs b/src/test/ui/traits/trait-alias-fail2.rs new file mode 100644 index 000000000000..3d32cf6d29b6 --- /dev/null +++ b/src/test/ui/traits/trait-alias-fail2.rs @@ -0,0 +1,19 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// gate-test-trait_alias + +trait EqAlias = Eq; +trait IteratorAlias = Iterator; + +fn main() { + let _: &dyn EqAlias = &123; + let _: &dyn IteratorAlias = &vec![123].into_iter(); +} diff --git a/src/test/ui/traits/trait-alias-fail2.stderr b/src/test/ui/traits/trait-alias-fail2.stderr new file mode 100644 index 000000000000..6ebd8b5e7317 --- /dev/null +++ b/src/test/ui/traits/trait-alias-fail2.stderr @@ -0,0 +1,19 @@ +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`.