Skip to content

Commit

Permalink
Moved all of the tests over to ui and annotated why they are failing …
Browse files Browse the repository at this point in the history
…with appropriate fixme comments
  • Loading branch information
sunjay committed Dec 1, 2017
1 parent db4408a commit fdf6c65
Show file tree
Hide file tree
Showing 12 changed files with 97 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,17 @@ use std::ops::Deref;

trait PointerFamily<U> {
type Pointer<T>: Deref<Target = T>;
//~^ ERROR generic associated types are unstable
type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
//~^ ERROR generic associated types are unstable
}

struct Foo;
impl PointerFamily<u32> for Foo {
type Pointer<usize> = Box<usize>;
//~^ ERROR generic associated types are unstable
type Pointer2<u32> = Box<u32>;
//~^ ERROR generic associated types are unstable
}

fn main() {}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

#![feature(generic_associated_types)]

//FIXME(#44265): "undeclared lifetime" errors will be addressed in a follow-up PR

trait Foo {
type Bar<'a, 'b>;
}
Expand All @@ -20,6 +22,7 @@ trait Baz {

impl<T> Baz for T where T: Foo {
type Quux<'a> = <T as Foo>::Bar<'a, 'static>;
//~^ ERROR undeclared lifetime
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error[E0261]: use of undeclared lifetime name `'a`
--> $DIR/construct_with_other_type.rs:24:37
|
24 | type Quux<'a> = <T as Foo>::Bar<'a, 'static>;
| ^^ undeclared lifetime

error: aborting due to previous error

Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@
// Checking the interaction with this other feature
#![feature(associated_type_defaults)]

//FIXME(#44265): "undeclared lifetime" errors will be addressed in a follow-up PR

use std::fmt::{Display, Debug};

trait Foo {
type Assoc where Self: Sized;
type Assoc2<T> where T: Display;
type WithDefault<T> where T: Debug = Iterator<Item=T>;
type NoGenerics;
}

struct Bar;
Expand All @@ -27,6 +30,8 @@ impl Foo for Bar {
type Assoc = usize;
type Assoc2<T> = Vec<T>;
type WithDefault<'a, T> = &'a Iterator<T>;
//~^ ERROR undeclared lifetime
type NoGenerics = ::std::cell::Cell<i32>;
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error[E0261]: use of undeclared lifetime name `'a`
--> $DIR/generic-associated-types-where.rs:32:32
|
32 | type WithDefault<'a, T> = &'a Iterator<T>;
| ^^ undeclared lifetime

error: aborting due to previous error

Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@

#![feature(generic_associated_types)]

//FIXME(#44265): "undeclared lifetime" errors will be addressed in a follow-up PR

trait Iterable {
type Item<'a>;
type Iter<'a>: Iterator<Item = Self::Item<'a>>;
//~^ ERROR undeclared lifetime

fn iter<'a>(&'a self) -> Self::Iter<'a>;
}
Expand Down
8 changes: 8 additions & 0 deletions src/test/ui/rfc1598-generic-associated-types/iterable.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error[E0261]: use of undeclared lifetime name `'a`
--> $DIR/iterable.rs:17:47
|
17 | type Iter<'a>: Iterator<Item = Self::Item<'a>>;
| ^^ undeclared lifetime

error: aborting due to previous error

Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,24 @@

#![feature(generic_associated_types)]

//FIXME(#44265): "type parameter not allowed" errors will be addressed in a follow-up PR

use std::rc::Rc;
use std::sync::Arc;
use std::ops::Deref;

trait PointerFamily {
type Pointer<T>: Deref<Target = T>;
fn new<T>(value: T) -> Self::Pointer<T>;
//~^ ERROR type parameters are not allowed on this type [E0109]
}

struct ArcFamily;

impl PointerFamily for ArcFamily {
type Pointer<T> = Arc<T>;
fn new<T>(value: T) -> Self::Pointer<T> {
//~^ ERROR type parameters are not allowed on this type [E0109]
Arc::new(value)
}
}
Expand All @@ -33,12 +37,14 @@ struct RcFamily;
impl PointerFamily for RcFamily {
type Pointer<T> = Rc<T>;
fn new<T>(value: T) -> Self::Pointer<T> {
//~^ ERROR type parameters are not allowed on this type [E0109]
Rc::new(value)
}
}

struct Foo<P: PointerFamily> {
bar: P::Pointer<String>,
//~^ ERROR type parameters are not allowed on this type [E0109]
}

fn main() {}
26 changes: 26 additions & 0 deletions src/test/ui/rfc1598-generic-associated-types/pointer_family.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
error[E0109]: type parameters are not allowed on this type
--> $DIR/pointer_family.rs:46:21
|
46 | bar: P::Pointer<String>,
| ^^^^^^ type parameter not allowed

error[E0109]: type parameters are not allowed on this type
--> $DIR/pointer_family.rs:21:42
|
21 | fn new<T>(value: T) -> Self::Pointer<T>;
| ^ type parameter not allowed

error[E0109]: type parameters are not allowed on this type
--> $DIR/pointer_family.rs:29:42
|
29 | fn new<T>(value: T) -> Self::Pointer<T> {
| ^ type parameter not allowed

error[E0109]: type parameters are not allowed on this type
--> $DIR/pointer_family.rs:39:42
|
39 | fn new<T>(value: T) -> Self::Pointer<T> {
| ^ type parameter not allowed

error: aborting due to 4 previous errors

Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,29 @@

#![feature(generic_associated_types)]

//FIXME(#44265): "lifetime parameter not allowed on this type" errors will be addressed in a
// follow-up PR

use std::fmt::Display;

trait StreamingIterator {
type Item<'a>;
// Applying the lifetime parameter `'a` to `Self::Item` inside the trait.
fn next<'a>(&'a self) -> Option<Self::Item<'a>>;
//~^ ERROR lifetime parameters are not allowed on this type [E0110]
}

struct Foo<T: StreamingIterator> {
// Applying a concrete lifetime to the constructor outside the trait.
bar: <T as StreamingIterator>::Item<'static>,
//~^ ERROR lifetime parameters are not allowed on this type [E0110]
}

// Users can bound parameters by the type constructed by that trait's associated type constructor
// of a trait using HRTB. Both type equality bounds and trait bounds of this kind are valid:
//FIXME(sunjay): This next line should parse and be valid
//fn foo<T: for<'a> StreamingIterator<Item<'a>=&'a [i32]>>(iter: T) { /* ... */ }
fn foo<T>(iter: T) where T: StreamingIterator, for<'a> T::Item<'a>: Display { /* ... */ }
//~^ ERROR lifetime parameters are not allowed on this type [E0110]

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
error[E0110]: lifetime parameters are not allowed on this type
--> $DIR/streaming_iterator.rs:27:41
|
27 | bar: <T as StreamingIterator>::Item<'static>,
| ^^^^^^^ lifetime parameter not allowed on this type

error[E0110]: lifetime parameters are not allowed on this type
--> $DIR/streaming_iterator.rs:35:64
|
35 | fn foo<T>(iter: T) where T: StreamingIterator, for<'a> T::Item<'a>: Display { /* ... */ }
| ^^ lifetime parameter not allowed on this type

error[E0110]: lifetime parameters are not allowed on this type
--> $DIR/streaming_iterator.rs:21:48
|
21 | fn next<'a>(&'a self) -> Option<Self::Item<'a>>;
| ^^ lifetime parameter not allowed on this type

error: aborting due to 3 previous errors

0 comments on commit fdf6c65

Please sign in to comment.