diff options
| author | bors <bors@rust-lang.org> | 2018-07-27 07:16:12 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-07-27 07:16:12 +0000 |
| commit | 7c2aeb9d974e85e54efa18cd63195bfd95347a44 (patch) | |
| tree | eda24586b4082ba5251124cf3fbef61aad0f74fe /src/test/ui/impl-trait | |
| parent | 3d0e93309d61636585cfe5ac75c0db8cb5ba03e1 (diff) | |
| parent | 33712a8a10eb193e1d90c52b666a053309b7a8dc (diff) | |
| download | rust-7c2aeb9d974e85e54efa18cd63195bfd95347a44.tar.gz rust-7c2aeb9d974e85e54efa18cd63195bfd95347a44.zip | |
Auto merge of #52650 - oli-obk:associated_existential_types, r=nikomatsakis
Implement associated existential types r? @nikomatsakis no idea if these work with generic traits. I'm going home for the day :rofl:
Diffstat (limited to 'src/test/ui/impl-trait')
3 files changed, 104 insertions, 0 deletions
diff --git a/src/test/ui/impl-trait/associated-existential-type-generic-trait.rs b/src/test/ui/impl-trait/associated-existential-type-generic-trait.rs new file mode 100644 index 00000000000..c9bf7b87ef4 --- /dev/null +++ b/src/test/ui/impl-trait/associated-existential-type-generic-trait.rs @@ -0,0 +1,40 @@ +// 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)] +// compile-pass + +trait Bar {} +struct Dummy<U>(U); +impl<V> Bar for Dummy<V> {} + +trait Foo<T> { + type Assoc: Bar; + fn foo(t: T) -> Self::Assoc; +} + +impl<W> Foo<W> for i32 { + existential type Assoc: Bar; + fn foo(w: W) -> Self::Assoc { + Dummy(w) + } +} + +struct NonGeneric; +impl Bar for NonGeneric {} + +impl<W> Foo<W> for u32 { + existential type Assoc: Bar; + fn foo(_: W) -> Self::Assoc { + NonGeneric + } +} + +fn main() {} diff --git a/src/test/ui/impl-trait/associated-existential-type-trivial.rs b/src/test/ui/impl-trait/associated-existential-type-trivial.rs new file mode 100644 index 00000000000..78593fe319c --- /dev/null +++ b/src/test/ui/impl-trait/associated-existential-type-trivial.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. + +#![feature(existential_type)] +// compile-pass + +trait Bar {} +struct Dummy; +impl Bar for Dummy {} + +trait Foo { + type Assoc: Bar; + fn foo() -> Self::Assoc; +} + +impl Foo for i32 { + existential type Assoc: Bar; + fn foo() -> Self::Assoc { + Dummy + } +} + +fn main() {} diff --git a/src/test/ui/impl-trait/associated-existential-type.rs b/src/test/ui/impl-trait/associated-existential-type.rs new file mode 100644 index 00000000000..d880428411f --- /dev/null +++ b/src/test/ui/impl-trait/associated-existential-type.rs @@ -0,0 +1,34 @@ +// 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)] +// compile-pass + +trait Bar {} +struct Dummy; +impl Bar for Dummy {} + +trait Foo { + type Assoc: Bar; + fn foo() -> Self::Assoc; + fn bar() -> Self::Assoc; +} + +impl Foo for i32 { + existential type Assoc: Bar; + fn foo() -> Self::Assoc { + Dummy + } + fn bar() -> Self::Assoc { + Dummy + } +} + +fn main() {} |
