Update tests for GATs
* Make some run-pass or check-pass * Use `#![allow(incomplete_features)]` * Update FIXMEs now that some of the issues have been addressed * Add regression tests
This commit is contained in:
parent
0a5c91c129
commit
c2687985b0
@ -3,9 +3,11 @@ use std::ops::Deref;
|
|||||||
trait PointerFamily<U> {
|
trait PointerFamily<U> {
|
||||||
type Pointer<T>: Deref<Target = T>;
|
type Pointer<T>: Deref<Target = T>;
|
||||||
//~^ ERROR generic associated types are unstable
|
//~^ ERROR generic associated types are unstable
|
||||||
|
//~| ERROR type-generic associated types are not yet implemented
|
||||||
type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
|
type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
|
||||||
//~^ ERROR generic associated types are unstable
|
//~^ ERROR generic associated types are unstable
|
||||||
//~| ERROR where clauses on associated types are unstable
|
//~| ERROR where clauses on associated types are unstable
|
||||||
|
//~| ERROR type-generic associated types are not yet implemented
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Foo;
|
struct Foo;
|
||||||
|
@ -8,7 +8,7 @@ LL | type Pointer<T>: Deref<Target = T>;
|
|||||||
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: generic associated types are unstable
|
error[E0658]: generic associated types are unstable
|
||||||
--> $DIR/feature-gate-generic_associated_types.rs:6:5
|
--> $DIR/feature-gate-generic_associated_types.rs:7:5
|
||||||
|
|
|
|
||||||
LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
|
LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@ -17,7 +17,7 @@ LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
|
|||||||
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: where clauses on associated types are unstable
|
error[E0658]: where clauses on associated types are unstable
|
||||||
--> $DIR/feature-gate-generic_associated_types.rs:6:5
|
--> $DIR/feature-gate-generic_associated_types.rs:7:5
|
||||||
|
|
|
|
||||||
LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
|
LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@ -26,7 +26,7 @@ LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
|
|||||||
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: generic associated types are unstable
|
error[E0658]: generic associated types are unstable
|
||||||
--> $DIR/feature-gate-generic_associated_types.rs:14:5
|
--> $DIR/feature-gate-generic_associated_types.rs:16:5
|
||||||
|
|
|
|
||||||
LL | type Pointer<Usize> = Box<Usize>;
|
LL | type Pointer<Usize> = Box<Usize>;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@ -35,7 +35,7 @@ LL | type Pointer<Usize> = Box<Usize>;
|
|||||||
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: generic associated types are unstable
|
error[E0658]: generic associated types are unstable
|
||||||
--> $DIR/feature-gate-generic_associated_types.rs:16:5
|
--> $DIR/feature-gate-generic_associated_types.rs:18:5
|
||||||
|
|
|
|
||||||
LL | type Pointer2<U32> = Box<U32>;
|
LL | type Pointer2<U32> = Box<U32>;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@ -44,7 +44,7 @@ LL | type Pointer2<U32> = Box<U32>;
|
|||||||
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: where clauses on associated types are unstable
|
error[E0658]: where clauses on associated types are unstable
|
||||||
--> $DIR/feature-gate-generic_associated_types.rs:21:5
|
--> $DIR/feature-gate-generic_associated_types.rs:23:5
|
||||||
|
|
|
|
||||||
LL | type Assoc where Self: Sized;
|
LL | type Assoc where Self: Sized;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@ -53,7 +53,7 @@ LL | type Assoc where Self: Sized;
|
|||||||
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0658]: where clauses on associated types are unstable
|
error[E0658]: where clauses on associated types are unstable
|
||||||
--> $DIR/feature-gate-generic_associated_types.rs:26:5
|
--> $DIR/feature-gate-generic_associated_types.rs:28:5
|
||||||
|
|
|
|
||||||
LL | type Assoc where Self: Sized = Foo;
|
LL | type Assoc where Self: Sized = Foo;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@ -61,6 +61,22 @@ LL | type Assoc where Self: Sized = Foo;
|
|||||||
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to 7 previous errors
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/feature-gate-generic_associated_types.rs:4:5
|
||||||
|
|
|
||||||
|
LL | type Pointer<T>: Deref<Target = T>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/feature-gate-generic_associated_types.rs:7:5
|
||||||
|
|
|
||||||
|
LL | type Pointer2<T>: Deref<Target = T> where T: Clone, U: Clone;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: aborting due to 9 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
|
#![allow(incomplete_features)]
|
||||||
#![feature(generic_associated_types)]
|
#![feature(generic_associated_types)]
|
||||||
//~^ WARNING the feature `generic_associated_types` is incomplete
|
|
||||||
#![feature(associated_type_defaults)]
|
#![feature(associated_type_defaults)]
|
||||||
|
|
||||||
// FIXME(#44265): "lifetime arguments are not allowed for this type" errors will be addressed in a
|
|
||||||
// follow-up PR.
|
|
||||||
|
|
||||||
// A Collection trait and collection families. Based on
|
// A Collection trait and collection families. Based on
|
||||||
// http://smallcultfollowing.com/babysteps/blog/2016/11/03/
|
// http://smallcultfollowing.com/babysteps/blog/2016/11/03/
|
||||||
// associated-type-constructors-part-2-family-traits/
|
// associated-type-constructors-part-2-family-traits/
|
||||||
@ -15,18 +12,18 @@ trait Collection<T> {
|
|||||||
// Test associated type defaults with parameters
|
// Test associated type defaults with parameters
|
||||||
type Sibling<U>: Collection<U> =
|
type Sibling<U>: Collection<U> =
|
||||||
<<Self as Collection<T>>::Family as CollectionFamily>::Member<U>;
|
<<Self as Collection<T>>::Family as CollectionFamily>::Member<U>;
|
||||||
//~^ ERROR type arguments are not allowed for this type [E0109]
|
//~^^ ERROR type-generic associated types are not yet implemented
|
||||||
|
|
||||||
fn empty() -> Self;
|
fn empty() -> Self;
|
||||||
|
|
||||||
fn add(&mut self, value: T);
|
fn add(&mut self, value: T);
|
||||||
|
|
||||||
fn iterate<'iter>(&'iter self) -> Self::Iter<'iter>;
|
fn iterate<'iter>(&'iter self) -> Self::Iter<'iter>;
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
trait CollectionFamily {
|
trait CollectionFamily {
|
||||||
type Member<T>: Collection<T, Family = Self>;
|
type Member<T>: Collection<T, Family = Self>;
|
||||||
|
//~^ ERROR type-generic associated types are not yet implemented
|
||||||
}
|
}
|
||||||
|
|
||||||
struct VecFamily;
|
struct VecFamily;
|
||||||
@ -48,13 +45,11 @@ impl<T> Collection<T> for Vec<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn iterate<'iter>(&'iter self) -> Self::Iter<'iter> {
|
fn iterate<'iter>(&'iter self) -> Self::Iter<'iter> {
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
self.iter()
|
self.iter()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn floatify<C>(ints: &C) -> <<C as Collection<i32>>::Family as CollectionFamily>::Member<f32>
|
fn floatify<C>(ints: &C) -> <<C as Collection<i32>>::Family as CollectionFamily>::Member<f32>
|
||||||
//~^ ERROR type arguments are not allowed for this type [E0109]
|
|
||||||
where
|
where
|
||||||
C: Collection<i32>,
|
C: Collection<i32>,
|
||||||
{
|
{
|
||||||
@ -66,7 +61,6 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn floatify_sibling<C>(ints: &C) -> <C as Collection<i32>>::Sibling<f32>
|
fn floatify_sibling<C>(ints: &C) -> <C as Collection<i32>>::Sibling<f32>
|
||||||
//~^ ERROR type arguments are not allowed for this type [E0109]
|
|
||||||
where
|
where
|
||||||
C: Collection<i32>,
|
C: Collection<i32>,
|
||||||
{
|
{
|
19
src/test/ui/generic-associated-types/collections.stderr
Normal file
19
src/test/ui/generic-associated-types/collections.stderr
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/collections.rs:13:5
|
||||||
|
|
|
||||||
|
LL | / type Sibling<U>: Collection<U> =
|
||||||
|
LL | | <<Self as Collection<T>>::Family as CollectionFamily>::Member<U>;
|
||||||
|
| |_________________________________________________________________________^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/collections.rs:25:5
|
||||||
|
|
|
||||||
|
LL | type Member<T>: Collection<T, Family = Self>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
@ -0,0 +1,26 @@
|
|||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
|
||||||
|
// FIXME(#30472) normalize enough to handle this.
|
||||||
|
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
type Bar<'a, 'b>;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait Baz {
|
||||||
|
type Quux<'a>: Foo where Self: 'a;
|
||||||
|
|
||||||
|
// This weird type tests that we can use universal function call syntax to access the Item on
|
||||||
|
type Baa<'a>: Deref<Target = <Self::Quux<'a> as Foo>::Bar<'a, 'static>> where Self: 'a;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Baz for T where T: Foo {
|
||||||
|
//~^ ERROR type mismatch resolving
|
||||||
|
type Quux<'a> where T: 'a = T;
|
||||||
|
|
||||||
|
type Baa<'a> where T: 'a = &'a <T as Foo>::Bar<'a, 'static>;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,13 @@
|
|||||||
|
error[E0271]: type mismatch resolving `for<'a> <<T as Baz>::Baa<'a> as std::ops::Deref>::Target == <<T as Baz>::Quux<'a> as Foo>::Bar<'a, 'static>`
|
||||||
|
--> $DIR/construct_with_other_type.rs:19:9
|
||||||
|
|
|
||||||
|
LL | impl<T> Baz for T where T: Foo {
|
||||||
|
| ^^^ expected type parameter `T`, found associated type
|
||||||
|
|
|
||||||
|
= note: expected associated type `<T as Foo>::Bar<'_, 'static>`
|
||||||
|
found associated type `<<T as Baz>::Quux<'_> as Foo>::Bar<'_, 'static>`
|
||||||
|
= note: you might be missing a type parameter or trait bound
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0271`.
|
@ -1,5 +1,5 @@
|
|||||||
|
#![allow(incomplete_features)]
|
||||||
#![feature(generic_associated_types)]
|
#![feature(generic_associated_types)]
|
||||||
//~^ WARNING the feature `generic_associated_types` is incomplete
|
|
||||||
|
|
||||||
trait Foo {
|
trait Foo {
|
||||||
type Bar<,>;
|
type Bar<,>;
|
@ -0,0 +1,8 @@
|
|||||||
|
error: expected one of `>`, `const`, identifier, or lifetime, found `,`
|
||||||
|
--> $DIR/empty_generics.rs:5:14
|
||||||
|
|
|
||||||
|
LL | type Bar<,>;
|
||||||
|
| ^ expected one of `>`, `const`, identifier, or lifetime
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
@ -0,0 +1,17 @@
|
|||||||
|
// rust-lang/rust#60654: Do not ICE on an attempt to use GATs that is
|
||||||
|
// missing the feature gate.
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
|
||||||
|
trait MyTrait {
|
||||||
|
type Item<T>;
|
||||||
|
//~^ ERROR generic associated types are unstable [E0658]
|
||||||
|
//~| ERROR type-generic associated types are not yet implemented
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MyTrait for Foo {
|
||||||
|
type Item<T> = T;
|
||||||
|
//~^ ERROR generic associated types are unstable [E0658]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() { }
|
@ -0,0 +1,29 @@
|
|||||||
|
error[E0658]: generic associated types are unstable
|
||||||
|
--> $DIR/gat-dont-ice-on-absent-feature-2.rs:7:5
|
||||||
|
|
|
||||||
|
LL | type Item<T>;
|
||||||
|
| ^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
||||||
|
|
||||||
|
error[E0658]: generic associated types are unstable
|
||||||
|
--> $DIR/gat-dont-ice-on-absent-feature-2.rs:13:5
|
||||||
|
|
|
||||||
|
LL | type Item<T> = T;
|
||||||
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
||||||
|
|
||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/gat-dont-ice-on-absent-feature-2.rs:7:5
|
||||||
|
|
|
||||||
|
LL | type Item<T>;
|
||||||
|
| ^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0658`.
|
@ -4,7 +4,9 @@
|
|||||||
struct Foo;
|
struct Foo;
|
||||||
|
|
||||||
impl Iterator for Foo {
|
impl Iterator for Foo {
|
||||||
type Item<'b> = &'b Foo; //~ ERROR generic associated types are unstable [E0658]
|
type Item<'b> = &'b Foo;
|
||||||
|
//~^ ERROR generic associated types are unstable [E0658]
|
||||||
|
//~| ERROR lifetime parameters or bounds on type `Item` do not match the trait declaration
|
||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
None
|
None
|
@ -0,0 +1,19 @@
|
|||||||
|
error[E0658]: generic associated types are unstable
|
||||||
|
--> $DIR/gat-dont-ice-on-absent-feature.rs:7:5
|
||||||
|
|
|
||||||
|
LL | type Item<'b> = &'b Foo;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
||||||
|
|
||||||
|
error[E0195]: lifetime parameters or bounds on type `Item` do not match the trait declaration
|
||||||
|
--> $DIR/gat-dont-ice-on-absent-feature.rs:7:14
|
||||||
|
|
|
||||||
|
LL | type Item<'b> = &'b Foo;
|
||||||
|
| ^^^^ lifetimes do not match type in trait
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0195, E0658.
|
||||||
|
For more information about an error, try `rustc --explain E0195`.
|
@ -1,4 +1,5 @@
|
|||||||
#![feature(generic_associated_types)] //~ WARN `generic_associated_types` is incomplete
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
|
||||||
// Checking the interaction with this other feature
|
// Checking the interaction with this other feature
|
||||||
#![feature(associated_type_defaults)]
|
#![feature(associated_type_defaults)]
|
||||||
@ -8,8 +9,11 @@ use std::fmt::{Display, Debug};
|
|||||||
trait Foo {
|
trait Foo {
|
||||||
type Assoc where Self: Sized;
|
type Assoc where Self: Sized;
|
||||||
type Assoc2<T> where T: Display;
|
type Assoc2<T> where T: Display;
|
||||||
|
//~^ ERROR type-generic associated types are not yet implemented
|
||||||
type Assoc3<T>;
|
type Assoc3<T>;
|
||||||
type WithDefault<T> where T: Debug = dyn Iterator<Item=T>;
|
//~^ ERROR type-generic associated types are not yet implemented
|
||||||
|
type WithDefault<'a, T: Debug + 'a> = dyn Iterator<Item=T>;
|
||||||
|
//~^ ERROR type-generic associated types are not yet implemented
|
||||||
type NoGenerics;
|
type NoGenerics;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19,7 +23,7 @@ impl Foo for Bar {
|
|||||||
type Assoc = usize;
|
type Assoc = usize;
|
||||||
type Assoc2<T> = Vec<T>;
|
type Assoc2<T> = Vec<T>;
|
||||||
type Assoc3<T> where T: Iterator = Vec<T>;
|
type Assoc3<T> where T: Iterator = Vec<T>;
|
||||||
type WithDefault<'a, T> = &'a dyn Iterator<T>;
|
type WithDefault<'a, T: Debug + 'a> = &'a dyn Iterator<Item=T>;
|
||||||
type NoGenerics = ::std::cell::Cell<i32>;
|
type NoGenerics = ::std::cell::Cell<i32>;
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
|||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/generic-associated-types-where.rs:11:5
|
||||||
|
|
|
||||||
|
LL | type Assoc2<T> where T: Display;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/generic-associated-types-where.rs:13:5
|
||||||
|
|
|
||||||
|
LL | type Assoc3<T>;
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/generic-associated-types-where.rs:15:5
|
||||||
|
|
|
||||||
|
LL | type WithDefault<'a, T: Debug + 'a> = dyn Iterator<Item=T>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
@ -0,0 +1,16 @@
|
|||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
|
trait Iterable {
|
||||||
|
type Item<'a>;
|
||||||
|
type Iter<'a>: Iterator<Item = Self::Item<'a>>
|
||||||
|
+ Deref<Target = Self::Item<'b>>;
|
||||||
|
//~^ ERROR undeclared lifetime
|
||||||
|
|
||||||
|
fn iter<'a>(&'a self) -> Self::Iter<'undeclared>;
|
||||||
|
//~^ ERROR undeclared lifetime
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,15 @@
|
|||||||
|
error[E0261]: use of undeclared lifetime name `'b`
|
||||||
|
--> $DIR/generic_associated_type_undeclared_lifetimes.rs:9:37
|
||||||
|
|
|
||||||
|
LL | + Deref<Target = Self::Item<'b>>;
|
||||||
|
| ^^ undeclared lifetime
|
||||||
|
|
||||||
|
error[E0261]: use of undeclared lifetime name `'undeclared`
|
||||||
|
--> $DIR/generic_associated_type_undeclared_lifetimes.rs:12:41
|
||||||
|
|
|
||||||
|
LL | fn iter<'a>(&'a self) -> Self::Iter<'undeclared>;
|
||||||
|
| ^^^^^^^^^^^ undeclared lifetime
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0261`.
|
23
src/test/ui/generic-associated-types/impl_bounds.rs
Normal file
23
src/test/ui/generic-associated-types/impl_bounds.rs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
#![feature(associated_type_defaults)]
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
type A<'a> where Self: 'a;
|
||||||
|
type B<'a, 'b> where 'a: 'b;
|
||||||
|
type C where Self: Clone;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
struct Fooy<T>(T);
|
||||||
|
|
||||||
|
impl<T> Foo for Fooy<T> {
|
||||||
|
type A<'a> where Self: 'static = (&'a ());
|
||||||
|
//~^ ERROR the parameter type `T` may not live long enough
|
||||||
|
type B<'a, 'b> where 'b: 'a = (&'a(), &'b ());
|
||||||
|
//~^ ERROR lifetime bound not satisfied
|
||||||
|
type C where Self: Copy = String;
|
||||||
|
//~^ ERROR the trait bound `T: std::marker::Copy` is not satisfied
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
46
src/test/ui/generic-associated-types/impl_bounds.stderr
Normal file
46
src/test/ui/generic-associated-types/impl_bounds.stderr
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
error[E0310]: the parameter type `T` may not live long enough
|
||||||
|
--> $DIR/impl_bounds.rs:15:5
|
||||||
|
|
|
||||||
|
LL | type A<'a> where Self: 'static = (&'a ());
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: consider adding an explicit lifetime bound `T: 'static`...
|
||||||
|
note: ...so that the type `Fooy<T>` will meet its required lifetime bounds
|
||||||
|
--> $DIR/impl_bounds.rs:15:5
|
||||||
|
|
|
||||||
|
LL | type A<'a> where Self: 'static = (&'a ());
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0478]: lifetime bound not satisfied
|
||||||
|
--> $DIR/impl_bounds.rs:17:5
|
||||||
|
|
|
||||||
|
LL | type B<'a, 'b> where 'b: 'a = (&'a(), &'b ());
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: lifetime parameter instantiated with the lifetime `'b` as defined on the associated item at 17:16
|
||||||
|
--> $DIR/impl_bounds.rs:17:16
|
||||||
|
|
|
||||||
|
LL | type B<'a, 'b> where 'b: 'a = (&'a(), &'b ());
|
||||||
|
| ^^
|
||||||
|
note: but lifetime parameter must outlive the lifetime `'a` as defined on the associated item at 17:12
|
||||||
|
--> $DIR/impl_bounds.rs:17:12
|
||||||
|
|
|
||||||
|
LL | type B<'a, 'b> where 'b: 'a = (&'a(), &'b ());
|
||||||
|
| ^^
|
||||||
|
|
||||||
|
error[E0277]: the trait bound `T: std::marker::Copy` is not satisfied
|
||||||
|
--> $DIR/impl_bounds.rs:19:5
|
||||||
|
|
|
||||||
|
LL | impl<T> Foo for Fooy<T> {
|
||||||
|
| - help: consider restricting this bound: `T: std::marker::Copy`
|
||||||
|
...
|
||||||
|
LL | type C where Self: Copy = String;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `T`
|
||||||
|
|
|
||||||
|
= note: required because of the requirements on the impl of `std::marker::Copy` for `Fooy<T>`
|
||||||
|
= note: the requirement `Fooy<T>: std::marker::Copy` appears on the associated impl typebut not on the corresponding associated trait type
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0277, E0310, E0478.
|
||||||
|
For more information about an error, try `rustc --explain E0277`.
|
30
src/test/ui/generic-associated-types/impl_bounds_ok.rs
Normal file
30
src/test/ui/generic-associated-types/impl_bounds_ok.rs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// check-pass
|
||||||
|
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
#![feature(associated_type_defaults)]
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
type A<'a> where Self: 'a;
|
||||||
|
type B<'a, 'b> where 'a: 'b;
|
||||||
|
type C where Self: Clone;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Fooy;
|
||||||
|
|
||||||
|
impl Foo for Fooy {
|
||||||
|
type A<'a> = (&'a ());
|
||||||
|
type B<'a, 'b> = (&'a(), &'b ());
|
||||||
|
type C = String;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
struct Fooer<T>(T);
|
||||||
|
|
||||||
|
impl<T> Foo for Fooer<T> {
|
||||||
|
type A<'x> where T: 'x = (&'x ());
|
||||||
|
type B<'u, 'v> where 'u: 'v = (&'v &'u ());
|
||||||
|
type C where Self: ToOwned = String;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,17 @@
|
|||||||
|
// Check that this program doesn't cause the compiler to error without output.
|
||||||
|
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
type Assoc3<T>;
|
||||||
|
//~^ type-generic associated types are not yet implemented
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Bar;
|
||||||
|
|
||||||
|
impl Foo for Bar {
|
||||||
|
type Assoc3<T> where T: Iterator = Vec<T>;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,10 @@
|
|||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/issue-47206-where-clause.rs:7:5
|
||||||
|
|
|
||||||
|
LL | type Assoc3<T>;
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
// check-pass
|
||||||
|
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
|
||||||
|
trait Cert {
|
||||||
|
type PublicKey<'a>: From<&'a [u8]>;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,12 @@
|
|||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
|
||||||
|
// FIXME(generic-associated-types) Investigate why this doesn't compile.
|
||||||
|
|
||||||
|
trait Iterator {
|
||||||
|
//~^ ERROR the requirement `for<'a> <Self as Iterator>::Item<'a> : 'a` is not satisfied
|
||||||
|
type Item<'a>: 'a;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,15 @@
|
|||||||
|
error[E0280]: the requirement `for<'a> <Self as Iterator>::Item<'a> : 'a` is not satisfied
|
||||||
|
--> $DIR/issue-62326-parameter-out-of-range.rs:6:1
|
||||||
|
|
|
||||||
|
LL | trait Iterator {
|
||||||
|
| ^-------------
|
||||||
|
| |
|
||||||
|
| _required by `Iterator`
|
||||||
|
| |
|
||||||
|
LL | |
|
||||||
|
LL | | type Item<'a>: 'a;
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
51
src/test/ui/generic-associated-types/iterable.rs
Normal file
51
src/test/ui/generic-associated-types/iterable.rs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
|
||||||
|
// FIXME(#30472) normalize enough to handle this.
|
||||||
|
|
||||||
|
trait Iterable {
|
||||||
|
type Item<'a> where Self: 'a;
|
||||||
|
type Iter<'a>: Iterator<Item = Self::Item<'a>> where Self: 'a;
|
||||||
|
|
||||||
|
fn iter<'a>(&'a self) -> Self::Iter<'a>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Impl for struct type
|
||||||
|
impl<T> Iterable for Vec<T> {
|
||||||
|
type Item<'a> where T: 'a = <std::slice::Iter<'a, T> as Iterator>::Item;
|
||||||
|
//~^ ERROR type mismatch resolving
|
||||||
|
type Iter<'a> where T: 'a = std::slice::Iter<'a, T>;
|
||||||
|
|
||||||
|
fn iter<'a>(&'a self) -> Self::Iter<'a> {
|
||||||
|
//~^ ERROR type mismatch resolving
|
||||||
|
self.iter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Impl for a primitive type
|
||||||
|
impl<T> Iterable for [T] {
|
||||||
|
type Item<'a> where T: 'a = <std::slice::Iter<'a, T> as Iterator>::Item;
|
||||||
|
//~^ ERROR type mismatch resolving
|
||||||
|
type Iter<'a> where T: 'a = std::slice::Iter<'a, T>;
|
||||||
|
|
||||||
|
fn iter<'a>(&'a self) -> Self::Iter<'a> {
|
||||||
|
//~^ ERROR type mismatch resolving
|
||||||
|
self.iter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_iter<'a, I: Iterable>(it: &'a I) -> I::Iter<'a> {
|
||||||
|
it.iter()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_first<'a, I: Iterable>(it: &'a I) -> Option<I::Item<'a>> {
|
||||||
|
it.iter().next()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let v = vec![1, 2, 3];
|
||||||
|
assert_eq!(v, make_iter(&v).copied().collect());
|
||||||
|
assert_eq!(v, make_iter(&*v).copied().collect());
|
||||||
|
assert_eq!(1, get_first(&v));
|
||||||
|
assert_eq!(1, get_first(&*v));
|
||||||
|
}
|
63
src/test/ui/generic-associated-types/iterable.stderr
Normal file
63
src/test/ui/generic-associated-types/iterable.stderr
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
error[E0271]: type mismatch resolving `for<'a> <<std::vec::Vec<T> as Iterable>::Iter<'a> as std::iter::Iterator>::Item == <std::vec::Vec<T> as Iterable>::Item<'a>`
|
||||||
|
--> $DIR/iterable.rs:15:5
|
||||||
|
|
|
||||||
|
LL | impl<T> Iterable for Vec<T> {
|
||||||
|
| --------------------------- in this `impl` item
|
||||||
|
LL | type Item<'a> where T: 'a = <std::slice::Iter<'a, T> as Iterator>::Item;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found associated type
|
||||||
|
|
|
||||||
|
= note: expected reference `&T`
|
||||||
|
found associated type `<std::vec::Vec<T> as Iterable>::Item<'_>`
|
||||||
|
= note: consider constraining the associated type `<std::vec::Vec<T> as Iterable>::Item<'_>` to `&_`
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||||
|
|
||||||
|
error[E0271]: type mismatch resolving `for<'a> <<[T] as Iterable>::Iter<'a> as std::iter::Iterator>::Item == <[T] as Iterable>::Item<'a>`
|
||||||
|
--> $DIR/iterable.rs:27:5
|
||||||
|
|
|
||||||
|
LL | impl<T> Iterable for [T] {
|
||||||
|
| ------------------------ in this `impl` item
|
||||||
|
LL | type Item<'a> where T: 'a = <std::slice::Iter<'a, T> as Iterator>::Item;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found associated type
|
||||||
|
|
|
||||||
|
= note: expected reference `&T`
|
||||||
|
found associated type `<[T] as Iterable>::Item<'_>`
|
||||||
|
= note: consider constraining the associated type `<[T] as Iterable>::Item<'_>` to `&_`
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||||
|
|
||||||
|
error[E0271]: type mismatch resolving `for<'a> <<std::vec::Vec<T> as Iterable>::Iter<'a> as std::iter::Iterator>::Item == <std::vec::Vec<T> as Iterable>::Item<'a>`
|
||||||
|
--> $DIR/iterable.rs:19:5
|
||||||
|
|
|
||||||
|
LL | trait Iterable {
|
||||||
|
| -------------- required by `Iterable`
|
||||||
|
...
|
||||||
|
LL | / fn iter<'a>(&'a self) -> Self::Iter<'a> {
|
||||||
|
LL | |
|
||||||
|
LL | | self.iter()
|
||||||
|
LL | | }
|
||||||
|
| |_____^ expected associated type, found reference
|
||||||
|
|
|
||||||
|
= note: expected associated type `<std::vec::Vec<T> as Iterable>::Item<'_>`
|
||||||
|
found reference `&T`
|
||||||
|
= note: consider constraining the associated type `<std::vec::Vec<T> as Iterable>::Item<'_>` to `&_` or calling a method that returns `<std::vec::Vec<T> as Iterable>::Item<'_>`
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||||
|
|
||||||
|
error[E0271]: type mismatch resolving `for<'a> <<[T] as Iterable>::Iter<'a> as std::iter::Iterator>::Item == <[T] as Iterable>::Item<'a>`
|
||||||
|
--> $DIR/iterable.rs:31:5
|
||||||
|
|
|
||||||
|
LL | trait Iterable {
|
||||||
|
| -------------- required by `Iterable`
|
||||||
|
...
|
||||||
|
LL | / fn iter<'a>(&'a self) -> Self::Iter<'a> {
|
||||||
|
LL | |
|
||||||
|
LL | | self.iter()
|
||||||
|
LL | | }
|
||||||
|
| |_____^ expected associated type, found reference
|
||||||
|
|
|
||||||
|
= note: expected associated type `<[T] as Iterable>::Item<'_>`
|
||||||
|
found reference `&T`
|
||||||
|
= note: consider constraining the associated type `<[T] as Iterable>::Item<'_>` to `&_` or calling a method that returns `<[T] as Iterable>::Item<'_>`
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0271`.
|
@ -0,0 +1,24 @@
|
|||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
#![feature(associated_type_defaults)]
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
type A<'a>;
|
||||||
|
type B<'a, 'b>;
|
||||||
|
type C;
|
||||||
|
type D<T>;
|
||||||
|
//~^ ERROR type-generic associated types are not yet implemented
|
||||||
|
type E<'a, T>;
|
||||||
|
//~^ ERROR type-generic associated types are not yet implemented
|
||||||
|
// Test parameters in default values
|
||||||
|
type FOk<T> = Self::E<'static, T>;
|
||||||
|
//~^ ERROR type-generic associated types are not yet implemented
|
||||||
|
type FErr1 = Self::E<'static, 'static>;
|
||||||
|
//~^ ERROR wrong number of lifetime arguments: expected 1, found 2
|
||||||
|
//~| ERROR wrong number of type arguments: expected 1, found 0
|
||||||
|
type FErr2<T> = Self::E<'static, T, u32>;
|
||||||
|
//~^ ERROR type-generic associated types are not yet implemented
|
||||||
|
//~| ERROR wrong number of type arguments: expected 1, found 2
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,53 @@
|
|||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/parameter_number_and_kind.rs:9:5
|
||||||
|
|
|
||||||
|
LL | type D<T>;
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/parameter_number_and_kind.rs:11:5
|
||||||
|
|
|
||||||
|
LL | type E<'a, T>;
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/parameter_number_and_kind.rs:14:5
|
||||||
|
|
|
||||||
|
LL | type FOk<T> = Self::E<'static, T>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/parameter_number_and_kind.rs:19:5
|
||||||
|
|
|
||||||
|
LL | type FErr2<T> = Self::E<'static, T, u32>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error[E0107]: wrong number of lifetime arguments: expected 1, found 2
|
||||||
|
--> $DIR/parameter_number_and_kind.rs:16:35
|
||||||
|
|
|
||||||
|
LL | type FErr1 = Self::E<'static, 'static>;
|
||||||
|
| ^^^^^^^ unexpected lifetime argument
|
||||||
|
|
||||||
|
error[E0107]: wrong number of type arguments: expected 1, found 0
|
||||||
|
--> $DIR/parameter_number_and_kind.rs:16:18
|
||||||
|
|
|
||||||
|
LL | type FErr1 = Self::E<'static, 'static>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^ expected 1 type argument
|
||||||
|
|
||||||
|
error[E0107]: wrong number of type arguments: expected 1, found 2
|
||||||
|
--> $DIR/parameter_number_and_kind.rs:19:41
|
||||||
|
|
|
||||||
|
LL | type FErr2<T> = Self::E<'static, T, u32>;
|
||||||
|
| ^^^ unexpected type argument
|
||||||
|
|
||||||
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0107`.
|
@ -0,0 +1,35 @@
|
|||||||
|
#![allow(incomplete_features)]
|
||||||
|
#![feature(generic_associated_types)]
|
||||||
|
#![feature(associated_type_defaults)]
|
||||||
|
|
||||||
|
// FIXME(#44265) add tests for type-generic and const-genertic associated types.
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
type A<'a>;
|
||||||
|
type B<'a, 'b>;
|
||||||
|
type C;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Fooy;
|
||||||
|
|
||||||
|
impl Foo for Fooy {
|
||||||
|
type A = u32;
|
||||||
|
//~^ ERROR lifetime parameters or bounds on type `A` do not match the trait declaration
|
||||||
|
type B<'a, T> = Vec<T>;
|
||||||
|
//~^ ERROR type `B` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
|
type C<'a> = u32;
|
||||||
|
//~^ ERROR lifetime parameters or bounds on type `C` do not match the trait declaration
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Fooer;
|
||||||
|
|
||||||
|
impl Foo for Fooer {
|
||||||
|
type A<T> = u32;
|
||||||
|
//~^ ERROR type `A` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
|
type B<'a> = u32;
|
||||||
|
//~^ ERROR lifetime parameters or bounds on type `B` do not match the trait declaration
|
||||||
|
type C<T> = T;
|
||||||
|
//~^ ERROR type `C` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,62 @@
|
|||||||
|
error[E0195]: lifetime parameters or bounds on type `A` do not match the trait declaration
|
||||||
|
--> $DIR/parameter_number_and_kind_impl.rs:16:11
|
||||||
|
|
|
||||||
|
LL | type A<'a>;
|
||||||
|
| ---- lifetimes in impl do not match this type in trait
|
||||||
|
...
|
||||||
|
LL | type A = u32;
|
||||||
|
| ^ lifetimes do not match type in trait
|
||||||
|
|
||||||
|
error[E0049]: type `B` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
|
--> $DIR/parameter_number_and_kind_impl.rs:18:12
|
||||||
|
|
|
||||||
|
LL | type B<'a, 'b>;
|
||||||
|
| -- --
|
||||||
|
| |
|
||||||
|
| expected 0 type parameters
|
||||||
|
...
|
||||||
|
LL | type B<'a, T> = Vec<T>;
|
||||||
|
| ^^ ^
|
||||||
|
| |
|
||||||
|
| found 1 type parameter
|
||||||
|
|
||||||
|
error[E0195]: lifetime parameters or bounds on type `C` do not match the trait declaration
|
||||||
|
--> $DIR/parameter_number_and_kind_impl.rs:20:11
|
||||||
|
|
|
||||||
|
LL | type C;
|
||||||
|
| - lifetimes in impl do not match this type in trait
|
||||||
|
...
|
||||||
|
LL | type C<'a> = u32;
|
||||||
|
| ^^^^ lifetimes do not match type in trait
|
||||||
|
|
||||||
|
error[E0049]: type `A` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
|
--> $DIR/parameter_number_and_kind_impl.rs:27:12
|
||||||
|
|
|
||||||
|
LL | type A<'a>;
|
||||||
|
| -- expected 0 type parameters
|
||||||
|
...
|
||||||
|
LL | type A<T> = u32;
|
||||||
|
| ^ found 1 type parameter
|
||||||
|
|
||||||
|
error[E0195]: lifetime parameters or bounds on type `B` do not match the trait declaration
|
||||||
|
--> $DIR/parameter_number_and_kind_impl.rs:29:11
|
||||||
|
|
|
||||||
|
LL | type B<'a, 'b>;
|
||||||
|
| -------- lifetimes in impl do not match this type in trait
|
||||||
|
...
|
||||||
|
LL | type B<'a> = u32;
|
||||||
|
| ^^^^ lifetimes do not match type in trait
|
||||||
|
|
||||||
|
error[E0049]: type `C` has 1 type parameter but its trait declaration has 0 type parameters
|
||||||
|
--> $DIR/parameter_number_and_kind_impl.rs:31:12
|
||||||
|
|
|
||||||
|
LL | type C;
|
||||||
|
| - expected 0 type parameters
|
||||||
|
...
|
||||||
|
LL | type C<T> = T;
|
||||||
|
| ^ found 1 type parameter
|
||||||
|
|
||||||
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0049, E0195.
|
||||||
|
For more information about an error, try `rustc --explain E0049`.
|
@ -1,4 +1,4 @@
|
|||||||
// build-pass (FIXME(62277): could be check-pass?)
|
// check-pass
|
||||||
// compile-flags: -Z parse-only
|
// compile-flags: -Z parse-only
|
||||||
|
|
||||||
#![feature(generic_associated_types)]
|
#![feature(generic_associated_types)]
|
@ -1,9 +1,10 @@
|
|||||||
// build-pass (FIXME(62277): could be check-pass?)
|
// check-pass
|
||||||
// compile-flags: -Z parse-only
|
// compile-flags: -Z parse-only
|
||||||
|
|
||||||
#![feature(generic_associated_types)]
|
#![feature(generic_associated_types)]
|
||||||
|
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
use std::fmt::Debug;
|
||||||
|
|
||||||
trait Foo {
|
trait Foo {
|
||||||
type Bar<'a>;
|
type Bar<'a>;
|
@ -1,7 +1,7 @@
|
|||||||
|
#![allow(incomplete_features)]
|
||||||
#![feature(generic_associated_types)]
|
#![feature(generic_associated_types)]
|
||||||
//~^ WARNING the feature `generic_associated_types` is incomplete
|
|
||||||
|
|
||||||
// FIXME(#44265): "type argument not allowed" errors will be addressed in a follow-up PR.
|
// FIXME(#44265): allow type-generic associated types.
|
||||||
|
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@ -9,8 +9,8 @@ use std::ops::Deref;
|
|||||||
|
|
||||||
trait PointerFamily {
|
trait PointerFamily {
|
||||||
type Pointer<T>: Deref<Target = T>;
|
type Pointer<T>: Deref<Target = T>;
|
||||||
|
//~^ ERROR type-generic associated types are not yet implemented
|
||||||
fn new<T>(value: T) -> Self::Pointer<T>;
|
fn new<T>(value: T) -> Self::Pointer<T>;
|
||||||
//~^ ERROR type arguments are not allowed for this type [E0109]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ArcFamily;
|
struct ArcFamily;
|
||||||
@ -18,7 +18,6 @@ struct ArcFamily;
|
|||||||
impl PointerFamily for ArcFamily {
|
impl PointerFamily for ArcFamily {
|
||||||
type Pointer<T> = Arc<T>;
|
type Pointer<T> = Arc<T>;
|
||||||
fn new<T>(value: T) -> Self::Pointer<T> {
|
fn new<T>(value: T) -> Self::Pointer<T> {
|
||||||
//~^ ERROR type arguments are not allowed for this type [E0109]
|
|
||||||
Arc::new(value)
|
Arc::new(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -28,14 +27,12 @@ struct RcFamily;
|
|||||||
impl PointerFamily for RcFamily {
|
impl PointerFamily for RcFamily {
|
||||||
type Pointer<T> = Rc<T>;
|
type Pointer<T> = Rc<T>;
|
||||||
fn new<T>(value: T) -> Self::Pointer<T> {
|
fn new<T>(value: T) -> Self::Pointer<T> {
|
||||||
//~^ ERROR type arguments are not allowed for this type [E0109]
|
|
||||||
Rc::new(value)
|
Rc::new(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Foo<P: PointerFamily> {
|
struct Foo<P: PointerFamily> {
|
||||||
bar: P::Pointer<String>,
|
bar: P::Pointer<String>,
|
||||||
//~^ ERROR type arguments are not allowed for this type [E0109]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
10
src/test/ui/generic-associated-types/pointer_family.stderr
Normal file
10
src/test/ui/generic-associated-types/pointer_family.stderr
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/pointer_family.rs:11:5
|
||||||
|
|
|
||||||
|
LL | type Pointer<T>: Deref<Target = T>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
@ -16,15 +16,19 @@ impl<'a> NoShadow<'a> for &'a u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
trait ShadowT<T> {
|
trait ShadowT<T> {
|
||||||
type Bar<T>; //~ ERROR the name `T` is already used
|
type Bar<T>;
|
||||||
|
//~^ ERROR the name `T` is already used
|
||||||
|
//~| ERROR type-generic associated types are not yet implemented
|
||||||
}
|
}
|
||||||
|
|
||||||
trait NoShadowT<T> {
|
trait NoShadowT<T> {
|
||||||
type Bar<U>; // OK
|
type Bar<U>; // OK
|
||||||
|
//~^ ERROR type-generic associated types are not yet implemented
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> NoShadowT<T> for Option<T> {
|
impl<T> NoShadowT<T> for Option<T> {
|
||||||
type Bar<T> = i32; //~ ERROR the name `T` is already used
|
type Bar<T> = i32;
|
||||||
|
//~^ ERROR the name `T` is already used
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
@ -7,13 +7,29 @@ LL | type Bar<T>;
|
|||||||
| ^ already used
|
| ^ already used
|
||||||
|
|
||||||
error[E0403]: the name `T` is already used for a generic parameter in this item's generic parameters
|
error[E0403]: the name `T` is already used for a generic parameter in this item's generic parameters
|
||||||
--> $DIR/shadowing.rs:27:14
|
--> $DIR/shadowing.rs:30:14
|
||||||
|
|
|
|
||||||
LL | impl<T> NoShadowT<T> for Option<T> {
|
LL | impl<T> NoShadowT<T> for Option<T> {
|
||||||
| - first use of `T`
|
| - first use of `T`
|
||||||
LL | type Bar<T> = i32;
|
LL | type Bar<T> = i32;
|
||||||
| ^ already used
|
| ^ already used
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/shadowing.rs:19:5
|
||||||
|
|
|
||||||
|
LL | type Bar<T>;
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: type-generic associated types are not yet implemented
|
||||||
|
--> $DIR/shadowing.rs:25:5
|
||||||
|
|
|
||||||
|
LL | type Bar<U>; // OK
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0403`.
|
For more information about this error, try `rustc --explain E0403`.
|
@ -1,30 +1,26 @@
|
|||||||
#![feature(generic_associated_types)]
|
// run-pass
|
||||||
//~^ WARNING the feature `generic_associated_types` is incomplete
|
|
||||||
|
|
||||||
// FIXME(#44265): "lifetime argument not allowed on this type" errors will be addressed in a
|
#![allow(incomplete_features)]
|
||||||
// follow-up PR
|
#![feature(generic_associated_types)]
|
||||||
|
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|
||||||
trait StreamingIterator {
|
trait StreamingIterator {
|
||||||
type Item<'a>;
|
type Item<'a>;
|
||||||
// Applying the lifetime parameter `'a` to `Self::Item` inside the trait.
|
// Applying the lifetime parameter `'a` to `Self::Item` inside the trait.
|
||||||
fn next<'a>(&'a self) -> Option<Self::Item<'a>>;
|
fn next<'a>(&'a mut self) -> Option<Self::Item<'a>>;
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Foo<T: StreamingIterator> {
|
struct Foo<T: StreamingIterator> {
|
||||||
// Applying a concrete lifetime to the constructor outside the trait.
|
// Applying a concrete lifetime to the constructor outside the trait.
|
||||||
bar: <T as StreamingIterator>::Item<'static>,
|
bar: <T as StreamingIterator>::Item<'static>,
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Users can bound parameters by the type constructed by that trait's associated type constructor
|
// 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:
|
// 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
|
//FIXME(#44265): This next line should parse and be valid
|
||||||
//fn foo<T: for<'a> StreamingIterator<Item<'a>=&'a [i32]>>(iter: T) { /* ... */ }
|
//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 { /* ... */ }
|
fn _foo<T>(_iter: T) where T: StreamingIterator, for<'a> T::Item<'a>: Display { /* ... */ }
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
|
|
||||||
// Full example of enumerate iterator
|
// Full example of enumerate iterator
|
||||||
|
|
||||||
@ -36,9 +32,7 @@ struct StreamEnumerate<I> {
|
|||||||
|
|
||||||
impl<I: StreamingIterator> StreamingIterator for StreamEnumerate<I> {
|
impl<I: StreamingIterator> StreamingIterator for StreamEnumerate<I> {
|
||||||
type Item<'a> = (usize, I::Item<'a>);
|
type Item<'a> = (usize, I::Item<'a>);
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
fn next<'a>(&'a mut self) -> Option<Self::Item<'a>> {
|
||||||
fn next<'a>(&'a self) -> Option<Self::Item<'a>> {
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
match self.iter.next() {
|
match self.iter.next() {
|
||||||
None => None,
|
None => None,
|
||||||
Some(val) => {
|
Some(val) => {
|
||||||
@ -50,24 +44,34 @@ impl<I: StreamingIterator> StreamingIterator for StreamEnumerate<I> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<I: Iterator> StreamingIterator for I {
|
||||||
|
type Item<'a> = <I as Iterator>::Item;
|
||||||
|
fn next(&mut self) -> Option<<I as StreamingIterator>::Item<'_>> {
|
||||||
|
Iterator::next(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<I> StreamEnumerate<I> {
|
impl<I> StreamEnumerate<I> {
|
||||||
pub fn new(iter: I) -> Self {
|
pub fn new(iter: I) -> Self {
|
||||||
StreamEnumerate {
|
StreamEnumerate {
|
||||||
count: 0,
|
count: 0,
|
||||||
iter: iter,
|
iter,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_stream_enumerate() {
|
fn test_stream_enumerate() {
|
||||||
let v = vec!["a", "b", "c"];
|
let v = vec!["a", "b", "c"];
|
||||||
let se = StreamEnumerate::new(v.iter());
|
let mut se = StreamEnumerate::new(v.iter());
|
||||||
let a: &str = se.next().unwrap().1;
|
while let Some(item) = se.next() {
|
||||||
for (i, s) in se {
|
assert_eq!(v[item.0], *item.1);
|
||||||
println!("{} {}", i, s);
|
|
||||||
}
|
}
|
||||||
println!("{}", a);
|
let x = Foo::<std::slice::Iter<'static, u32>> {
|
||||||
|
bar: &0u32,
|
||||||
|
};
|
||||||
|
assert_eq!(*x.bar, 0u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
fn main() {}
|
test_stream_enumerate();
|
||||||
|
}
|
@ -19,4 +19,5 @@ impl X {
|
|||||||
//~| ERROR associated types are not yet supported in inherent impls
|
//~| ERROR associated types are not yet supported in inherent impls
|
||||||
type W where Self: Eq;
|
type W where Self: Eq;
|
||||||
//~^ ERROR associated type in `impl` without body
|
//~^ ERROR associated type in `impl` without body
|
||||||
|
//~| ERROR associated types are not yet supported in inherent impls
|
||||||
}
|
}
|
||||||
|
@ -68,6 +68,12 @@ error[E0202]: associated types are not yet supported in inherent impls (see #899
|
|||||||
LL | type W: Ord where Self: Eq;
|
LL | type W: Ord where Self: Eq;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error[E0202]: associated types are not yet supported in inherent impls (see #8995)
|
||||||
|
--> $DIR/impl-item-type-no-body-semantic-fail.rs:20:5
|
||||||
|
|
|
||||||
|
LL | type W where Self: Eq;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 10 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0202`.
|
For more information about this error, try `rustc --explain E0202`.
|
||||||
|
@ -16,7 +16,6 @@ impl S {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type A = <S as Tr>::A::f<u8>;
|
type A = <S as Tr>::A::f<u8>;
|
||||||
//~^ ERROR type arguments are not allowed for this type
|
//~^ ERROR ambiguous associated type
|
||||||
//~| ERROR ambiguous associated type
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,16 +1,9 @@
|
|||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/qualified-path-params-2.rs:18:26
|
|
||||||
|
|
|
||||||
LL | type A = <S as Tr>::A::f<u8>;
|
|
||||||
| ^^ type argument not allowed
|
|
||||||
|
|
||||||
error[E0223]: ambiguous associated type
|
error[E0223]: ambiguous associated type
|
||||||
--> $DIR/qualified-path-params-2.rs:18:10
|
--> $DIR/qualified-path-params-2.rs:18:10
|
||||||
|
|
|
|
||||||
LL | type A = <S as Tr>::A::f<u8>;
|
LL | type A = <S as Tr>::A::f<u8>;
|
||||||
| ^^^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<<S as Tr>::A as Trait>::f`
|
| ^^^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<<S as Tr>::A as Trait>::f`
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to previous error
|
||||||
|
|
||||||
Some errors have detailed explanations: E0109, E0223.
|
For more information about this error, try `rustc --explain E0223`.
|
||||||
For more information about an error, try `rustc --explain E0109`.
|
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
|
|
||||||
--> $DIR/collections.rs:1:12
|
|
||||||
|
|
|
||||||
LL | #![feature(generic_associated_types)]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/collections.rs:56:90
|
|
||||||
|
|
|
||||||
LL | fn floatify<C>(ints: &C) -> <<C as Collection<i32>>::Family as CollectionFamily>::Member<f32>
|
|
||||||
| ^^^ type argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/collections.rs:68:69
|
|
||||||
|
|
|
||||||
LL | fn floatify_sibling<C>(ints: &C) -> <C as Collection<i32>>::Sibling<f32>
|
|
||||||
| ^^^ type argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/collections.rs:17:71
|
|
||||||
|
|
|
||||||
LL | <<Self as Collection<T>>::Family as CollectionFamily>::Member<U>;
|
|
||||||
| ^ type argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/collections.rs:24:50
|
|
||||||
|
|
|
||||||
LL | fn iterate<'iter>(&'iter self) -> Self::Iter<'iter>;
|
|
||||||
| ^^^^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/collections.rs:50:50
|
|
||||||
|
|
|
||||||
LL | fn iterate<'iter>(&'iter self) -> Self::Iter<'iter> {
|
|
||||||
| ^^^^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0109`.
|
|
@ -1,29 +0,0 @@
|
|||||||
#![feature(generic_associated_types)]
|
|
||||||
//~^ WARNING the feature `generic_associated_types` is incomplete
|
|
||||||
|
|
||||||
use std::ops::Deref;
|
|
||||||
|
|
||||||
// FIXME(#44265): "lifetime arguments are not allowed for this type" errors will be addressed in a
|
|
||||||
// follow-up PR.
|
|
||||||
|
|
||||||
trait Foo {
|
|
||||||
type Bar<'a, 'b>;
|
|
||||||
}
|
|
||||||
|
|
||||||
trait Baz {
|
|
||||||
type Quux<'a>: Foo;
|
|
||||||
|
|
||||||
// This weird type tests that we can use universal function call syntax to access the Item on
|
|
||||||
type Baa<'a>: Deref<Target = <Self::Quux<'a> as Foo>::Bar<'a, 'static>>;
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
//~| ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> Baz for T where T: Foo {
|
|
||||||
type Quux<'a> = T;
|
|
||||||
|
|
||||||
type Baa<'a> = &'a <T as Foo>::Bar<'a, 'static>;
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
@ -1,29 +0,0 @@
|
|||||||
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
|
|
||||||
--> $DIR/construct_with_other_type.rs:1:12
|
|
||||||
|
|
|
||||||
LL | #![feature(generic_associated_types)]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/construct_with_other_type.rs:17:46
|
|
||||||
|
|
|
||||||
LL | type Baa<'a>: Deref<Target = <Self::Quux<'a> as Foo>::Bar<'a, 'static>>;
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/construct_with_other_type.rs:17:63
|
|
||||||
|
|
|
||||||
LL | type Baa<'a>: Deref<Target = <Self::Quux<'a> as Foo>::Bar<'a, 'static>>;
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/construct_with_other_type.rs:25:40
|
|
||||||
|
|
|
||||||
LL | type Baa<'a> = &'a <T as Foo>::Bar<'a, 'static>;
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0109`.
|
|
@ -1,16 +0,0 @@
|
|||||||
error: expected one of `>`, `const`, identifier, or lifetime, found `,`
|
|
||||||
--> $DIR/empty_generics.rs:5:14
|
|
||||||
|
|
|
||||||
LL | type Bar<,>;
|
|
||||||
| ^ expected one of `>`, `const`, identifier, or lifetime
|
|
||||||
|
|
||||||
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
|
|
||||||
--> $DIR/empty_generics.rs:1:12
|
|
||||||
|
|
|
||||||
LL | #![feature(generic_associated_types)]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
error[E0658]: generic associated types are unstable
|
|
||||||
--> $DIR/gat-dont-ice-on-absent-feature.rs:7:5
|
|
||||||
|
|
|
||||||
LL | type Item<'b> = &'b Foo;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: for more information, see https://github.com/rust-lang/rust/issues/44265
|
|
||||||
= help: add `#![feature(generic_associated_types)]` to the crate attributes to enable
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
|
@ -1,8 +0,0 @@
|
|||||||
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
|
|
||||||
--> $DIR/generic-associated-types-where.rs:1:12
|
|
||||||
|
|
|
||||||
LL | #![feature(generic_associated_types)]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
|||||||
#![feature(generic_associated_types)]
|
|
||||||
//~^ WARNING the feature `generic_associated_types` is incomplete
|
|
||||||
|
|
||||||
use std::ops::Deref;
|
|
||||||
|
|
||||||
// FIXME(#44265): "lifetime arguments are not allowed for this type" errors will be addressed in a
|
|
||||||
// follow-up PR.
|
|
||||||
|
|
||||||
trait Iterable {
|
|
||||||
type Item<'a>;
|
|
||||||
type Iter<'a>: Iterator<Item = Self::Item<'a>>
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
+ Deref<Target = Self::Item<'b>>;
|
|
||||||
//~^ ERROR undeclared lifetime
|
|
||||||
//~| ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
|
|
||||||
fn iter<'a>(&'a self) -> Self::Iter<'undeclared>;
|
|
||||||
//~^ ERROR undeclared lifetime
|
|
||||||
//~| ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
@ -1,42 +0,0 @@
|
|||||||
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
|
|
||||||
--> $DIR/generic_associated_type_undeclared_lifetimes.rs:1:12
|
|
||||||
|
|
|
||||||
LL | #![feature(generic_associated_types)]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error[E0261]: use of undeclared lifetime name `'b`
|
|
||||||
--> $DIR/generic_associated_type_undeclared_lifetimes.rs:13:37
|
|
||||||
|
|
|
||||||
LL | + Deref<Target = Self::Item<'b>>;
|
|
||||||
| ^^ undeclared lifetime
|
|
||||||
|
|
||||||
error[E0261]: use of undeclared lifetime name `'undeclared`
|
|
||||||
--> $DIR/generic_associated_type_undeclared_lifetimes.rs:17:41
|
|
||||||
|
|
|
||||||
LL | fn iter<'a>(&'a self) -> Self::Iter<'undeclared>;
|
|
||||||
| ^^^^^^^^^^^ undeclared lifetime
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/generic_associated_type_undeclared_lifetimes.rs:11:47
|
|
||||||
|
|
|
||||||
LL | type Iter<'a>: Iterator<Item = Self::Item<'a>>
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/generic_associated_type_undeclared_lifetimes.rs:13:37
|
|
||||||
|
|
|
||||||
LL | + Deref<Target = Self::Item<'b>>;
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/generic_associated_type_undeclared_lifetimes.rs:17:41
|
|
||||||
|
|
|
||||||
LL | fn iter<'a>(&'a self) -> Self::Iter<'undeclared>;
|
|
||||||
| ^^^^^^^^^^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
|
||||||
|
|
||||||
Some errors have detailed explanations: E0109, E0261.
|
|
||||||
For more information about an error, try `rustc --explain E0109`.
|
|
@ -1,50 +0,0 @@
|
|||||||
#![feature(generic_associated_types)]
|
|
||||||
//~^ WARNING the feature `generic_associated_types` is incomplete
|
|
||||||
|
|
||||||
use std::ops::Deref;
|
|
||||||
|
|
||||||
// FIXME(#44265): "lifetime arguments are not allowed for this type" errors will be addressed in a
|
|
||||||
// follow-up PR.
|
|
||||||
|
|
||||||
trait Iterable {
|
|
||||||
type Item<'a>;
|
|
||||||
type Iter<'a>: Iterator<Item = Self::Item<'a>>;
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
|
|
||||||
fn iter<'a>(&'a self) -> Self::Iter<'a>;
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Impl for struct type
|
|
||||||
impl<T> Iterable for Vec<T> {
|
|
||||||
type Item<'a> = &'a T;
|
|
||||||
type Iter<'a> = std::slice::Iter<'a, T>;
|
|
||||||
|
|
||||||
fn iter<'a>(&'a self) -> Self::Iter<'a> {
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
self.iter()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Impl for a primitive type
|
|
||||||
impl<T> Iterable for [T] {
|
|
||||||
type Item<'a> = &'a T;
|
|
||||||
type Iter<'a> = std::slice::Iter<'a, T>;
|
|
||||||
|
|
||||||
fn iter<'a>(&'a self) -> Self::Iter<'a> {
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
self.iter()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_iter<'a, I: Iterable>(it: &'a I) -> I::Iter<'a> {
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
it.iter()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_first<'a, I: Iterable>(it: &'a I) -> Option<I::Item<'a>> {
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
it.iter().next()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
@ -1,47 +0,0 @@
|
|||||||
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
|
|
||||||
--> $DIR/iterable.rs:1:12
|
|
||||||
|
|
|
||||||
LL | #![feature(generic_associated_types)]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/iterable.rs:11:47
|
|
||||||
|
|
|
||||||
LL | type Iter<'a>: Iterator<Item = Self::Item<'a>>;
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/iterable.rs:40:53
|
|
||||||
|
|
|
||||||
LL | fn make_iter<'a, I: Iterable>(it: &'a I) -> I::Iter<'a> {
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/iterable.rs:45:60
|
|
||||||
|
|
|
||||||
LL | fn get_first<'a, I: Iterable>(it: &'a I) -> Option<I::Item<'a>> {
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/iterable.rs:14:41
|
|
||||||
|
|
|
||||||
LL | fn iter<'a>(&'a self) -> Self::Iter<'a>;
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/iterable.rs:23:41
|
|
||||||
|
|
|
||||||
LL | fn iter<'a>(&'a self) -> Self::Iter<'a> {
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/iterable.rs:34:41
|
|
||||||
|
|
|
||||||
LL | fn iter<'a>(&'a self) -> Self::Iter<'a> {
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0109`.
|
|
@ -1,47 +0,0 @@
|
|||||||
#![feature(generic_associated_types)]
|
|
||||||
//~^ WARNING the feature `generic_associated_types` is incomplete
|
|
||||||
#![feature(associated_type_defaults)]
|
|
||||||
|
|
||||||
// FIXME(#44265): "lifetime arguments are not allowed for this type" errors will be addressed in a
|
|
||||||
// follow-up PR.
|
|
||||||
|
|
||||||
// FIXME(#44265): Update expected errors once E110 is resolved, now does not get past `trait Foo`.
|
|
||||||
|
|
||||||
trait Foo {
|
|
||||||
type A<'a>;
|
|
||||||
type B<'a, 'b>;
|
|
||||||
type C;
|
|
||||||
type D<T>;
|
|
||||||
type E<'a, T>;
|
|
||||||
// Test parameters in default values
|
|
||||||
type FOk<T> = Self::E<'static, T>;
|
|
||||||
//~^ ERROR type arguments are not allowed for this type [E0109]
|
|
||||||
//~| ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
type FErr1 = Self::E<'static, 'static>; // Error
|
|
||||||
//~^ ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
type FErr2<T> = Self::E<'static, T, u32>; // Error
|
|
||||||
//~^ ERROR type arguments are not allowed for this type [E0109]
|
|
||||||
//~| ERROR lifetime arguments are not allowed for this type [E0109]
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Fooy;
|
|
||||||
|
|
||||||
impl Foo for Fooy {
|
|
||||||
type A = u32; // Error: parameter expected
|
|
||||||
type B<'a, T> = Vec<T>; // Error: lifetime param expected
|
|
||||||
type C<'a> = u32; // Error: no param expected
|
|
||||||
type D<'a> = u32; // Error: type param expected
|
|
||||||
type E<T, U> = u32; // Error: lifetime expected as the first param
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Fooer;
|
|
||||||
|
|
||||||
impl Foo for Fooer {
|
|
||||||
type A<T> = u32; // Error: lifetime parameter expected
|
|
||||||
type B<'a> = u32; // Error: another lifetime param expected
|
|
||||||
type C<T> = T; // Error: no param expected
|
|
||||||
type D<'b, T> = u32; // Error: unexpected lifetime param
|
|
||||||
type E<'a, 'b> = u32; // Error: type expected as the second param
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
@ -1,41 +0,0 @@
|
|||||||
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
|
|
||||||
--> $DIR/parameter_number_and_kind.rs:1:12
|
|
||||||
|
|
|
||||||
LL | #![feature(generic_associated_types)]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/parameter_number_and_kind.rs:17:27
|
|
||||||
|
|
|
||||||
LL | type FOk<T> = Self::E<'static, T>;
|
|
||||||
| ^^^^^^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/parameter_number_and_kind.rs:17:36
|
|
||||||
|
|
|
||||||
LL | type FOk<T> = Self::E<'static, T>;
|
|
||||||
| ^ type argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/parameter_number_and_kind.rs:20:26
|
|
||||||
|
|
|
||||||
LL | type FErr1 = Self::E<'static, 'static>; // Error
|
|
||||||
| ^^^^^^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/parameter_number_and_kind.rs:22:29
|
|
||||||
|
|
|
||||||
LL | type FErr2<T> = Self::E<'static, T, u32>; // Error
|
|
||||||
| ^^^^^^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/parameter_number_and_kind.rs:22:38
|
|
||||||
|
|
|
||||||
LL | type FErr2<T> = Self::E<'static, T, u32>; // Error
|
|
||||||
| ^ type argument not allowed
|
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0109`.
|
|
@ -1,35 +0,0 @@
|
|||||||
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
|
|
||||||
--> $DIR/pointer_family.rs:1:12
|
|
||||||
|
|
|
||||||
LL | #![feature(generic_associated_types)]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/pointer_family.rs:37:21
|
|
||||||
|
|
|
||||||
LL | bar: P::Pointer<String>,
|
|
||||||
| ^^^^^^ type argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/pointer_family.rs:12:42
|
|
||||||
|
|
|
||||||
LL | fn new<T>(value: T) -> Self::Pointer<T>;
|
|
||||||
| ^ type argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/pointer_family.rs:20:42
|
|
||||||
|
|
|
||||||
LL | fn new<T>(value: T) -> Self::Pointer<T> {
|
|
||||||
| ^ type argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/pointer_family.rs:30:42
|
|
||||||
|
|
|
||||||
LL | fn new<T>(value: T) -> Self::Pointer<T> {
|
|
||||||
| ^ type argument not allowed
|
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0109`.
|
|
@ -1,41 +0,0 @@
|
|||||||
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
|
|
||||||
--> $DIR/streaming_iterator.rs:1:12
|
|
||||||
|
|
|
||||||
LL | #![feature(generic_associated_types)]
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/streaming_iterator.rs:18:41
|
|
||||||
|
|
|
||||||
LL | bar: <T as StreamingIterator>::Item<'static>,
|
|
||||||
| ^^^^^^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/streaming_iterator.rs:26:64
|
|
||||||
|
|
|
||||||
LL | fn foo<T>(iter: T) where T: StreamingIterator, for<'a> T::Item<'a>: Display { /* ... */ }
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/streaming_iterator.rs:12:48
|
|
||||||
|
|
|
||||||
LL | fn next<'a>(&'a self) -> Option<Self::Item<'a>>;
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/streaming_iterator.rs:38:37
|
|
||||||
|
|
|
||||||
LL | type Item<'a> = (usize, I::Item<'a>);
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error[E0109]: lifetime arguments are not allowed for this type
|
|
||||||
--> $DIR/streaming_iterator.rs:40:48
|
|
||||||
|
|
|
||||||
LL | fn next<'a>(&'a self) -> Option<Self::Item<'a>> {
|
|
||||||
| ^^ lifetime argument not allowed
|
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0109`.
|
|
@ -31,7 +31,6 @@ fn g<T: Tr<A = S>>() {
|
|||||||
fn main() {
|
fn main() {
|
||||||
let s = S::A {}; //~ ERROR ambiguous associated type
|
let s = S::A {}; //~ ERROR ambiguous associated type
|
||||||
let z = S::A::<u8> {}; //~ ERROR ambiguous associated type
|
let z = S::A::<u8> {}; //~ ERROR ambiguous associated type
|
||||||
//~^ ERROR type arguments are not allowed for this type
|
|
||||||
match S {
|
match S {
|
||||||
S::A {} => {} //~ ERROR ambiguous associated type
|
S::A {} => {} //~ ERROR ambiguous associated type
|
||||||
}
|
}
|
||||||
|
@ -34,12 +34,6 @@ error[E0223]: ambiguous associated type
|
|||||||
LL | let s = S::A {};
|
LL | let s = S::A {};
|
||||||
| ^^^^ help: use fully-qualified syntax: `<S as Trait>::A`
|
| ^^^^ help: use fully-qualified syntax: `<S as Trait>::A`
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/struct-path-associated-type.rs:33:20
|
|
||||||
|
|
|
||||||
LL | let z = S::A::<u8> {};
|
|
||||||
| ^^ type argument not allowed
|
|
||||||
|
|
||||||
error[E0223]: ambiguous associated type
|
error[E0223]: ambiguous associated type
|
||||||
--> $DIR/struct-path-associated-type.rs:33:13
|
--> $DIR/struct-path-associated-type.rs:33:13
|
||||||
|
|
|
|
||||||
@ -47,12 +41,12 @@ LL | let z = S::A::<u8> {};
|
|||||||
| ^^^^^^^^^^ help: use fully-qualified syntax: `<S as Trait>::A`
|
| ^^^^^^^^^^ help: use fully-qualified syntax: `<S as Trait>::A`
|
||||||
|
|
||||||
error[E0223]: ambiguous associated type
|
error[E0223]: ambiguous associated type
|
||||||
--> $DIR/struct-path-associated-type.rs:36:9
|
--> $DIR/struct-path-associated-type.rs:35:9
|
||||||
|
|
|
|
||||||
LL | S::A {} => {}
|
LL | S::A {} => {}
|
||||||
| ^^^^ help: use fully-qualified syntax: `<S as Trait>::A`
|
| ^^^^ help: use fully-qualified syntax: `<S as Trait>::A`
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error: aborting due to 8 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0071, E0109, E0223.
|
Some errors have detailed explanations: E0071, E0109, E0223.
|
||||||
For more information about an error, try `rustc --explain E0071`.
|
For more information about an error, try `rustc --explain E0071`.
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
pub fn foo(num: i32) -> i32 {
|
pub fn foo(num: i32) -> i32 {
|
||||||
let foo: i32::from_be(num);
|
let foo: i32::from_be(num);
|
||||||
//~^ ERROR expected type, found local variable `num`
|
//~^ ERROR expected type, found local variable `num`
|
||||||
//~| ERROR type arguments are not allowed for this type
|
|
||||||
//~| ERROR parenthesized type parameters may only be used with a `Fn` trait
|
//~| ERROR parenthesized type parameters may only be used with a `Fn` trait
|
||||||
//~| ERROR ambiguous associated type
|
//~| ERROR ambiguous associated type
|
||||||
foo
|
foo
|
||||||
|
@ -15,19 +15,13 @@ LL | let foo: i32::from_be(num);
|
|||||||
| only `Fn` traits may use parentheses
|
| only `Fn` traits may use parentheses
|
||||||
| help: use angle brackets instead: `from_be<num>`
|
| help: use angle brackets instead: `from_be<num>`
|
||||||
|
|
||||||
error[E0109]: type arguments are not allowed for this type
|
|
||||||
--> $DIR/let-binding-init-expr-as-ty.rs:2:27
|
|
||||||
|
|
|
||||||
LL | let foo: i32::from_be(num);
|
|
||||||
| ^^^ type argument not allowed
|
|
||||||
|
|
||||||
error[E0223]: ambiguous associated type
|
error[E0223]: ambiguous associated type
|
||||||
--> $DIR/let-binding-init-expr-as-ty.rs:2:14
|
--> $DIR/let-binding-init-expr-as-ty.rs:2:14
|
||||||
|
|
|
|
||||||
LL | let foo: i32::from_be(num);
|
LL | let foo: i32::from_be(num);
|
||||||
| ^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<i32 as Trait>::from_be`
|
| ^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<i32 as Trait>::from_be`
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0109, E0214, E0223, E0573.
|
Some errors have detailed explanations: E0214, E0223, E0573.
|
||||||
For more information about an error, try `rustc --explain E0109`.
|
For more information about an error, try `rustc --explain E0214`.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user