| // Copyright 2012 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. |
| |
| // revisions: angle paren ok elision |
| |
| #![allow(dead_code)] |
| #![feature(rustc_attrs)] |
| #![feature(unboxed_closures)] |
| |
| trait Foo { |
| type Item; |
| } |
| |
| #[cfg(angle)] |
| fn angle<T: for<'a> Foo<Item=&'a i32>>() { |
| //[angle]~^ ERROR binding for associated type `Item` references lifetime `'a` |
| } |
| |
| #[cfg(angle)] |
| fn angle1<T>() where T: for<'a> Foo<Item=&'a i32> { |
| //[angle]~^ ERROR binding for associated type `Item` references lifetime `'a` |
| } |
| |
| #[cfg(angle)] |
| fn angle2<T>() where for<'a> T: Foo<Item=&'a i32> { |
| //[angle]~^ ERROR binding for associated type `Item` references lifetime `'a` |
| } |
| |
| #[cfg(angle)] |
| fn angle3(_: &for<'a> Foo<Item=&'a i32>) { |
| //[angle]~^ ERROR binding for associated type `Item` references lifetime `'a` |
| } |
| |
| #[cfg(paren)] |
| fn paren<T: for<'a> Fn() -> &'a i32>() { |
| //[paren]~^ ERROR binding for associated type `Output` references lifetime `'a` |
| } |
| |
| #[cfg(paren)] |
| fn paren1<T>() where T: for<'a> Fn() -> &'a i32 { |
| //[paren]~^ ERROR binding for associated type `Output` references lifetime `'a` |
| } |
| |
| #[cfg(paren)] |
| fn paren2<T>() where for<'a> T: Fn() -> &'a i32 { |
| //[paren]~^ ERROR binding for associated type `Output` references lifetime `'a` |
| } |
| |
| #[cfg(paren)] |
| fn paren3(_: &for<'a> Fn() -> &'a i32) { |
| //[paren]~^ ERROR binding for associated type `Output` references lifetime `'a` |
| } |
| |
| #[cfg(elision)] |
| fn elision<T: Fn() -> &i32>() { |
| //[elision]~^ ERROR E0106 |
| } |
| |
| struct Parameterized<'a> { x: &'a str } |
| |
| #[cfg(ok)] |
| fn ok1<T: for<'a> Fn(&Parameterized<'a>) -> &'a i32>() { |
| } |
| |
| #[cfg(ok)] |
| fn ok2<T: for<'a,'b> Fn<(&'b Parameterized<'a>,), Output=&'a i32>>() { |
| } |
| |
| #[cfg(ok)] |
| fn ok3<T>() where for<'a> Parameterized<'a>: Foo<Item=&'a i32> { |
| } |
| |
| #[rustc_error] |
| fn main() { } //[ok]~ ERROR compilation successful |