diff --git a/src/test/auxiliary/coherence_copy_like_lib.rs b/src/test/auxiliary/coherence_copy_like_lib.rs new file mode 100644 index 00000000000..a1e1b48c2c4 --- /dev/null +++ b/src/test/auxiliary/coherence_copy_like_lib.rs @@ -0,0 +1,22 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![crate_type = "rlib"] +#![feature(fundamental)] + +use std::marker::MarkerTrait; + +pub trait MyCopy : MarkerTrait { } +impl MyCopy for i32 { } + +pub struct MyStruct(T); + +#[fundamental] +pub struct MyFundamentalStruct(T); diff --git a/src/test/run-pass/coherence-cow-1.rs b/src/test/compile-fail/coherence-cow-1.rs similarity index 71% rename from src/test/run-pass/coherence-cow-1.rs rename to src/test/compile-fail/coherence-cow-1.rs index 31f6c9af020..530bbf57d91 100644 --- a/src/test/run-pass/coherence-cow-1.rs +++ b/src/test/compile-fail/coherence-cow-1.rs @@ -10,16 +10,19 @@ // aux-build:coherence_lib.rs -// Test that it's ok for T to appear first in the self-type, as long -// as it's covered somewhere. - // pretty-expanded FIXME #23616 +// Test that the `Pair` type reports an error if it contains type +// parameters, even when they are covered by local types. This test +// was originally intended to test the opposite, but the rules changed +// with RFC 1023 and this became illegal. + extern crate coherence_lib as lib; use lib::{Remote,Pair}; pub struct Cover(T); impl Remote for Pair> { } +//~^ ERROR E0210 fn main() { } diff --git a/src/test/run-pass/coherence-cow-2.rs b/src/test/compile-fail/coherence-cow-2.rs similarity index 67% rename from src/test/run-pass/coherence-cow-2.rs rename to src/test/compile-fail/coherence-cow-2.rs index ccda8440ea2..52abceab98b 100644 --- a/src/test/run-pass/coherence-cow-2.rs +++ b/src/test/compile-fail/coherence-cow-2.rs @@ -10,8 +10,10 @@ // aux-build:coherence_lib.rs -// Test that it's ok for T to appear second in the self-type, as long -// as it's covered somewhere. +// Test that the `Pair` type reports an error if it contains type +// parameters, even when they are covered by local types. This test +// was originally intended to test the opposite, but the rules changed +// with RFC 1023 and this became illegal. // pretty-expanded FIXME #23616 @@ -20,6 +22,6 @@ use lib::{Remote,Pair}; pub struct Cover(T); -impl Remote for Pair,T> { } +impl Remote for Pair,T> { } //~ ERROR E0210 fn main() { } diff --git a/src/test/compile-fail/coherence-cow-no-cover.rs b/src/test/compile-fail/coherence-cow-no-cover.rs index 475d7df1fdb..cd32e797ae9 100644 --- a/src/test/compile-fail/coherence-cow-no-cover.rs +++ b/src/test/compile-fail/coherence-cow-no-cover.rs @@ -10,7 +10,7 @@ // aux-build:coherence_lib.rs -// Test that it's not ok for U to appear uncovered +// Test that it's not ok for T to appear uncovered extern crate coherence_lib as lib; use lib::{Remote,Pair}; @@ -18,6 +18,6 @@ use lib::{Remote,Pair}; pub struct Cover(T); impl Remote for Pair,U> { } -//~^ ERROR type parameter `U` must be used as the type parameter for some local type +//~^ ERROR type parameter `T` must be used as the type parameter for some local type fn main() { } diff --git a/src/test/compile-fail/coherence-impls-copy.rs b/src/test/compile-fail/coherence-impls-copy.rs index 3034be177ca..b99b2e1205b 100644 --- a/src/test/compile-fail/coherence-impls-copy.rs +++ b/src/test/compile-fail/coherence-impls-copy.rs @@ -23,17 +23,24 @@ impl !Sync for NotSync {} impl Copy for TestE {} impl Copy for MyType {} + +impl Copy for &'static mut MyType {} +//~^ ERROR E0206 + impl Copy for (MyType, MyType) {} //~^ ERROR E0206 +//~| ERROR E0117 impl Copy for &'static NotSync {} //~^ ERROR E0206 impl Copy for [MyType] {} //~^ ERROR E0206 +//~| ERROR E0117 impl Copy for &'static [NotSync] {} //~^ ERROR E0206 +//~| ERROR E0117 fn main() { } diff --git a/src/test/compile-fail/coherence-impls-send.rs b/src/test/compile-fail/coherence-impls-send.rs index b05c1ff0f0b..f130a935351 100644 --- a/src/test/compile-fail/coherence-impls-send.rs +++ b/src/test/compile-fail/coherence-impls-send.rs @@ -24,17 +24,17 @@ impl !Sync for NotSync {} unsafe impl Send for TestE {} unsafe impl Send for MyType {} unsafe impl Send for (MyType, MyType) {} -//~^ ERROR E0321 +//~^ ERROR E0117 unsafe impl Send for &'static NotSync {} //~^ ERROR E0321 unsafe impl Send for [MyType] {} -//~^ ERROR E0321 +//~^ ERROR E0117 unsafe impl Send for &'static [NotSync] {} -//~^ ERROR E0321 -//~| ERROR conflicting implementations +//~^ ERROR E0117 +//~| ERROR E0119 fn main() { } diff --git a/src/test/compile-fail/coherence-impls-sized.rs b/src/test/compile-fail/coherence-impls-sized.rs index a9a3ebaffb7..2ac4bb0492b 100644 --- a/src/test/compile-fail/coherence-impls-sized.rs +++ b/src/test/compile-fail/coherence-impls-sized.rs @@ -22,12 +22,17 @@ struct NotSync; impl !Sync for NotSync {} impl Sized for TestE {} //~ ERROR E0322 + impl Sized for MyType {} //~ ERROR E0322 -impl Sized for (MyType, MyType) {} //~ ERROR E0322 + +impl Sized for (MyType, MyType) {} //~ ERROR E0117 + impl Sized for &'static NotSync {} //~ ERROR E0322 -impl Sized for [MyType] {} //~ ERROR E0322 + +impl Sized for [MyType] {} //~ ERROR E0117 //~^ ERROR E0277 -impl Sized for &'static [NotSync] {} //~ ERROR E0322 + +impl Sized for &'static [NotSync] {} //~ ERROR E0117 fn main() { } diff --git a/src/test/compile-fail/coherence-overlap-issue-23516.rs b/src/test/compile-fail/coherence-overlap-issue-23516.rs new file mode 100644 index 00000000000..d7f060a3bfe --- /dev/null +++ b/src/test/compile-fail/coherence-overlap-issue-23516.rs @@ -0,0 +1,19 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Tests that we consider `Box: !Sugar` to be ambiguous, even +// though we see no impl of `Sugar` for `Box`. Therefore, an overlap +// error is reported for the following pair of impls (#23516). + +pub trait Sugar { fn dummy(&self) { } } +pub trait Sweet { fn dummy(&self) { } } +impl Sweet for T { } //~ ERROR E0119 +impl Sweet for Box { } +fn main() { } diff --git a/src/test/run-pass/coherence-local-2.rs b/src/test/compile-fail/coherence-vec-local-2.rs similarity index 77% rename from src/test/run-pass/coherence-local-2.rs rename to src/test/compile-fail/coherence-vec-local-2.rs index 5fd3e8ca86e..5f0b56af2c2 100644 --- a/src/test/run-pass/coherence-local-2.rs +++ b/src/test/compile-fail/coherence-vec-local-2.rs @@ -8,6 +8,9 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// Test that a local, generic type appearing within a +// *non-fundamental* remote type like `Vec` is not considered local. + // aux-build:coherence_lib.rs // pretty-expanded FIXME #23616 @@ -17,6 +20,6 @@ use lib::Remote; struct Local(T); -impl Remote for Vec> { } +impl Remote for Vec> { } //~ ERROR E0210 fn main() { } diff --git a/src/test/run-pass/coherence-local-1.rs b/src/test/compile-fail/coherence-vec-local.rs similarity index 76% rename from src/test/run-pass/coherence-local-1.rs rename to src/test/compile-fail/coherence-vec-local.rs index 21faa30245d..c354caac2b5 100644 --- a/src/test/run-pass/coherence-local-1.rs +++ b/src/test/compile-fail/coherence-vec-local.rs @@ -8,6 +8,9 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// Test that a local type (with no type parameters) appearing within a +// *non-fundamental* remote type like `Vec` is not considered local. + // aux-build:coherence_lib.rs // pretty-expanded FIXME #23616 @@ -17,6 +20,6 @@ use lib::Remote; struct Local; -impl Remote for Vec { } +impl Remote for Vec { } //~ ERROR E0117 fn main() { } diff --git a/src/test/compile-fail/coherence_copy_like_err_fundamental_struct.rs b/src/test/compile-fail/coherence_copy_like_err_fundamental_struct.rs new file mode 100644 index 00000000000..f13175ce8e2 --- /dev/null +++ b/src/test/compile-fail/coherence_copy_like_err_fundamental_struct.rs @@ -0,0 +1,36 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we are able to introduce a negative constraint that +// `MyType: !MyTrait` along with other "fundamental" wrappers. + +// aux-build:coherence_copy_like_lib.rs + +#![feature(rustc_attrs)] +#![allow(dead_code)] + +extern crate coherence_copy_like_lib as lib; + +use std::marker::MarkerTrait; + +struct MyType { x: i32 } + +trait MyTrait : MarkerTrait { } +impl MyTrait for T { } + +// `MyFundamentalStruct` is declared fundamental, so we can test that +// +// MyFundamentalStruct: !MyTrait +// +// Huzzah. +impl MyTrait for lib::MyFundamentalStruct { } + +#[rustc_error] +fn main() { } //~ ERROR compilation successful diff --git a/src/test/compile-fail/coherence_copy_like_err_fundamental_struct_ref.rs b/src/test/compile-fail/coherence_copy_like_err_fundamental_struct_ref.rs new file mode 100644 index 00000000000..ae3d242af70 --- /dev/null +++ b/src/test/compile-fail/coherence_copy_like_err_fundamental_struct_ref.rs @@ -0,0 +1,36 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we are able to introduce a negative constraint that +// `MyType: !MyTrait` along with other "fundamental" wrappers. + +// aux-build:coherence_copy_like_lib.rs + +#![feature(rustc_attrs)] +#![allow(dead_code)] + +extern crate coherence_copy_like_lib as lib; + +use std::marker::MarkerTrait; + +struct MyType { x: i32 } + +trait MyTrait : MarkerTrait { } +impl MyTrait for T { } + +// `MyFundamentalStruct` is declared fundamental, so we can test that +// +// MyFundamentalStruct<&MyTrait>: !MyTrait +// +// Huzzah. +impl<'a> MyTrait for lib::MyFundamentalStruct<&'a MyType> { } + +#[rustc_error] +fn main() { } //~ ERROR compilation successful diff --git a/src/test/compile-fail/coherence_copy_like_err_fundamental_struct_tuple.rs b/src/test/compile-fail/coherence_copy_like_err_fundamental_struct_tuple.rs new file mode 100644 index 00000000000..c4e95e77235 --- /dev/null +++ b/src/test/compile-fail/coherence_copy_like_err_fundamental_struct_tuple.rs @@ -0,0 +1,32 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we are able to introduce a negative constraint that +// `MyType: !MyTrait` along with other "fundamental" wrappers. + +// aux-build:coherence_copy_like_lib.rs + +#![feature(rustc_attrs)] + +extern crate coherence_copy_like_lib as lib; + +use std::marker::MarkerTrait; + +struct MyType { x: i32 } + +trait MyTrait : MarkerTrait { } + +impl MyTrait for T { } //~ ERROR E0119 + +// Tuples are not fundamental. +impl MyTrait for lib::MyFundamentalStruct<(MyType,)> { } + +#[rustc_error] +fn main() { } diff --git a/src/test/compile-fail/coherence_copy_like_err_struct.rs b/src/test/compile-fail/coherence_copy_like_err_struct.rs new file mode 100644 index 00000000000..f768a475ee8 --- /dev/null +++ b/src/test/compile-fail/coherence_copy_like_err_struct.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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:coherence_copy_like_lib.rs + +// Test that we are able to introduce a negative constraint that +// `MyType: !MyTrait` along with other "fundamental" wrappers. + +extern crate coherence_copy_like_lib as lib; + +use std::marker::MarkerTrait; + +struct MyType { x: i32 } + +trait MyTrait : MarkerTrait { } +impl MyTrait for T { } //~ ERROR E0119 + +// `MyStruct` is not declared fundamental, therefore this would +// require that +// +// MyStruct: !MyTrait +// +// which we cannot approve. +impl MyTrait for lib::MyStruct { } + +fn main() { } diff --git a/src/test/compile-fail/coherence_copy_like_err_tuple.rs b/src/test/compile-fail/coherence_copy_like_err_tuple.rs new file mode 100644 index 00000000000..0c78fffd2df --- /dev/null +++ b/src/test/compile-fail/coherence_copy_like_err_tuple.rs @@ -0,0 +1,32 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we are able to introduce a negative constraint that +// `MyType: !MyTrait` along with other "fundamental" wrappers. + +// aux-build:coherence_copy_like_lib.rs + +extern crate coherence_copy_like_lib as lib; + +use std::marker::MarkerTrait; + +struct MyType { x: i32 } + +trait MyTrait : MarkerTrait { } +impl MyTrait for T { } //~ ERROR E0119 + +// Tuples are not fundamental, therefore this would require that +// +// (MyType,): !MyTrait +// +// which we cannot approve. +impl MyTrait for (MyType,) { } + +fn main() { } diff --git a/src/test/compile-fail/coherence_local.rs b/src/test/compile-fail/coherence_local.rs new file mode 100644 index 00000000000..551577b6b4e --- /dev/null +++ b/src/test/compile-fail/coherence_local.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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we are able to introduce a negative constraint that +// `MyType: !MyTrait` along with other "fundamental" wrappers. + +// aux-build:coherence_copy_like_lib.rs + +#![feature(rustc_attrs)] +#![allow(dead_code)] + +extern crate coherence_copy_like_lib as lib; + +struct MyType { x: i32 } + +// These are all legal because they are all fundamental types: + +impl lib::MyCopy for MyType { } +impl<'a> lib::MyCopy for &'a MyType { } +impl<'a> lib::MyCopy for &'a Box { } +impl lib::MyCopy for Box { } +impl lib::MyCopy for lib::MyFundamentalStruct { } +impl lib::MyCopy for lib::MyFundamentalStruct> { } + +#[rustc_error] +fn main() { } //~ ERROR compilation successful diff --git a/src/test/compile-fail/coherence_local_err_struct.rs b/src/test/compile-fail/coherence_local_err_struct.rs new file mode 100644 index 00000000000..01f4c1cd8a5 --- /dev/null +++ b/src/test/compile-fail/coherence_local_err_struct.rs @@ -0,0 +1,29 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we are able to introduce a negative constraint that +// `MyType: !MyTrait` along with other "fundamental" wrappers. + +// aux-build:coherence_copy_like_lib.rs + +#![feature(rustc_attrs)] +#![allow(dead_code)] + +extern crate coherence_copy_like_lib as lib; + +struct MyType { x: i32 } + +// These are all legal because they are all fundamental types: + +// MyStruct is not fundamental. +impl lib::MyCopy for lib::MyStruct { } //~ ERROR E0117 + +#[rustc_error] +fn main() { } diff --git a/src/test/compile-fail/coherence_local_err_tuple.rs b/src/test/compile-fail/coherence_local_err_tuple.rs new file mode 100644 index 00000000000..590f68cee59 --- /dev/null +++ b/src/test/compile-fail/coherence_local_err_tuple.rs @@ -0,0 +1,29 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we are able to introduce a negative constraint that +// `MyType: !MyTrait` along with other "fundamental" wrappers. + +// aux-build:coherence_copy_like_lib.rs + +#![feature(rustc_attrs)] +#![allow(dead_code)] + +extern crate coherence_copy_like_lib as lib; + +struct MyType { x: i32 } + +// These are all legal because they are all fundamental types: + +// Tuples are not fundamental, so this is not a local impl. +impl lib::MyCopy for (MyType,) { } //~ ERROR E0117 + +#[rustc_error] +fn main() { } diff --git a/src/test/compile-fail/coherence_local_ref.rs b/src/test/compile-fail/coherence_local_ref.rs new file mode 100644 index 00000000000..f6e1aab5976 --- /dev/null +++ b/src/test/compile-fail/coherence_local_ref.rs @@ -0,0 +1,27 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we are able to introduce a negative constraint that +// `MyType: !MyTrait` along with other "fundamental" wrappers. + +// aux-build:coherence_copy_like_lib.rs + +#![feature(rustc_attrs)] +#![allow(dead_code)] + +extern crate coherence_copy_like_lib as lib; + +struct MyType { x: i32 } + +// naturally, legal +impl lib::MyCopy for MyType { } + +#[rustc_error] +fn main() { } //~ ERROR compilation successful diff --git a/src/test/compile-fail/typeck-default-trait-impl-cross-crate-coherence.rs b/src/test/compile-fail/typeck-default-trait-impl-cross-crate-coherence.rs index 7d25c04882f..b1febae7680 100644 --- a/src/test/compile-fail/typeck-default-trait-impl-cross-crate-coherence.rs +++ b/src/test/compile-fail/typeck-default-trait-impl-cross-crate-coherence.rs @@ -20,15 +20,15 @@ extern crate typeck_default_trait_impl_cross_crate_coherence_lib as lib; use lib::DefaultedTrait; struct A; -impl DefaultedTrait for (A,) { } //~ ERROR E0321 +impl DefaultedTrait for (A,) { } //~ ERROR E0117 struct B; -impl !DefaultedTrait for (B,) { } //~ ERROR E0321 +impl !DefaultedTrait for (B,) { } //~ ERROR E0117 struct C; struct D(T); impl DefaultedTrait for Box { } //~ ERROR E0321 -impl DefaultedTrait for lib::Something { } //~ ERROR E0321 +impl DefaultedTrait for lib::Something { } //~ ERROR E0117 impl DefaultedTrait for D { } // OK fn main() { } diff --git a/src/test/run-pass/coherence_copy_like.rs b/src/test/run-pass/coherence_copy_like.rs new file mode 100644 index 00000000000..db9893613ad --- /dev/null +++ b/src/test/run-pass/coherence_copy_like.rs @@ -0,0 +1,29 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that we are able to introduce a negative constraint that +// `MyType: !MyTrait` along with other "fundamental" wrappers. + +// aux-build:coherence_copy_like_lib.rs + +extern crate coherence_copy_like_lib as lib; + +use std::marker::MarkerTrait; + +struct MyType { x: i32 } + +trait MyTrait : MarkerTrait { } +impl MyTrait for T { } +impl MyTrait for MyType { } +impl<'a> MyTrait for &'a MyType { } +impl MyTrait for Box { } +impl<'a> MyTrait for &'a Box { } + +fn main() { } diff --git a/src/test/run-pass/method-two-trait-defer-resolution-2.rs b/src/test/run-pass/method-two-trait-defer-resolution-2.rs index d87ed03e94e..2ceff22adb9 100644 --- a/src/test/run-pass/method-two-trait-defer-resolution-2.rs +++ b/src/test/run-pass/method-two-trait-defer-resolution-2.rs @@ -8,13 +8,16 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// Test that we pick which version of `Foo` to run based on whether -// the type we (ultimately) inferred for `x` is copyable or not. -// -// In this case, the two versions are both impls of same trait, and -// hence we we can resolve method even without knowing yet which -// version will run (note that the `push` occurs after the call to -// `foo()`). +// Test that when we write `x.foo()`, we do nothave to know the +// complete type of `x` in order to type-check the method call. In +// this case, we know that `x: Vec<_1>`, but we don't know what type +// `_1` is (because the call to `push` comes later). To pick between +// the impls, we would have to know `_1`, since we have to know +// whether `_1: MyCopy` or `_1 == Box`. However (and this is the +// point of the test), we don't have to pick between the two impls -- +// it is enough to know that `foo` comes from the `Foo` trait. We can +// translate the call as `Foo::foo(&x)` and let the specific impl get +// chosen later. // pretty-expanded FIXME #23616 @@ -25,25 +28,29 @@ trait Foo { fn foo(&self) -> isize; } -impl Foo for Vec { +trait MyCopy { fn foo(&self) { } } +impl MyCopy for i32 { } + +impl Foo for Vec { fn foo(&self) -> isize {1} } -impl Foo for Vec> { +impl Foo for Vec> { fn foo(&self) -> isize {2} } fn call_foo_copy() -> isize { let mut x = Vec::new(); let y = x.foo(); - x.push(0_usize); + x.push(0_i32); y } fn call_foo_other() -> isize { - let mut x: Vec> = Vec::new(); + let mut x: Vec<_> = Vec::new(); let y = x.foo(); - x.push(box 0); + let z: Box = box 0; + x.push(z); y } diff --git a/src/test/run-pass/traits-conditional-dispatch.rs b/src/test/run-pass/traits-conditional-dispatch.rs index 5edd3dfbc9e..0190b7b7b96 100644 --- a/src/test/run-pass/traits-conditional-dispatch.rs +++ b/src/test/run-pass/traits-conditional-dispatch.rs @@ -17,16 +17,24 @@ #![allow(unknown_features)] #![feature(box_syntax)] +use std::marker::MarkerTrait; + trait Get { fn get(&self) -> Self; } -impl Get for T { - fn get(&self) -> T { *self } +trait MyCopy : MarkerTrait { fn copy(&self) -> Self; } +impl MyCopy for u16 { fn copy(&self) -> Self { *self } } +impl MyCopy for u32 { fn copy(&self) -> Self { *self } } +impl MyCopy for i32 { fn copy(&self) -> Self { *self } } +impl MyCopy for Option { fn copy(&self) -> Self { *self } } + +impl Get for T { + fn get(&self) -> T { self.copy() } } -impl Get for Box { - fn get(&self) -> Box { box get_it(&**self) } +impl Get for Box { + fn get(&self) -> Box { box get_it(&**self) } } fn get_it(t: &T) -> T {