diff options
| author | bors <bors@rust-lang.org> | 2014-12-13 03:07:17 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-12-13 03:07:17 +0000 |
| commit | 2d90b91b5d2d18cd433a9e6f1944b685f8b4bb04 (patch) | |
| tree | 4505a743df61f423226618ea002c87faccb9891b /src/test | |
| parent | 8c6692724242c93416e574a48c5ea51b2e95d461 (diff) | |
| parent | 124e1e18cc4f327730a978a7a8c1e7876bb63c6e (diff) | |
| download | rust-2d90b91b5d2d18cd433a9e6f1944b685f8b4bb04.tar.gz rust-2d90b91b5d2d18cd433a9e6f1944b685f8b4bb04.zip | |
auto merge of #19683 : nikomatsakis/rust/generalized-where-clauses, r=nrc
This patch does not itself enable generalized where clauses, but it lays the groundwork. Rather than storing a list of bounds per type parameter, the trait selection and other logic is now driven by a unified list of predicates. All predicate handling is now driven through a common interface. This also fixes a number of bugs where region predicates were being dropped on the floor. As a drive-by, this patch also fixes some bugs in the opt-out-copy feature flag. That said, this patch does not change the parser or AST in any way, so we still *generate* the list of predicates by walking a list of bounds (and we still *store* the bounds on the `TypeParameterDef` and so on). Those will get patched in a follow-up. The commits in this case are standalone; the first few are simple refactorings. r? @nick29581 cc @aturon
Diffstat (limited to 'src/test')
14 files changed, 70 insertions, 28 deletions
diff --git a/src/test/compile-fail/builtin-superkinds-self-type.rs b/src/test/compile-fail/builtin-superkinds-self-type.rs index 86d3d7e9cbc..4c7ff60fbdd 100644 --- a/src/test/compile-fail/builtin-superkinds-self-type.rs +++ b/src/test/compile-fail/builtin-superkinds-self-type.rs @@ -17,7 +17,6 @@ trait Foo : Sync+'static { impl <T: Sync> Foo for T { } //~^ ERROR the parameter type `T` may not live long enough -//~^^ ERROR the parameter type `T` may not live long enough fn main() { let (tx, rx) = channel(); diff --git a/src/test/compile-fail/builtin-superkinds-simple.rs b/src/test/compile-fail/builtin-superkinds-simple.rs index fda83c03a7d..2c689f6909b 100644 --- a/src/test/compile-fail/builtin-superkinds-simple.rs +++ b/src/test/compile-fail/builtin-superkinds-simple.rs @@ -14,6 +14,6 @@ trait Foo : Send { } impl <'a> Foo for &'a mut () { } -//~^ ERROR does not fulfill the required lifetime +//~^ ERROR declared lifetime bound not satisfied fn main() { } diff --git a/src/test/compile-fail/kindck-impl-type-params.rs b/src/test/compile-fail/kindck-impl-type-params.rs index a430fe72333..57ee4cf7cc3 100644 --- a/src/test/compile-fail/kindck-impl-type-params.rs +++ b/src/test/compile-fail/kindck-impl-type-params.rs @@ -34,6 +34,7 @@ fn g<T>(val: T) { fn foo<'a>() { let t: S<&'a int> = S; let a = &t as &Gettable<&'a int>; + //~^ ERROR declared lifetime bound not satisfied } fn foo2<'a>() { diff --git a/src/test/compile-fail/kindck-send-object1.rs b/src/test/compile-fail/kindck-send-object1.rs index a5519753643..35e928d417c 100644 --- a/src/test/compile-fail/kindck-send-object1.rs +++ b/src/test/compile-fail/kindck-send-object1.rs @@ -22,7 +22,7 @@ fn test51<'a>() { } fn test52<'a>() { assert_send::<&'a (Dummy+Send)>(); - //~^ ERROR does not fulfill the required lifetime + //~^ ERROR declared lifetime bound not satisfied } // ...unless they are properly bounded diff --git a/src/test/compile-fail/kindck-send-owned.rs b/src/test/compile-fail/kindck-send-owned.rs index 0eed05692b9..11148d2846c 100644 --- a/src/test/compile-fail/kindck-send-owned.rs +++ b/src/test/compile-fail/kindck-send-owned.rs @@ -19,7 +19,7 @@ fn test32() { assert_send::<Vec<int> >(); } // but not if they own a bad thing fn test40<'a>(_: &'a int) { - assert_send::<Box<&'a int>>(); //~ ERROR does not fulfill the required lifetime + assert_send::<Box<&'a int>>(); //~ ERROR declared lifetime bound not satisfied } fn main() { } diff --git a/src/test/compile-fail/kindck-send-region-pointers.rs b/src/test/compile-fail/kindck-send-region-pointers.rs index cc46d7f4de9..04172932cfe 100644 --- a/src/test/compile-fail/kindck-send-region-pointers.rs +++ b/src/test/compile-fail/kindck-send-region-pointers.rs @@ -22,13 +22,13 @@ fn test10() { assert_send::<&'static mut int>(); } // otherwise lifetime pointers are not ok fn test20<'a>(_: &'a int) { - assert_send::<&'a int>(); //~ ERROR does not fulfill the required lifetime + assert_send::<&'a int>(); //~ ERROR declared lifetime bound not satisfied } fn test21<'a>(_: &'a int) { - assert_send::<&'a str>(); //~ ERROR does not fulfill the required lifetime + assert_send::<&'a str>(); //~ ERROR declared lifetime bound not satisfied } fn test22<'a>(_: &'a int) { - assert_send::<&'a [int]>(); //~ ERROR does not fulfill the required lifetime + assert_send::<&'a [int]>(); //~ ERROR declared lifetime bound not satisfied } fn main() { } diff --git a/src/test/compile-fail/kindck-send-unsafe.rs b/src/test/compile-fail/kindck-send-unsafe.rs index a9bbfcfa262..33314149d1f 100644 --- a/src/test/compile-fail/kindck-send-unsafe.rs +++ b/src/test/compile-fail/kindck-send-unsafe.rs @@ -15,7 +15,7 @@ fn test70() { assert_send::<*mut int>(); } fn test71<'a>() { - assert_send::<*mut &'a int>(); //~ ERROR does not fulfill the required lifetime + assert_send::<*mut &'a int>(); //~ ERROR declared lifetime bound not satisfied } fn main() { diff --git a/src/test/compile-fail/opt-out-copy-bad.rs b/src/test/compile-fail/opt-out-copy-bad.rs new file mode 100644 index 00000000000..80f8a154d58 --- /dev/null +++ b/src/test/compile-fail/opt-out-copy-bad.rs @@ -0,0 +1,42 @@ +// 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. + +#![feature(opt_out_copy)] + +// Test that when using the `opt-out-copy` feature we still consider +// destructors to be non-movable + +struct CantCopyThis; + +impl Drop for CantCopyThis { + fn drop(&mut self) { } +} + +struct IWantToCopyThis { + but_i_cant: CantCopyThis, +} + +impl Copy for IWantToCopyThis {} +//~^ ERROR the trait `Copy` may not be implemented for this type + +enum CantCopyThisEither { + A, + B(::std::kinds::marker::NoCopy), +} + +enum IWantToCopyThisToo { + ButICant(CantCopyThisEither), +} + +impl Copy for IWantToCopyThisToo {} +//~^ ERROR the trait `Copy` may not be implemented for this type + +fn main() {} + diff --git a/src/test/compile-fail/recursion_limit.rs b/src/test/compile-fail/recursion_limit.rs index 17afb168a98..1da7f47677a 100644 --- a/src/test/compile-fail/recursion_limit.rs +++ b/src/test/compile-fail/recursion_limit.rs @@ -44,8 +44,8 @@ fn main() { is_send::<A>(); //~^ ERROR overflow evaluating //~^^ NOTE consider adding a `#![recursion_limit="20"]` attribute to your crate - //~^^^ NOTE must be implemented + //~^^^ NOTE required by `is_send` //~^^^^ ERROR overflow evaluating //~^^^^^ NOTE consider adding a `#![recursion_limit="20"]` attribute to your crate - //~^^^^^^ NOTE must be implemented + //~^^^^^^ NOTE required by `is_send` } diff --git a/src/test/compile-fail/region-object-lifetime-in-coercion.rs b/src/test/compile-fail/region-object-lifetime-in-coercion.rs index dfeba041092..b2b2d3337c4 100644 --- a/src/test/compile-fail/region-object-lifetime-in-coercion.rs +++ b/src/test/compile-fail/region-object-lifetime-in-coercion.rs @@ -15,12 +15,12 @@ trait Foo {} impl<'a> Foo for &'a [u8] {} fn a(v: &[u8]) -> Box<Foo + 'static> { - let x: Box<Foo + 'static> = box v; //~ ERROR does not outlive + let x: Box<Foo + 'static> = box v; //~ ERROR declared lifetime bound not satisfied x } fn b(v: &[u8]) -> Box<Foo + 'static> { - box v //~ ERROR does not outlive + box v //~ ERROR declared lifetime bound not satisfied } fn c(v: &[u8]) -> Box<Foo> { @@ -28,7 +28,7 @@ fn c(v: &[u8]) -> Box<Foo> { } fn d<'a,'b>(v: &'a [u8]) -> Box<Foo+'b> { - box v //~ ERROR does not outlive + box v //~ ERROR declared lifetime bound not satisfied } fn e<'a:'b,'b>(v: &'a [u8]) -> Box<Foo+'b> { diff --git a/src/test/compile-fail/regions-bounded-by-send.rs b/src/test/compile-fail/regions-bounded-by-send.rs index 660a9be4f63..ec679a7dda1 100644 --- a/src/test/compile-fail/regions-bounded-by-send.rs +++ b/src/test/compile-fail/regions-bounded-by-send.rs @@ -29,15 +29,15 @@ fn static_lifime_ok<'a,T,U:Send>(_: &'a int) { // otherwise lifetime pointers are not ok fn param_not_ok<'a>(x: &'a int) { - assert_send::<&'a int>(); //~ ERROR does not fulfill + assert_send::<&'a int>(); //~ ERROR declared lifetime bound not satisfied } fn param_not_ok1<'a>(_: &'a int) { - assert_send::<&'a str>(); //~ ERROR does not fulfill + assert_send::<&'a str>(); //~ ERROR declared lifetime bound not satisfied } fn param_not_ok2<'a>(_: &'a int) { - assert_send::<&'a [int]>(); //~ ERROR does not fulfill + assert_send::<&'a [int]>(); //~ ERROR declared lifetime bound not satisfied } // boxes are ok @@ -51,7 +51,7 @@ fn box_ok() { // but not if they own a bad thing fn box_with_region_not_ok<'a>() { - assert_send::<Box<&'a int>>(); //~ ERROR does not fulfill + assert_send::<Box<&'a int>>(); //~ ERROR declared lifetime bound not satisfied } // objects with insufficient bounds no ok @@ -63,7 +63,7 @@ fn object_with_random_bound_not_ok<'a>() { fn object_with_send_bound_not_ok<'a>() { assert_send::<&'a (Dummy+Send)>(); - //~^ ERROR does not fulfill + //~^ ERROR declared lifetime bound not satisfied } fn proc_with_lifetime_not_ok<'a>() { @@ -84,11 +84,11 @@ fn unsafe_ok1<'a>(_: &'a int) { } fn unsafe_ok2<'a>(_: &'a int) { - assert_send::<*const &'a int>(); //~ ERROR does not fulfill + assert_send::<*const &'a int>(); //~ ERROR declared lifetime bound not satisfied } fn unsafe_ok3<'a>(_: &'a int) { - assert_send::<*mut &'a int>(); //~ ERROR does not fulfill + assert_send::<*mut &'a int>(); //~ ERROR declared lifetime bound not satisfied } fn main() { diff --git a/src/test/compile-fail/regions-bounded-by-trait-requiring-static.rs b/src/test/compile-fail/regions-bounded-by-trait-requiring-static.rs index 04a94b75215..e3939a4e390 100644 --- a/src/test/compile-fail/regions-bounded-by-trait-requiring-static.rs +++ b/src/test/compile-fail/regions-bounded-by-trait-requiring-static.rs @@ -29,15 +29,15 @@ fn static_lifime_ok<'a,T,U:Send>(_: &'a int) { // otherwise lifetime pointers are not ok fn param_not_ok<'a>(x: &'a int) { - assert_send::<&'a int>(); //~ ERROR does not fulfill + assert_send::<&'a int>(); //~ ERROR declared lifetime bound not satisfied } fn param_not_ok1<'a>(_: &'a int) { - assert_send::<&'a str>(); //~ ERROR does not fulfill + assert_send::<&'a str>(); //~ ERROR declared lifetime bound not satisfied } fn param_not_ok2<'a>(_: &'a int) { - assert_send::<&'a [int]>(); //~ ERROR does not fulfill + assert_send::<&'a [int]>(); //~ ERROR declared lifetime bound not satisfied } // boxes are ok @@ -51,7 +51,7 @@ fn box_ok() { // but not if they own a bad thing fn box_with_region_not_ok<'a>() { - assert_send::<Box<&'a int>>(); //~ ERROR does not fulfill + assert_send::<Box<&'a int>>(); //~ ERROR declared lifetime bound not satisfied } // unsafe pointers are ok unless they point at unsendable things @@ -62,11 +62,11 @@ fn unsafe_ok1<'a>(_: &'a int) { } fn unsafe_ok2<'a>(_: &'a int) { - assert_send::<*const &'a int>(); //~ ERROR does not fulfill + assert_send::<*const &'a int>(); //~ ERROR declared lifetime bound not satisfied } fn unsafe_ok3<'a>(_: &'a int) { - assert_send::<*mut &'a int>(); //~ ERROR does not fulfill + assert_send::<*mut &'a int>(); //~ ERROR declared lifetime bound not satisfied } fn main() { diff --git a/src/test/compile-fail/regions-bounded-method-type-parameters.rs b/src/test/compile-fail/regions-bounded-method-type-parameters.rs index 279139d8de9..10484925980 100644 --- a/src/test/compile-fail/regions-bounded-method-type-parameters.rs +++ b/src/test/compile-fail/regions-bounded-method-type-parameters.rs @@ -20,7 +20,7 @@ impl Foo { fn caller<'a>(x: &int) { Foo.some_method::<&'a int>(); - //~^ ERROR does not fulfill the required lifetime + //~^ ERROR declared lifetime bound not satisfied } fn main() { } diff --git a/src/test/compile-fail/regions-proc-bounds.rs b/src/test/compile-fail/regions-proc-bounds.rs index db71bc4e15c..4c95e1eac6d 100644 --- a/src/test/compile-fail/regions-proc-bounds.rs +++ b/src/test/compile-fail/regions-proc-bounds.rs @@ -12,7 +12,7 @@ fn is_static<T: 'static>() {} fn foo<'a>() { is_static::<proc():'a>(); - //~^ ERROR does not fulfill the required lifetime + //~^ ERROR declared lifetime bound not satisfied is_static::<proc():'static>(); } |
