diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2015-02-18 10:39:39 -0500 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2015-02-24 16:27:23 -0500 |
| commit | cf73e36ab01f48c883808cf58af5baed8d697538 (patch) | |
| tree | df572dae3d1746c585295696c7af076ad1945e3d /src/test | |
| parent | 36d04711b774dd97d8341881d26786733a5a6561 (diff) | |
| download | rust-cf73e36ab01f48c883808cf58af5baed8d697538.tar.gz rust-cf73e36ab01f48c883808cf58af5baed8d697538.zip | |
Rework trait-bound-conversion so be based on the AST and rework collect
to pass in the appropriate ast::generics etc
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/compile-fail/associated-type-projection-ambig-between-bound-and-where-clause.rs | 52 | ||||
| -rw-r--r-- | src/test/compile-fail/cycle-projection-based-on-where-clause.rs | 34 | ||||
| -rw-r--r-- | src/test/compile-fail/cycle-trait-supertrait-direct.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/cycle-trait-supertrait-indirect.rs | 2 | ||||
| -rw-r--r-- | src/test/run-pass/associated-types-project-from-type-param-via-bound-in-where-clause.rs | 107 | ||||
| -rw-r--r-- | src/test/run-pass/cycle-generic-bound.rs (renamed from src/test/compile-fail/cycle-generic-bound.rs) | 9 | ||||
| -rw-r--r-- | src/test/run-pass/cycle-trait-type-trait.rs (renamed from src/test/compile-fail/cycle-trait-type-trait.rs) | 6 |
7 files changed, 202 insertions, 10 deletions
diff --git a/src/test/compile-fail/associated-type-projection-ambig-between-bound-and-where-clause.rs b/src/test/compile-fail/associated-type-projection-ambig-between-bound-and-where-clause.rs new file mode 100644 index 00000000000..ce97019a2b2 --- /dev/null +++ b/src/test/compile-fail/associated-type-projection-ambig-between-bound-and-where-clause.rs @@ -0,0 +1,52 @@ +// Copyright 2014 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. + +// Test equality constraints in a where clause where the type being +// equated appears in a supertrait. + +pub trait Vehicle { + type Color; + + fn go(&self) { } +} + +pub trait Box { + type Color; + + fn mail(&self) { } +} + +fn a<C:Vehicle+Box>(_: C::Color) { + //~^ ERROR ambiguous associated type `Color` in bounds of `C` +} + +fn b<C>(_: C::Color) where C : Vehicle+Box { + //~^ ERROR ambiguous associated type `Color` in bounds of `C` +} + +fn c<C>(_: C::Color) where C : Vehicle, C : Box { + //~^ ERROR ambiguous associated type `Color` in bounds of `C` +} + +struct D<X>; +impl<X> D<X> where X : Vehicle { + fn d(&self, _: X::Color) where X : Box { } + //~^ ERROR ambiguous associated type `Color` in bounds of `X` +} + +trait E<X:Vehicle> { + fn e(&self, _: X::Color) where X : Box; + //~^ ERROR ambiguous associated type `Color` in bounds of `X` + + fn f(&self, _: X::Color) where X : Box { } + //~^ ERROR ambiguous associated type `Color` in bounds of `X` +} + +pub fn main() { } diff --git a/src/test/compile-fail/cycle-projection-based-on-where-clause.rs b/src/test/compile-fail/cycle-projection-based-on-where-clause.rs new file mode 100644 index 00000000000..abcbf567d44 --- /dev/null +++ b/src/test/compile-fail/cycle-projection-based-on-where-clause.rs @@ -0,0 +1,34 @@ +// Copyright 2015 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. + +// Example cycle where a bound on `T` uses a shorthand for `T`. This +// creates a cycle because we have to know the bounds on `T` to figure +// out what trait defines `Item`, but we can't know the bounds on `T` +// without knowing how to handle `T::Item`. +// +// Note that in the future cases like this could perhaps become legal, +// if we got more fine-grained about our cycle detection or changed +// how we handle `T::Item` resolution. + +use std::ops::Add; + +// Preamble. +trait Trait { type Item; } + +struct A<T> + where T : Trait, + T : Add<T::Item> + //~^ ERROR illegal recursive type +{ + data: T +} + +fn main() { +} diff --git a/src/test/compile-fail/cycle-trait-supertrait-direct.rs b/src/test/compile-fail/cycle-trait-supertrait-direct.rs index 836b581d2bf..ef3fead18f6 100644 --- a/src/test/compile-fail/cycle-trait-supertrait-direct.rs +++ b/src/test/compile-fail/cycle-trait-supertrait-direct.rs @@ -11,7 +11,7 @@ // Test a supertrait cycle where a trait extends itself. trait Chromosome: Chromosome { - //~^ ERROR cyclic reference detected + //~^ ERROR unsupported cyclic reference } fn main() { } diff --git a/src/test/compile-fail/cycle-trait-supertrait-indirect.rs b/src/test/compile-fail/cycle-trait-supertrait-indirect.rs index 68553462036..6ebd9a1bcb6 100644 --- a/src/test/compile-fail/cycle-trait-supertrait-indirect.rs +++ b/src/test/compile-fail/cycle-trait-supertrait-indirect.rs @@ -15,8 +15,8 @@ trait A: B { } trait B: C { } - //~^ ERROR cyclic reference detected trait C: B { } + //~^ ERROR unsupported cyclic reference fn main() { } diff --git a/src/test/run-pass/associated-types-project-from-type-param-via-bound-in-where-clause.rs b/src/test/run-pass/associated-types-project-from-type-param-via-bound-in-where-clause.rs new file mode 100644 index 00000000000..2243e00ffa1 --- /dev/null +++ b/src/test/run-pass/associated-types-project-from-type-param-via-bound-in-where-clause.rs @@ -0,0 +1,107 @@ +// Copyright 2015 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. + +// Various uses of `T::Item` syntax where the bound that supplies +// `Item` originates in a where-clause, not the declaration of +// `T`. Issue #20300. + +use std::marker::{MarkerTrait, PhantomData}; +use std::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT}; +use std::sync::atomic::Ordering::SeqCst; + +static COUNTER: AtomicUsize = ATOMIC_USIZE_INIT; + +// Preamble. +trait Trait : MarkerTrait { type Item; } +struct Struct; +impl Trait for Struct { + type Item = u32; +} + +// Where-clause attached on the method which declares `T`. +struct A; +impl A { + fn foo<T>(_x: T::Item) where T: Trait { + COUNTER.fetch_add(1, SeqCst); + } +} + +// Where-clause attached on the method to a parameter from the struct. +struct B<T>(PhantomData<T>); +impl<T> B<T> { + fn foo(_x: T::Item) where T: Trait { + COUNTER.fetch_add(10, SeqCst); + } +} + +// Where-clause attached to free fn. +fn c<T>(_: T::Item) where T : Trait { + COUNTER.fetch_add(100, SeqCst); +} + +// Where-clause attached to defaulted and non-defaulted trait method. +trait AnotherTrait { + fn method<T>(&self, _: T::Item) where T: Trait; + fn default_method<T>(&self, _: T::Item) where T: Trait { + COUNTER.fetch_add(1000, SeqCst); + } +} +struct D; +impl AnotherTrait for D { + fn method<T>(&self, _: T::Item) where T: Trait { + COUNTER.fetch_add(10000, SeqCst); + } +} + +// Where-clause attached to trait and impl containing the method. +trait YetAnotherTrait<T> + where T : Trait +{ + fn method(&self, _: T::Item); + fn default_method(&self, _: T::Item) { + COUNTER.fetch_add(100000, SeqCst); + } +} +struct E<T>(PhantomData<T>); +impl<T> YetAnotherTrait<T> for E<T> + where T : Trait +{ + fn method(&self, _: T::Item) { + COUNTER.fetch_add(1000000, SeqCst); + } +} + +// Where-clause attached to inherent impl containing the method. +struct F<T>(PhantomData<T>); +impl<T> F<T> where T : Trait { + fn method(&self, _: T::Item) { + COUNTER.fetch_add(10000000, SeqCst); + } +} + +// Where-clause attached to struct. +#[allow(dead_code)] +struct G<T> where T : Trait { + data: T::Item, + phantom: PhantomData<T>, +} + +fn main() { + A::foo::<Struct>(22); + B::<Struct>::foo(22); + c::<Struct>(22); + D.method::<Struct>(22); + D.default_method::<Struct>(22); + E(PhantomData::<Struct>).method(22); + E(PhantomData::<Struct>).default_method(22); + F(PhantomData::<Struct>).method(22); + G::<Struct> { data: 22, phantom: PhantomData }; + assert_eq!(COUNTER.load(SeqCst), 11111111); +} diff --git a/src/test/compile-fail/cycle-generic-bound.rs b/src/test/run-pass/cycle-generic-bound.rs index 51fee683a81..2388a567f30 100644 --- a/src/test/compile-fail/cycle-generic-bound.rs +++ b/src/test/run-pass/cycle-generic-bound.rs @@ -8,12 +8,11 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// Regression test for #15477. This test should pass, vs reporting an -// error as it does now, but at least this test shows it doesn't -// segfault. +// Regression test for #15477. This test just needs to compile. -trait Chromosome<X: Chromosome> { - //~^ ERROR cyclic reference detected +use std::marker::PhantomFn; + +trait Chromosome<X: Chromosome<i32>> : PhantomFn<(Self,X)> { } fn main() { } diff --git a/src/test/compile-fail/cycle-trait-type-trait.rs b/src/test/run-pass/cycle-trait-type-trait.rs index 912961120c2..6e16e686106 100644 --- a/src/test/compile-fail/cycle-trait-type-trait.rs +++ b/src/test/run-pass/cycle-trait-type-trait.rs @@ -8,10 +8,10 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// Test a supertrait cycle where a trait extends itself. +// Test a case where a supertrait references a type that references +// the original trait. This poses no problem at the moment. -trait Chromosome: Get<Struct> { - //~^ ERROR cyclic reference detected +trait Chromosome: Get<Struct<i32>> { } trait Get<A> { |
