auto merge of #10289 : nikomatsakis/rust/issue-10157-TypeContents-refactor, r=pcwalton
See #10157. This compiles now. Fixes #10278.
This commit is contained in:
commit
fdc830df31
19 changed files with 405 additions and 281 deletions
56
src/test/compile-fail/kindck-freeze.rs
Normal file
56
src/test/compile-fail/kindck-freeze.rs
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
// Copyright 2012 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 which of the builtin types are considered freezeable.
|
||||
|
||||
fn assert_freeze<T:Freeze>() { }
|
||||
trait Dummy { }
|
||||
|
||||
fn test<'a,T,U:Freeze>(_: &'a int) {
|
||||
// lifetime pointers are ok...
|
||||
assert_freeze::<&'static int>();
|
||||
assert_freeze::<&'a int>();
|
||||
assert_freeze::<&'a str>();
|
||||
assert_freeze::<&'a [int]>();
|
||||
|
||||
// ...unless they are mutable
|
||||
assert_freeze::<&'static mut int>(); //~ ERROR does not fulfill `Freeze`
|
||||
assert_freeze::<&'a mut int>(); //~ ERROR does not fulfill `Freeze`
|
||||
|
||||
// ~ pointers are ok
|
||||
assert_freeze::<~int>();
|
||||
assert_freeze::<~str>();
|
||||
assert_freeze::<~[int]>();
|
||||
|
||||
// but not if they own a bad thing
|
||||
assert_freeze::<~&'a mut int>(); //~ ERROR does not fulfill `Freeze`
|
||||
|
||||
// careful with object types, who knows what they close over...
|
||||
assert_freeze::<&'a Dummy>(); //~ ERROR does not fulfill `Freeze`
|
||||
assert_freeze::<~Dummy>(); //~ ERROR does not fulfill `Freeze`
|
||||
|
||||
// ...unless they are properly bounded
|
||||
assert_freeze::<&'a Dummy:Freeze>();
|
||||
assert_freeze::<&'static Dummy:Freeze>();
|
||||
assert_freeze::<~Dummy:Freeze>();
|
||||
|
||||
// ...but even then the pointer overrides
|
||||
assert_freeze::<&'a mut Dummy:Freeze>(); //~ ERROR does not fulfill `Freeze`
|
||||
|
||||
// closures are like an `&mut` object
|
||||
assert_freeze::<&fn()>(); //~ ERROR does not fulfill `Freeze`
|
||||
|
||||
// unsafe ptrs are ok unless they point at unfreezeable things
|
||||
assert_freeze::<*int>();
|
||||
assert_freeze::<*&'a mut int>(); //~ ERROR does not fulfill `Freeze`
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
||||
59
src/test/compile-fail/kindck-send.rs
Normal file
59
src/test/compile-fail/kindck-send.rs
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
// Copyright 2012 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 which of the builtin types are considered sendable.
|
||||
|
||||
fn assert_send<T:Send>() { }
|
||||
trait Dummy { }
|
||||
|
||||
fn test<'a,T,U:Send>(_: &'a int) {
|
||||
// lifetime pointers with 'static lifetime are ok
|
||||
assert_send::<&'static int>();
|
||||
assert_send::<&'static str>();
|
||||
assert_send::<&'static [int]>();
|
||||
|
||||
// whether or not they are mutable
|
||||
assert_send::<&'static mut int>();
|
||||
|
||||
// otherwise lifetime pointers are not ok
|
||||
assert_send::<&'a int>(); //~ ERROR does not fulfill `Send`
|
||||
assert_send::<&'a str>(); //~ ERROR does not fulfill `Send`
|
||||
assert_send::<&'a [int]>(); //~ ERROR does not fulfill `Send`
|
||||
|
||||
// ~ pointers are ok
|
||||
assert_send::<~int>();
|
||||
assert_send::<~str>();
|
||||
assert_send::<~[int]>();
|
||||
|
||||
// but not if they own a bad thing
|
||||
assert_send::<~&'a int>(); //~ ERROR does not fulfill `Send`
|
||||
|
||||
// careful with object types, who knows what they close over...
|
||||
assert_send::<&'static Dummy>(); //~ ERROR does not fulfill `Send`
|
||||
assert_send::<&'a Dummy>(); //~ ERROR does not fulfill `Send`
|
||||
assert_send::<&'a Dummy:Send>(); //~ ERROR does not fulfill `Send`
|
||||
assert_send::<~Dummy:>(); //~ ERROR does not fulfill `Send`
|
||||
|
||||
// ...unless they are properly bounded
|
||||
assert_send::<&'static Dummy:Send>();
|
||||
assert_send::<~Dummy:Send>();
|
||||
|
||||
// but closure and object types can have lifetime bounds which make
|
||||
// them not ok (FIXME #5121)
|
||||
// assert_send::<~fn:'a()>(); // ERROR does not fulfill `Send`
|
||||
// assert_send::<~Dummy:'a>(); // ERROR does not fulfill `Send`
|
||||
|
||||
// unsafe ptrs are ok unless they point at unsendable things
|
||||
assert_send::<*int>();
|
||||
assert_send::<*&'a int>(); //~ ERROR does not fulfill `Send`
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
||||
12
src/test/compile-fail/mutable-enum-indirect.rs
Normal file
12
src/test/compile-fail/mutable-enum-indirect.rs
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
// Tests that an `&` pointer to something inherently mutable is itself
|
||||
// to be considered mutable.
|
||||
|
||||
#[no_freeze]
|
||||
enum Foo { A }
|
||||
|
||||
fn bar<T: Freeze>(_: T) {}
|
||||
|
||||
fn main() {
|
||||
let x = A;
|
||||
bar(&x); //~ ERROR type parameter with an incompatible type
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue