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.
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.

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() {}
@@ -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

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() {}
@@ -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

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
@@ -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

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
@@ -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

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() {}
@@ -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.