diff options
| author | Aaron Turon <aturon@mozilla.com> | 2015-12-28 15:40:11 -0800 |
|---|---|---|
| committer | Aaron Turon <aturon@mozilla.com> | 2016-03-14 15:04:36 -0700 |
| commit | 1077ff2deca4c80f27596905119a84564fe9813f (patch) | |
| tree | 645464b95a9dd92dc9c4e90e166a4a6c20d4c195 | |
| parent | 7e42a780161e757ddd7d20925691a861f9d86725 (diff) | |
| download | rust-1077ff2deca4c80f27596905119a84564fe9813f.tar.gz rust-1077ff2deca4c80f27596905119a84564fe9813f.zip | |
Add basic specialization tests, including for default item
inheritance. Updates some of the coherence tests as well.
| -rw-r--r-- | src/test/auxiliary/go_trait.rs | 4 | ||||
| -rw-r--r-- | src/test/auxiliary/specialization_cross_crate.rs | 80 | ||||
| -rwxr-xr-x | src/test/auxiliary/specialization_cross_crate_defaults.rs | 49 | ||||
| -rw-r--r-- | src/test/compile-fail/coherence-no-direct-lifetime-dispatch.rs | 18 | ||||
| -rw-r--r-- | src/test/compile-fail/coherence-overlap-messages.rs | 24 | ||||
| -rw-r--r-- | src/test/compile-fail/specialization-negative-impl.rs | 23 | ||||
| -rw-r--r-- | src/test/compile-fail/specialization-overlap-negative.rs | 20 | ||||
| -rw-r--r-- | src/test/compile-fail/specialization-overlap.rs | 23 | ||||
| -rw-r--r-- | src/test/run-pass/specialization-allowed-cross-crate.rs | 29 | ||||
| -rw-r--r-- | src/test/run-pass/specialization-assoc-fns.rs | 33 | ||||
| -rw-r--r-- | src/test/run-pass/specialization-basics.rs | 104 | ||||
| -rw-r--r-- | src/test/run-pass/specialization-cross-crate-defaults.rs | 37 | ||||
| -rw-r--r-- | src/test/run-pass/specialization-cross-crate.rs | 56 | ||||
| -rw-r--r-- | src/test/run-pass/specialization-default-methods.rs | 66 | ||||
| -rw-r--r-- | src/test/run-pass/specialization-super-traits.rs | 23 |
15 files changed, 570 insertions, 19 deletions
diff --git a/src/test/auxiliary/go_trait.rs b/src/test/auxiliary/go_trait.rs index 0a921c8f5b3..ab1051c5650 100644 --- a/src/test/auxiliary/go_trait.rs +++ b/src/test/auxiliary/go_trait.rs @@ -37,7 +37,7 @@ pub fn go_once<G:GoOnce>(this: G, arg: isize) { impl<G> GoMut for G where G : Go { - fn go_mut(&mut self, arg: isize) { + default fn go_mut(&mut self, arg: isize) { go(&*self, arg) } } @@ -45,7 +45,7 @@ impl<G> GoMut for G impl<G> GoOnce for G where G : GoMut { - fn go_once(mut self, arg: isize) { + default fn go_once(mut self, arg: isize) { go_mut(&mut self, arg) } } diff --git a/src/test/auxiliary/specialization_cross_crate.rs b/src/test/auxiliary/specialization_cross_crate.rs new file mode 100644 index 00000000000..92c985a3e1d --- /dev/null +++ b/src/test/auxiliary/specialization_cross_crate.rs @@ -0,0 +1,80 @@ +// Copyright 2015 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. + +pub trait Foo { + fn foo(&self) -> &'static str; +} + +impl<T> Foo for T { + default fn foo(&self) -> &'static str { + "generic" + } +} + +impl<T: Clone> Foo for T { + default fn foo(&self) -> &'static str { + "generic Clone" + } +} + +impl<T, U> Foo for (T, U) where T: Clone, U: Clone { + default fn foo(&self) -> &'static str { + "generic pair" + } +} + +impl<T: Clone> Foo for (T, T) { + default fn foo(&self) -> &'static str { + "generic uniform pair" + } +} + +impl Foo for (u8, u32) { + default fn foo(&self) -> &'static str { + "(u8, u32)" + } +} + +impl Foo for (u8, u8) { + default fn foo(&self) -> &'static str { + "(u8, u8)" + } +} + +impl<T: Clone> Foo for Vec<T> { + default fn foo(&self) -> &'static str { + "generic Vec" + } +} + +impl Foo for Vec<i32> { + fn foo(&self) -> &'static str { + "Vec<i32>" + } +} + +impl Foo for String { + fn foo(&self) -> &'static str { + "String" + } +} + +impl Foo for i32 { + fn foo(&self) -> &'static str { + "i32" + } +} + +pub trait MyMarker {} +impl<T: Clone + MyMarker> Foo for T { + default fn foo(&self) -> &'static str { + "generic Clone + MyMarker" + } +} diff --git a/src/test/auxiliary/specialization_cross_crate_defaults.rs b/src/test/auxiliary/specialization_cross_crate_defaults.rs new file mode 100755 index 00000000000..b62d80b589f --- /dev/null +++ b/src/test/auxiliary/specialization_cross_crate_defaults.rs @@ -0,0 +1,49 @@ +// Copyright 2015 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(specialization)] + +// First, test only use of explicit `default` items: + +pub trait Foo { + fn foo(&self) -> bool; +} + +impl<T> Foo for T { + default fn foo(&self) -> bool { false } +} + +impl Foo for i32 {} + +impl Foo for i64 { + fn foo(&self) -> bool { true } +} + +// Next, test mixture of explicit `default` and provided methods: + +pub trait Bar { + fn bar(&self) -> i32 { 0 } +} + +impl<T> Bar for T {} // use the provided method + +impl Bar for i32 { + fn bar(&self) -> i32 { 1 } +} +impl<'a> Bar for &'a str {} + +impl<T> Bar for Vec<T> { + default fn bar(&self) -> i32 { 2 } +} +impl Bar for Vec<i32> {} +impl Bar for Vec<i64> { + fn bar(&self) -> i32 { 3 } +} diff --git a/src/test/compile-fail/coherence-no-direct-lifetime-dispatch.rs b/src/test/compile-fail/coherence-no-direct-lifetime-dispatch.rs new file mode 100644 index 00000000000..6de338f1db0 --- /dev/null +++ b/src/test/compile-fail/coherence-no-direct-lifetime-dispatch.rs @@ -0,0 +1,18 @@ +// Copyright 2015 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. + +// Test that you cannot *directly* dispatch on lifetime requirements + +trait MyTrait {} + +impl<T> MyTrait for T {} +impl<T: 'static> MyTrait for T {} //~ ERROR E0119 + +fn main() {} diff --git a/src/test/compile-fail/coherence-overlap-messages.rs b/src/test/compile-fail/coherence-overlap-messages.rs index 4f1092f960e..2a54ad88055 100644 --- a/src/test/compile-fail/coherence-overlap-messages.rs +++ b/src/test/compile-fail/coherence-overlap-messages.rs @@ -15,28 +15,18 @@ impl<U> Foo for U {} trait Bar {} -impl<T> Bar for T {} //~ ERROR conflicting implementations of trait `Bar` for type `u8`: -impl Bar for u8 {} +impl<T> Bar for (T, u8) {} //~ ERROR conflicting implementations of trait `Bar` for type `(u8, u8)`: +impl<T> Bar for (u8, T) {} trait Baz<T> {} -impl<T, U> Baz<U> for T {} //~ ERROR conflicting implementations of trait `Baz<_>` for type `u8`: +impl<T> Baz<u8> for T {} //~ ERROR conflicting implementations of trait `Baz<u8>` for type `u8`: impl<T> Baz<T> for u8 {} -trait Quux<T> {} +trait Quux<U, V> {} -impl<T, U> Quux<U> for T {} //~ ERROR conflicting implementations of trait `Quux<_>`: -impl<T> Quux<T> for T {} - -trait Qaar<T> {} - -impl<T, U> Qaar<U> for T {} //~ ERROR conflicting implementations of trait `Qaar<u8>`: -impl<T> Qaar<u8> for T {} - -trait Qaax<T> {} - -impl<T, U> Qaax<U> for T {} -//~^ ERROR conflicting implementations of trait `Qaax<u8>` for type `u32`: -impl Qaax<u8> for u32 {} +impl<T, U, V> Quux<U, V> for T {} //~ ERROR conflicting implementations of trait `Quux<_, _>`: +impl<T, U> Quux<U, U> for T {} +impl<T, V> Quux<T, V> for T {} fn main() {} diff --git a/src/test/compile-fail/specialization-negative-impl.rs b/src/test/compile-fail/specialization-negative-impl.rs new file mode 100644 index 00000000000..d0d698d12e0 --- /dev/null +++ b/src/test/compile-fail/specialization-negative-impl.rs @@ -0,0 +1,23 @@ +// Copyright 2015 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(optin_builtin_traits)] + +struct TestType<T>(T); + +unsafe impl<T> Send for TestType<T> {} +impl !Send for TestType<u8> {} + +fn assert_send<T: Send>() {} + +fn main() { + assert_send::<TestType<()>>(); + assert_send::<TestType<u8>>(); //~ ERROR +} diff --git a/src/test/compile-fail/specialization-overlap-negative.rs b/src/test/compile-fail/specialization-overlap-negative.rs new file mode 100644 index 00000000000..cc427b4fed2 --- /dev/null +++ b/src/test/compile-fail/specialization-overlap-negative.rs @@ -0,0 +1,20 @@ +// Copyright 2015 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(optin_builtin_traits)] + +trait MyTrait {} + +struct TestType<T>(::std::marker::PhantomData<T>); + +unsafe impl<T: Clone> Send for TestType<T> {} +impl<T: MyTrait> !Send for TestType<T> {} //~ ERROR E0119 + +fn main() {} diff --git a/src/test/compile-fail/specialization-overlap.rs b/src/test/compile-fail/specialization-overlap.rs new file mode 100644 index 00000000000..7d14e85fba8 --- /dev/null +++ b/src/test/compile-fail/specialization-overlap.rs @@ -0,0 +1,23 @@ +// Copyright 2015 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. + +trait Foo {} +impl<T: Clone> Foo for T {} +impl<T> Foo for Vec<T> {} //~ ERROR E0119 + +trait Bar {} +impl<T> Bar for (T, u8) {} +impl<T> Bar for (u8, T) {} //~ ERROR E0119 + +trait Baz<U> {} +impl<T> Baz<T> for u8 {} +impl<T> Baz<u8> for T {} //~ ERROR E0119 + +fn main() {} diff --git a/src/test/run-pass/specialization-allowed-cross-crate.rs b/src/test/run-pass/specialization-allowed-cross-crate.rs new file mode 100644 index 00000000000..139c63d3cdb --- /dev/null +++ b/src/test/run-pass/specialization-allowed-cross-crate.rs @@ -0,0 +1,29 @@ +// Copyright 2014 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. + +// aux-build:go_trait.rs + +extern crate go_trait; + +use go_trait::{Go,GoMut}; +use std::fmt::Debug; +use std::default::Default; + +struct MyThingy; + +impl Go for MyThingy { + fn go(&self, arg: isize) { } +} + +impl GoMut for MyThingy { + fn go_mut(&mut self, arg: isize) { } +} + +fn main() { } diff --git a/src/test/run-pass/specialization-assoc-fns.rs b/src/test/run-pass/specialization-assoc-fns.rs new file mode 100644 index 00000000000..750581ffe92 --- /dev/null +++ b/src/test/run-pass/specialization-assoc-fns.rs @@ -0,0 +1,33 @@ +// Copyright 2015 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. + +trait Foo { + fn mk() -> Self; +} + +impl<T: Default> Foo for T { + default fn mk() -> T { + T::default() + } +} + +impl Foo for Vec<u8> { + fn mk() -> Vec<u8> { + vec![0] + } +} + +fn main() { + let v1: Vec<i32> = Foo::mk(); + let v2: Vec<u8> = Foo::mk(); + + assert!(v1.len() == 0); + assert!(v2.len() == 1); +} diff --git a/src/test/run-pass/specialization-basics.rs b/src/test/run-pass/specialization-basics.rs new file mode 100644 index 00000000000..e585c8e2353 --- /dev/null +++ b/src/test/run-pass/specialization-basics.rs @@ -0,0 +1,104 @@ +// Copyright 2014 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. + +// Tests a variety of basic specialization scenarios and method +// dispatch for them. + +trait Foo { + fn foo(&self) -> &'static str; +} + +impl<T> Foo for T { + default fn foo(&self) -> &'static str { + "generic" + } +} + +impl<T: Clone> Foo for T { + default fn foo(&self) -> &'static str { + "generic Clone" + } +} + +impl<T, U> Foo for (T, U) where T: Clone, U: Clone { + default fn foo(&self) -> &'static str { + "generic pair" + } +} + +impl<T: Clone> Foo for (T, T) { + default fn foo(&self) -> &'static str { + "generic uniform pair" + } +} + +impl Foo for (u8, u32) { + default fn foo(&self) -> &'static str { + "(u8, u32)" + } +} + +impl Foo for (u8, u8) { + default fn foo(&self) -> &'static str { + "(u8, u8)" + } +} + +impl<T: Clone> Foo for Vec<T> { + default fn foo(&self) -> &'static str { + "generic Vec" + } +} + +impl Foo for Vec<i32> { + fn foo(&self) -> &'static str { + "Vec<i32>" + } +} + +impl Foo for String { + fn foo(&self) -> &'static str { + "String" + } +} + +impl Foo for i32 { + fn foo(&self) -> &'static str { + "i32" + } +} + +struct NotClone; + +trait MyMarker {} +impl<T: Clone + MyMarker> Foo for T { + default fn foo(&self) -> &'static str { + "generic Clone + MyMarker" + } +} + +#[derive(Clone)] +struct MarkedAndClone; +impl MyMarker for MarkedAndClone {} + +fn main() { + assert!(NotClone.foo() == "generic"); + assert!(0u8.foo() == "generic Clone"); + assert!(vec![NotClone].foo() == "generic"); + assert!(vec![0u8].foo() == "generic Vec"); + assert!(vec![0i32].foo() == "Vec<i32>"); + assert!(0i32.foo() == "i32"); + assert!(String::new().foo() == "String"); + assert!(((), 0).foo() == "generic pair"); + assert!(((), ()).foo() == "generic uniform pair"); + assert!((0u8, 0u32).foo() == "(u8, u32)"); + assert!((0u8, 0u8).foo() == "(u8, u8)"); + assert!(MarkedAndClone.foo() == "generic Clone + MyMarker"); +} diff --git a/src/test/run-pass/specialization-cross-crate-defaults.rs b/src/test/run-pass/specialization-cross-crate-defaults.rs new file mode 100644 index 00000000000..750c3cf8b3e --- /dev/null +++ b/src/test/run-pass/specialization-cross-crate-defaults.rs @@ -0,0 +1,37 @@ +// Copyright 2015 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. + +// aux-build:specialization_cross_crate_defaults.rs + +#![feature(specialization)] + +extern crate specialization_cross_crate_defaults; + +use specialization_cross_crate_defaults::*; + +fn test_foo() { + assert!(0i8.foo() == false); + assert!(0i32.foo() == false); + assert!(0i64.foo() == true); +} + +fn test_bar() { + assert!(0u8.bar() == 0); + assert!(0i32.bar() == 1); + assert!("hello".bar() == 0); + assert!(vec![()].bar() == 2); + assert!(vec![0i32].bar() == 2); + assert!(vec![0i64].bar() == 3); +} + +fn main() { + test_foo(); + test_bar(); +} diff --git a/src/test/run-pass/specialization-cross-crate.rs b/src/test/run-pass/specialization-cross-crate.rs new file mode 100644 index 00000000000..c74b1f2e49e --- /dev/null +++ b/src/test/run-pass/specialization-cross-crate.rs @@ -0,0 +1,56 @@ +// Copyright 2015 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. + +// aux-build:specialization_cross_crate.rs + +extern crate specialization_cross_crate; + +use specialization_cross_crate::*; + +struct NotClone; + +#[derive(Clone)] +struct MarkedAndClone; +impl MyMarker for MarkedAndClone {} + +struct MyType<T>(T); +impl<T> Foo for MyType<T> { + default fn foo(&self) -> &'static str { + "generic MyType" + } +} + +impl Foo for MyType<u8> { + fn foo(&self) -> &'static str { + "MyType<u8>" + } +} + +struct MyOtherType; +impl Foo for MyOtherType {} + +fn main() { + assert!(NotClone.foo() == "generic"); + assert!(0u8.foo() == "generic Clone"); + assert!(vec![NotClone].foo() == "generic"); + assert!(vec![0u8].foo() == "generic Vec"); + assert!(vec![0i32].foo() == "Vec<i32>"); + assert!(0i32.foo() == "i32"); + assert!(String::new().foo() == "String"); + assert!(((), 0).foo() == "generic pair"); + assert!(((), ()).foo() == "generic uniform pair"); + assert!((0u8, 0u32).foo() == "(u8, u32)"); + assert!((0u8, 0u8).foo() == "(u8, u8)"); + assert!(MarkedAndClone.foo() == "generic Clone + MyMarker"); + + assert!(MyType(()).foo() == "generic MyType"); + assert!(MyType(0u8).foo() == "MyType<u8>"); + assert!(MyOtherType.foo() == "generic"); +} diff --git a/src/test/run-pass/specialization-default-methods.rs b/src/test/run-pass/specialization-default-methods.rs new file mode 100644 index 00000000000..7482d3acbc1 --- /dev/null +++ b/src/test/run-pass/specialization-default-methods.rs @@ -0,0 +1,66 @@ +// Copyright 2015 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. + +// First, test only use of explicit `default` items: + +trait Foo { + fn foo(&self) -> bool; +} + +impl<T> Foo for T { + default fn foo(&self) -> bool { false } +} + +impl Foo for i32 {} + +impl Foo for i64 { + fn foo(&self) -> bool { true } +} + +fn test_foo() { + assert!(0i8.foo() == false); + assert!(0i32.foo() == false); + assert!(0i64.foo() == true); +} + +// Next, test mixture of explicit `default` and provided methods: + +trait Bar { + fn bar(&self) -> i32 { 0 } +} + +impl<T> Bar for T {} // use the provided method + +impl Bar for i32 { + fn bar(&self) -> i32 { 1 } +} +impl<'a> Bar for &'a str {} + +impl<T> Bar for Vec<T> { + default fn bar(&self) -> i32 { 2 } +} +impl Bar for Vec<i32> {} +impl Bar for Vec<i64> { + fn bar(&self) -> i32 { 3 } +} + +fn test_bar() { + assert!(0u8.bar() == 0); + assert!(0i32.bar() == 1); + assert!("hello".bar() == 0); + assert!(vec![()].bar() == 2); + assert!(vec![0i32].bar() == 2); + assert!(vec![0i64].bar() == 3); +} + +fn main() { + test_foo(); + test_bar(); +} diff --git a/src/test/run-pass/specialization-super-traits.rs b/src/test/run-pass/specialization-super-traits.rs new file mode 100644 index 00000000000..4a30e6bcd25 --- /dev/null +++ b/src/test/run-pass/specialization-super-traits.rs @@ -0,0 +1,23 @@ +// Copyright 2014 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. + +// Test that you can specialize via an explicit trait hierarchy + +// FIXME: this doesn't work yet... + +trait Parent {} +trait Child: Parent {} + +trait Foo {} + +impl<T: Parent> Foo for T {} +impl<T: Child> Foo for T {} + +fn main() {} |
