Split monster tests into smaller ones
This commit is contained in:
parent
35351591af
commit
0f05b4be82
29 changed files with 456 additions and 331 deletions
17
src/test/ui/existential_types/declared_but_never_defined.rs
Normal file
17
src/test/ui/existential_types/declared_but_never_defined.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
// declared but never defined
|
||||
existential type Bar: std::fmt::Debug; //~ ERROR could not find defining uses
|
|
@ -0,0 +1,8 @@
|
|||
error: could not find defining uses
|
||||
--> $DIR/declared_but_never_defined.rs:17:1
|
||||
|
|
||||
LL | existential type Bar: std::fmt::Debug; //~ ERROR could not find defining uses
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
mod boo {
|
||||
// declared in module but not defined inside of it
|
||||
pub existential type Boo: ::std::fmt::Debug; //~ ERROR could not find defining uses
|
||||
}
|
||||
|
||||
fn bomp() -> boo::Boo {
|
||||
""
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
error: could not find defining uses
|
||||
--> $DIR/declared_but_not_defined_in_scope.rs:18:5
|
||||
|
|
||||
LL | pub existential type Boo: ::std::fmt::Debug; //~ ERROR could not find defining uses
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
25
src/test/ui/existential_types/different_defining_uses.rs
Normal file
25
src/test/ui/existential_types/different_defining_uses.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
// two definitions with different types
|
||||
existential type Foo: std::fmt::Debug;
|
||||
|
||||
fn foo() -> Foo {
|
||||
""
|
||||
}
|
||||
|
||||
fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
|
||||
42i32
|
||||
}
|
18
src/test/ui/existential_types/different_defining_uses.stderr
Normal file
18
src/test/ui/existential_types/different_defining_uses.stderr
Normal file
|
@ -0,0 +1,18 @@
|
|||
error: defining existential type use differs from previous
|
||||
--> $DIR/different_defining_uses.rs:23:1
|
||||
|
|
||||
LL | / fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
|
||||
LL | | 42i32
|
||||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
note: previous use here
|
||||
--> $DIR/different_defining_uses.rs:19:1
|
||||
|
|
||||
LL | / fn foo() -> Foo {
|
||||
LL | | ""
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
// two definitions with different types
|
||||
existential type Foo: std::fmt::Debug;
|
||||
|
||||
fn foo() -> Foo {
|
||||
""
|
||||
}
|
||||
|
||||
fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
|
||||
panic!()
|
||||
}
|
||||
|
||||
fn boo() -> Foo { //~ ERROR defining existential type use differs from previous
|
||||
loop {}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
error: defining existential type use differs from previous
|
||||
--> $DIR/different_defining_uses_never_type.rs:23:1
|
||||
|
|
||||
LL | / fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
|
||||
LL | | panic!()
|
||||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
note: previous use here
|
||||
--> $DIR/different_defining_uses_never_type.rs:19:1
|
||||
|
|
||||
LL | / fn foo() -> Foo {
|
||||
LL | | ""
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: defining existential type use differs from previous
|
||||
--> $DIR/different_defining_uses_never_type.rs:27:1
|
||||
|
|
||||
LL | / fn boo() -> Foo { //~ ERROR defining existential type use differs from previous
|
||||
LL | | loop {}
|
||||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
note: previous use here
|
||||
--> $DIR/different_defining_uses_never_type.rs:19:1
|
||||
|
|
||||
LL | / fn foo() -> Foo {
|
||||
LL | | ""
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
// compile-pass
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
// two definitions with different types
|
||||
existential type Foo: std::fmt::Debug;
|
||||
|
||||
fn foo() -> Foo {
|
||||
""
|
||||
}
|
||||
|
||||
fn bar(arg: bool) -> Foo {
|
||||
if arg {
|
||||
panic!()
|
||||
} else {
|
||||
"bar"
|
||||
}
|
||||
}
|
||||
|
||||
fn boo(arg: bool) -> Foo {
|
||||
if arg {
|
||||
loop {}
|
||||
} else {
|
||||
"boo"
|
||||
}
|
||||
}
|
||||
|
||||
fn bar2(arg: bool) -> Foo {
|
||||
if arg {
|
||||
"bar2"
|
||||
} else {
|
||||
panic!()
|
||||
}
|
||||
}
|
||||
|
||||
fn boo2(arg: bool) -> Foo {
|
||||
if arg {
|
||||
"boo2"
|
||||
} else {
|
||||
loop {}
|
||||
}
|
||||
}
|
|
@ -1,111 +0,0 @@
|
|||
error: defining existential type use differs from previous
|
||||
--> $DIR/existential_type.rs:23:1
|
||||
|
|
||||
LL | / fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
|
||||
LL | | 42i32
|
||||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
note: previous use here
|
||||
--> $DIR/existential_type.rs:19:1
|
||||
|
|
||||
LL | / fn foo() -> Foo {
|
||||
LL | | ""
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/existential_type.rs:36:5
|
||||
|
|
||||
LL | fn bomp() -> boo::Boo {
|
||||
| -------- expected `Boo` because of return type
|
||||
LL | "" //~ ERROR mismatched types
|
||||
| ^^ expected anonymized type, found reference
|
||||
|
|
||||
= note: expected type `Boo`
|
||||
found type `&'static str`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/existential_type.rs:50:23
|
||||
|
|
||||
LL | let _: &str = bomp(); //~ ERROR mismatched types
|
||||
| ^^^^^^ expected &str, found anonymized type
|
||||
|
|
||||
= note: expected type `&str`
|
||||
found type `Boo`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/existential_type.rs:54:9
|
||||
|
|
||||
LL | fn bomp() -> boo::Boo {
|
||||
| -------- expected `Boo` because of return type
|
||||
LL | "" //~ ERROR mismatched types
|
||||
| ^^ expected anonymized type, found reference
|
||||
|
|
||||
= note: expected type `Boo`
|
||||
found type `&'static str`
|
||||
|
||||
error[E0277]: the trait bound `T: Trait` is not satisfied
|
||||
--> $DIR/existential_type.rs:61:1
|
||||
|
|
||||
LL | existential type Underconstrained<T: Trait>: 'static; //~ ERROR the trait bound `T: Trait`
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: Trait` bound
|
||||
= note: the return type of a function must have a statically known size
|
||||
|
||||
warning: not reporting region error due to nll
|
||||
--> $DIR/existential_type.rs:78:1
|
||||
|
|
||||
LL | existential type WrongGeneric<T>: 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/existential_type.rs:93:27
|
||||
|
|
||||
LL | let _: &'static str = x; //~ mismatched types
|
||||
| ^ expected reference, found anonymized type
|
||||
|
|
||||
= note: expected type `&'static str`
|
||||
found type `NoReveal`
|
||||
|
||||
error[E0605]: non-primitive cast: `NoReveal` as `&'static str`
|
||||
--> $DIR/existential_type.rs:94:13
|
||||
|
|
||||
LL | let _ = x as &'static str; //~ non-primitive cast
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
|
||||
|
||||
error: could not find defining uses
|
||||
--> $DIR/existential_type.rs:28:1
|
||||
|
|
||||
LL | existential type Bar: std::fmt::Debug; //~ ERROR could not find defining uses
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: could not find defining uses
|
||||
--> $DIR/existential_type.rs:32:5
|
||||
|
|
||||
LL | pub existential type Boo: ::std::fmt::Debug; //~ ERROR could not find defining uses
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: defining existential type use differs from previous
|
||||
--> $DIR/existential_type.rs:74:1
|
||||
|
|
||||
LL | / fn my_iter2<T>(t: T) -> MyIter<T> { //~ ERROR defining existential type use differs from previous
|
||||
LL | | Some(t).into_iter()
|
||||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
note: previous use here
|
||||
--> $DIR/existential_type.rs:70:1
|
||||
|
|
||||
LL | / fn my_iter<T>(t: T) -> MyIter<T> {
|
||||
LL | | std::iter::once(t)
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
|
||||
Some errors occurred: E0277, E0308, E0605.
|
||||
For more information about an error, try `rustc --explain E0277`.
|
|
@ -1,95 +0,0 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
// two definitions with different types
|
||||
existential type Foo: std::fmt::Debug;
|
||||
|
||||
fn foo() -> Foo {
|
||||
""
|
||||
}
|
||||
|
||||
fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
|
||||
42i32
|
||||
}
|
||||
|
||||
// declared but never defined
|
||||
existential type Bar: std::fmt::Debug; //~ ERROR could not find defining uses
|
||||
|
||||
mod boo {
|
||||
// declared in module but not defined inside of it
|
||||
pub existential type Boo: ::std::fmt::Debug; //~ ERROR could not find defining uses
|
||||
}
|
||||
|
||||
fn bomp() -> boo::Boo {
|
||||
"" //~ ERROR mismatched types
|
||||
}
|
||||
|
||||
mod boo2 {
|
||||
mod boo {
|
||||
pub existential type Boo: ::std::fmt::Debug;
|
||||
fn bomp() -> Boo {
|
||||
""
|
||||
}
|
||||
}
|
||||
|
||||
// don't actually know the type here
|
||||
|
||||
fn bomp2() {
|
||||
let _: &str = bomp(); //~ ERROR mismatched types
|
||||
}
|
||||
|
||||
fn bomp() -> boo::Boo {
|
||||
"" //~ ERROR mismatched types
|
||||
}
|
||||
}
|
||||
|
||||
// generics
|
||||
|
||||
trait Trait {}
|
||||
existential type Underconstrained<T: Trait>: 'static; //~ ERROR the trait bound `T: Trait`
|
||||
|
||||
// no `Trait` bound
|
||||
fn underconstrain<T>(_: T) -> Underconstrained<T> {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
existential type MyIter<T>: Iterator<Item = T>;
|
||||
|
||||
fn my_iter<T>(t: T) -> MyIter<T> {
|
||||
std::iter::once(t)
|
||||
}
|
||||
|
||||
fn my_iter2<T>(t: T) -> MyIter<T> { //~ ERROR defining existential type use differs from previous
|
||||
Some(t).into_iter()
|
||||
}
|
||||
|
||||
existential type WrongGeneric<T>: 'static;
|
||||
//~^ ERROR the parameter type `T` may not live long enough
|
||||
|
||||
fn wrong_generic<T>(t: T) -> WrongGeneric<T> {
|
||||
t
|
||||
}
|
||||
|
||||
// don't reveal the concrete type
|
||||
existential type NoReveal: std::fmt::Debug;
|
||||
|
||||
fn define_no_reveal() -> NoReveal {
|
||||
""
|
||||
}
|
||||
|
||||
fn no_reveal(x: NoReveal) {
|
||||
let _: &'static str = x; //~ mismatched types
|
||||
let _ = x as &'static str; //~ non-primitive cast
|
||||
}
|
|
@ -1,120 +0,0 @@
|
|||
error: defining existential type use differs from previous
|
||||
--> $DIR/existential_type.rs:23:1
|
||||
|
|
||||
LL | / fn bar() -> Foo { //~ ERROR defining existential type use differs from previous
|
||||
LL | | 42i32
|
||||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
note: previous use here
|
||||
--> $DIR/existential_type.rs:19:1
|
||||
|
|
||||
LL | / fn foo() -> Foo {
|
||||
LL | | ""
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/existential_type.rs:36:5
|
||||
|
|
||||
LL | fn bomp() -> boo::Boo {
|
||||
| -------- expected `Boo` because of return type
|
||||
LL | "" //~ ERROR mismatched types
|
||||
| ^^ expected anonymized type, found reference
|
||||
|
|
||||
= note: expected type `Boo`
|
||||
found type `&'static str`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/existential_type.rs:50:23
|
||||
|
|
||||
LL | let _: &str = bomp(); //~ ERROR mismatched types
|
||||
| ^^^^^^ expected &str, found anonymized type
|
||||
|
|
||||
= note: expected type `&str`
|
||||
found type `Boo`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/existential_type.rs:54:9
|
||||
|
|
||||
LL | fn bomp() -> boo::Boo {
|
||||
| -------- expected `Boo` because of return type
|
||||
LL | "" //~ ERROR mismatched types
|
||||
| ^^ expected anonymized type, found reference
|
||||
|
|
||||
= note: expected type `Boo`
|
||||
found type `&'static str`
|
||||
|
||||
error[E0277]: the trait bound `T: Trait` is not satisfied
|
||||
--> $DIR/existential_type.rs:61:1
|
||||
|
|
||||
LL | existential type Underconstrained<T: Trait>: 'static; //~ ERROR the trait bound `T: Trait`
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: Trait` bound
|
||||
= note: the return type of a function must have a statically known size
|
||||
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/existential_type.rs:78:1
|
||||
|
|
||||
LL | existential type WrongGeneric<T>: 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | fn wrong_generic<T>(t: T) -> WrongGeneric<T> {
|
||||
| - help: consider adding an explicit lifetime bound `T: 'static`...
|
||||
|
|
||||
note: ...so that the type `T` will meet its required lifetime bounds
|
||||
--> $DIR/existential_type.rs:78:1
|
||||
|
|
||||
LL | existential type WrongGeneric<T>: 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/existential_type.rs:93:27
|
||||
|
|
||||
LL | let _: &'static str = x; //~ mismatched types
|
||||
| ^ expected reference, found anonymized type
|
||||
|
|
||||
= note: expected type `&'static str`
|
||||
found type `NoReveal`
|
||||
|
||||
error[E0605]: non-primitive cast: `NoReveal` as `&'static str`
|
||||
--> $DIR/existential_type.rs:94:13
|
||||
|
|
||||
LL | let _ = x as &'static str; //~ non-primitive cast
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
|
||||
|
||||
error: could not find defining uses
|
||||
--> $DIR/existential_type.rs:28:1
|
||||
|
|
||||
LL | existential type Bar: std::fmt::Debug; //~ ERROR could not find defining uses
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: could not find defining uses
|
||||
--> $DIR/existential_type.rs:32:5
|
||||
|
|
||||
LL | pub existential type Boo: ::std::fmt::Debug; //~ ERROR could not find defining uses
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: defining existential type use differs from previous
|
||||
--> $DIR/existential_type.rs:74:1
|
||||
|
|
||||
LL | / fn my_iter2<T>(t: T) -> MyIter<T> { //~ ERROR defining existential type use differs from previous
|
||||
LL | | Some(t).into_iter()
|
||||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
note: previous use here
|
||||
--> $DIR/existential_type.rs:70:1
|
||||
|
|
||||
LL | / fn my_iter<T>(t: T) -> MyIter<T> {
|
||||
LL | | std::iter::once(t)
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to 11 previous errors
|
||||
|
||||
Some errors occurred: E0277, E0308, E0310, E0605.
|
||||
For more information about an error, try `rustc --explain E0277`.
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
existential type MyIter<T>: Iterator<Item = T>;
|
||||
|
||||
fn my_iter<T>(t: T) -> MyIter<T> {
|
||||
std::iter::once(t)
|
||||
}
|
||||
|
||||
fn my_iter2<T>(t: T) -> MyIter<T> { //~ ERROR defining existential type use differs from previous
|
||||
Some(t).into_iter()
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
error: defining existential type use differs from previous
|
||||
--> $DIR/generic_different_defining_uses.rs:22:1
|
||||
|
|
||||
LL | / fn my_iter2<T>(t: T) -> MyIter<T> { //~ ERROR defining existential type use differs from previous
|
||||
LL | | Some(t).into_iter()
|
||||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
note: previous use here
|
||||
--> $DIR/generic_different_defining_uses.rs:18:1
|
||||
|
|
||||
LL | / fn my_iter<T>(t: T) -> MyIter<T> {
|
||||
LL | | std::iter::once(t)
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
error: non-defining existential type use in defining scope
|
||||
--> $DIR/existential_type4.rs:19:1
|
||||
--> $DIR/generic_nondefining_use.rs:19:1
|
||||
|
|
||||
LL | / fn cmp() -> Cmp<u32> { //~ ERROR non-defining existential type use in defining scope
|
||||
LL | | 5u32
|
||||
|
@ -7,7 +7,7 @@ LL | | }
|
|||
| |_^
|
||||
|
|
||||
note: used non-generic type u32 for generic parameter
|
||||
--> $DIR/existential_type4.rs:16:22
|
||||
--> $DIR/generic_nondefining_use.rs:16:22
|
||||
|
|
||||
LL | existential type Cmp<T>: 'static;
|
||||
| ^
|
|
@ -1,5 +1,5 @@
|
|||
error: type parameter `V` is part of concrete type but not used in parameter list for existential type
|
||||
--> $DIR/existential_type3.rs:18:73
|
||||
--> $DIR/generic_not_used.rs:18:73
|
||||
|
|
||||
LL | fn wrong_generic<U: 'static, V: 'static>(_: U, v: V) -> WrongGeneric<U> {
|
||||
| _________________________________________________________________________^
|
|
@ -0,0 +1,17 @@
|
|||
warning: not reporting region error due to nll
|
||||
--> $DIR/generic_type_does_not_live_long_enough.rs:16:1
|
||||
|
|
||||
LL | existential type WrongGeneric<T>: 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/generic_type_does_not_live_long_enough.rs:20:5
|
||||
|
|
||||
LL | t
|
||||
| ^
|
||||
|
|
||||
= help: consider adding an explicit lifetime bound `T: 'static`...
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0310`.
|
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
existential type WrongGeneric<T>: 'static;
|
||||
//~^ ERROR the parameter type `T` may not live long enough
|
||||
|
||||
fn wrong_generic<T>(t: T) -> WrongGeneric<T> {
|
||||
t
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/generic_type_does_not_live_long_enough.rs:16:1
|
||||
|
|
||||
LL | existential type WrongGeneric<T>: 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | fn wrong_generic<T>(t: T) -> WrongGeneric<T> {
|
||||
| - help: consider adding an explicit lifetime bound `T: 'static`...
|
||||
|
|
||||
note: ...so that the type `T` will meet its required lifetime bounds
|
||||
--> $DIR/generic_type_does_not_live_long_enough.rs:16:1
|
||||
|
|
||||
LL | existential type WrongGeneric<T>: 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0310`.
|
22
src/test/ui/existential_types/generic_underconstrained.rs
Normal file
22
src/test/ui/existential_types/generic_underconstrained.rs
Normal file
|
@ -0,0 +1,22 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
trait Trait {}
|
||||
existential type Underconstrained<T: Trait>: 'static; //~ ERROR the trait bound `T: Trait`
|
||||
|
||||
// no `Trait` bound
|
||||
fn underconstrain<T>(_: T) -> Underconstrained<T> {
|
||||
unimplemented!()
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
error[E0277]: the trait bound `T: Trait` is not satisfied
|
||||
--> $DIR/generic_underconstrained.rs:17:1
|
||||
|
|
||||
LL | existential type Underconstrained<T: Trait>: 'static; //~ ERROR the trait bound `T: Trait`
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `T`
|
||||
|
|
||||
= help: consider adding a `where T: Trait` bound
|
||||
= note: the return type of a function must have a statically known size
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
|
@ -1,5 +1,5 @@
|
|||
error[E0277]: `U` doesn't implement `std::fmt::Debug`
|
||||
--> $DIR/existential_type2.rs:16:1
|
||||
--> $DIR/generic_underconstrained2.rs:16:1
|
||||
|
|
||||
LL | existential type Underconstrained<T: std::fmt::Debug>: 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `U` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
|
||||
|
@ -9,7 +9,7 @@ LL | existential type Underconstrained<T: std::fmt::Debug>: 'static;
|
|||
= note: the return type of a function must have a statically known size
|
||||
|
||||
error[E0277]: `V` doesn't implement `std::fmt::Debug`
|
||||
--> $DIR/existential_type2.rs:24:1
|
||||
--> $DIR/generic_underconstrained2.rs:24:1
|
||||
|
|
||||
LL | existential type Underconstrained2<T: std::fmt::Debug>: 'static;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `V` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
|
26
src/test/ui/existential_types/never_reveal_concrete_type.rs
Normal file
26
src/test/ui/existential_types/never_reveal_concrete_type.rs
Normal file
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
// don't reveal the concrete type
|
||||
existential type NoReveal: std::fmt::Debug;
|
||||
|
||||
fn define_no_reveal() -> NoReveal {
|
||||
""
|
||||
}
|
||||
|
||||
fn no_reveal(x: NoReveal) {
|
||||
let _: &'static str = x; //~ mismatched types
|
||||
let _ = x as &'static str; //~ non-primitive cast
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/never_reveal_concrete_type.rs:24:27
|
||||
|
|
||||
LL | let _: &'static str = x; //~ mismatched types
|
||||
| ^ expected reference, found anonymized type
|
||||
|
|
||||
= note: expected type `&'static str`
|
||||
found type `NoReveal`
|
||||
|
||||
error[E0605]: non-primitive cast: `NoReveal` as `&'static str`
|
||||
--> $DIR/never_reveal_concrete_type.rs:25:13
|
||||
|
|
||||
LL | let _ = x as &'static str; //~ non-primitive cast
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors occurred: E0308, E0605.
|
||||
For more information about an error, try `rustc --explain E0308`.
|
|
@ -0,0 +1,33 @@
|
|||
// Copyright 2018 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.
|
||||
|
||||
|
||||
#![feature(existential_type)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
mod boo2 {
|
||||
mod boo {
|
||||
pub existential type Boo: ::std::fmt::Debug;
|
||||
fn bomp() -> Boo {
|
||||
""
|
||||
}
|
||||
}
|
||||
|
||||
// don't actually know the type here
|
||||
|
||||
fn bomp2() {
|
||||
let _: &str = bomp(); //~ ERROR mismatched types
|
||||
}
|
||||
|
||||
fn bomp() -> boo::Boo {
|
||||
"" //~ ERROR mismatched types
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/no_revealing_outside_defining_module.rs:27:23
|
||||
|
|
||||
LL | let _: &str = bomp(); //~ ERROR mismatched types
|
||||
| ^^^^^^ expected &str, found anonymized type
|
||||
|
|
||||
= note: expected type `&str`
|
||||
found type `Boo`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/no_revealing_outside_defining_module.rs:31:9
|
||||
|
|
||||
LL | fn bomp() -> boo::Boo {
|
||||
| -------- expected `Boo` because of return type
|
||||
LL | "" //~ ERROR mismatched types
|
||||
| ^^ expected anonymized type, found reference
|
||||
|
|
||||
= note: expected type `Boo`
|
||||
found type `&'static str`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
Loading…
Add table
Add a link
Reference in a new issue