-
Notifications
You must be signed in to change notification settings - Fork 13.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add new tests covering various cases.
- Loading branch information
1 parent
d913239
commit d31105e
Showing
2 changed files
with
107 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
// 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. | ||
|
||
struct MyType; | ||
|
||
struct MyType1<T>(T); | ||
|
||
trait Bar { | ||
type Out; | ||
} | ||
|
||
impl<T> MyType { | ||
//~^ ERROR the type parameter `T` is not constrained | ||
} | ||
|
||
impl<T> MyType1<T> { | ||
// OK, T is used in `Foo<T>`. | ||
} | ||
|
||
impl<T,U> MyType1<T> { | ||
//~^ ERROR the type parameter `U` is not constrained | ||
} | ||
|
||
impl<T,U> MyType1<T> where T: Bar<Out=U> { | ||
// OK, T is used in `Foo<T>`. | ||
} | ||
|
||
fn main() { } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
// 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. | ||
|
||
trait Foo<A> { | ||
fn get(&self, A: &A) { } | ||
} | ||
|
||
trait Bar { | ||
type Out; | ||
} | ||
|
||
impl<T> Foo<T> for [int;0] { | ||
// OK, T is used in `Foo<T>`. | ||
} | ||
|
||
impl<T,U> Foo<T> for [int;1] { | ||
//~^ ERROR the type parameter `U` is not constrained | ||
} | ||
|
||
impl<T,U> Foo<T> for [int;2] where T : Bar<Out=U> { | ||
// OK, `U` is now constrained by the output type parameter. | ||
} | ||
|
||
impl<T:Bar<Out=U>,U> Foo<T> for [int;3] { | ||
// OK, same as above but written differently. | ||
} | ||
|
||
impl<T,U> Foo<T> for U { | ||
// OK, T, U are used everywhere. Note that the coherence check | ||
// hasn't executed yet, so no errors about overlap. | ||
} | ||
|
||
impl<T,U> Bar for T { | ||
//~^ ERROR the type parameter `U` is not constrained | ||
|
||
type Out = U; | ||
|
||
// Using `U` in an associated type within the impl is not good enough! | ||
} | ||
|
||
impl<T,U> Bar for T | ||
where T : Bar<Out=U> | ||
{ | ||
//~^^^ ERROR the type parameter `U` is not constrained | ||
|
||
// This crafty self-referential attempt is still no good. | ||
} | ||
|
||
impl<T,U,V> Foo<T> for T | ||
where (T,U): Bar<Out=V> | ||
{ | ||
//~^^^ ERROR the type parameter `U` is not constrained | ||
//~| ERROR the type parameter `V` is not constrained | ||
|
||
// Here, `V` is bound by an output type parameter, but the inputs | ||
// are not themselves constrained. | ||
} | ||
|
||
impl<T,U,V> Foo<(T,U)> for T | ||
where (T,U): Bar<Out=V> | ||
{ | ||
// As above, but both T and U ARE constrained. | ||
} | ||
|
||
fn main() { } |