diff options
6 files changed, 112 insertions, 1 deletions
diff --git a/src/test/ui/existential_types/bound_reduction.rs b/src/test/ui/existential_types/bound_reduction.rs new file mode 100644 index 00000000000..2e42c92ab30 --- /dev/null +++ b/src/test/ui/existential_types/bound_reduction.rs @@ -0,0 +1,30 @@ +// 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 + +#![allow(warnings)] + +#![feature(existential_type)] + +fn main() { +} + +existential type Foo<V>: std::fmt::Debug; + +trait Trait<U> {} + +fn foo_desugared<T: Trait<[u32; { + #[no_mangle] + static FOO: usize = 42; + 3 +}]>>(_: T) -> Foo<T> { + (42, std::marker::PhantomData::<T>) +} diff --git a/src/test/ui/existential_types/bound_reduction2.rs b/src/test/ui/existential_types/bound_reduction2.rs new file mode 100644 index 00000000000..d098a4ef4c8 --- /dev/null +++ b/src/test/ui/existential_types/bound_reduction2.rs @@ -0,0 +1,28 @@ +// 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 TraitWithAssoc { + type Assoc; +} + +existential type Foo<V>: Trait<V>; + +trait Trait<U> {} + +impl<W> Trait<W> for () {} + +fn foo_desugared<T: TraitWithAssoc>(_: T) -> Foo<T::Assoc> { //~ ERROR non-defining + () +} diff --git a/src/test/ui/existential_types/bound_reduction2.stderr b/src/test/ui/existential_types/bound_reduction2.stderr new file mode 100644 index 00000000000..33b8b71bffb --- /dev/null +++ b/src/test/ui/existential_types/bound_reduction2.stderr @@ -0,0 +1,16 @@ +error: non-defining existential type use in defining scope + --> $DIR/bound_reduction2.rs:26:1 + | +LL | / fn foo_desugared<T: TraitWithAssoc>(_: T) -> Foo<T::Assoc> { //~ ERROR non-defining +LL | | () +LL | | } + | |_^ + | +note: used non-generic type <T as TraitWithAssoc>::Assoc for generic parameter + --> $DIR/bound_reduction2.rs:20:22 + | +LL | existential type Foo<V>: Trait<V>; + | ^ + +error: aborting due to previous error + diff --git a/src/test/ui/existential_types/no_revealing_outside_defining_module.rs b/src/test/ui/existential_types/no_revealing_outside_defining_module.rs index 41c17c357bc..f646891b3b4 100644 --- a/src/test/ui/existential_types/no_revealing_outside_defining_module.rs +++ b/src/test/ui/existential_types/no_revealing_outside_defining_module.rs @@ -32,4 +32,4 @@ fn bomp() -> boo::Boo { fn bomp_loop() -> boo::Boo { loop {} -} \ No newline at end of file +} diff --git a/src/test/ui/existential_types/not_well_formed.rs b/src/test/ui/existential_types/not_well_formed.rs new file mode 100644 index 00000000000..b3d38aee8c5 --- /dev/null +++ b/src/test/ui/existential_types/not_well_formed.rs @@ -0,0 +1,28 @@ +// 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 TraitWithAssoc { + type Assoc; +} + +existential type Foo<V>: Trait<V::Assoc>; //~ associated type `Assoc` not found for `V` + +trait Trait<U> {} + +impl<W> Trait<W> for () {} + +fn foo_desugared<T: TraitWithAssoc>(_: T) -> Foo<T> { + () +} diff --git a/src/test/ui/existential_types/not_well_formed.stderr b/src/test/ui/existential_types/not_well_formed.stderr new file mode 100644 index 00000000000..6b7d1be98a7 --- /dev/null +++ b/src/test/ui/existential_types/not_well_formed.stderr @@ -0,0 +1,9 @@ +error[E0220]: associated type `Assoc` not found for `V` + --> $DIR/not_well_formed.rs:20:32 + | +LL | existential type Foo<V>: Trait<V::Assoc>; //~ associated type `Assoc` not found for `V` + | ^^^^^^^^ associated type `Assoc` not found + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0220`. |
