Skip to content

Commit

Permalink
Make TypeContents consider the type T to be reachable via *T poin…
Browse files Browse the repository at this point in the history
…ters

Fixes #9509
  • Loading branch information
nikomatsakis committed Nov 5, 2013
1 parent 3d1f3f4 commit 71acc54
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 12 deletions.
6 changes: 5 additions & 1 deletion src/librustc/middle/ty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2088,7 +2088,7 @@ pub fn type_contents(cx: ctxt, ty: t) -> TypeContents {
let result = match get(ty).sty {
// Scalar and unique types are sendable, freezable, and durable
ty_nil | ty_bot | ty_bool | ty_int(_) | ty_uint(_) | ty_float(_) |
ty_bare_fn(_) | ty_ptr(_) | ty::ty_char => {
ty_bare_fn(_) | ty::ty_char => {
TC::None
}

Expand All @@ -2108,6 +2108,10 @@ pub fn type_contents(cx: ctxt, ty: t) -> TypeContents {
object_contents(cx, store, mutbl, bounds)
}

ty_ptr(ref mt) => {
tc_ty(cx, mt.ty, cache).other_pointer(TC::None)
}

ty_rptr(r, ref mt) => {
tc_ty(cx, mt.ty, cache).other_pointer(
borrowed_contents(r, mt.mutbl))
Expand Down
19 changes: 8 additions & 11 deletions src/librustuv/uvio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -414,10 +414,10 @@ impl UvIoFactory {
/// callback in a situation where the task wil be immediately blocked
/// afterwards. The `FsCallback` yielded must be invoked to reschedule the task
/// (once the result of the operation is known).
fn uv_fs_helper<T>(loop_: &mut Loop,
retfn: extern "Rust" fn(&mut FsRequest) -> T,
cb: &fn(&mut FsRequest, &mut Loop, FsCallback))
-> Result<T, IoError> {
fn uv_fs_helper<T:Send>(loop_: &mut Loop,
retfn: extern "Rust" fn(&mut FsRequest) -> T,
cb: &fn(&mut FsRequest, &mut Loop, FsCallback))
-> Result<T, IoError> {
let result_cell = Cell::new_empty();
let result_cell_ptr: *Cell<Result<T, IoError>> = &result_cell;
do task::unkillable { // FIXME(#8674)
Expand Down Expand Up @@ -1025,14 +1025,12 @@ fn read_stream(mut watcher: StreamWatcher,
let result_cell = Cell::new_empty();
let result_cell_ptr: *Cell<Result<uint, IoError>> = &result_cell;

let buf_ptr: *&mut [u8] = &buf;
let uv_buf = slice_to_uv_buf(buf);
do scheduler.deschedule_running_task_and_then |_sched, task| {
let task_cell = Cell::new(task);
// XXX: We shouldn't reallocate these callbacks every
// call to read
let alloc: AllocCallback = |_| unsafe {
slice_to_uv_buf(*buf_ptr)
};
let alloc: AllocCallback = |_| uv_buf;
do watcher.read_start(alloc) |mut watcher, nread, _buf, status| {

// Stop reading so that no read callbacks are
Expand Down Expand Up @@ -1280,11 +1278,10 @@ impl RtioUdpSocket for UvUdpSocket {
do self.home_for_io_with_sched |self_, scheduler| {
let result_cell = Cell::new_empty();
let result_cell_ptr: *Cell<Result<(uint, SocketAddr), IoError>> = &result_cell;

let buf_ptr: *&mut [u8] = &buf;
let uv_buf = slice_to_uv_buf(buf);
do scheduler.deschedule_running_task_and_then |_, task| {
let task_cell = Cell::new(task);
let alloc: AllocCallback = |_| unsafe { slice_to_uv_buf(*buf_ptr) };
let alloc: AllocCallback = |_| uv_buf;
do self_.watcher.recv_start(alloc) |mut watcher, nread, _buf, addr, flags, status| {
let _ = flags; // /XXX add handling for partials?

Expand Down
56 changes: 56 additions & 0 deletions src/test/compile-fail/kindck-freeze.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 59 additions & 0 deletions src/test/compile-fail/kindck-send.rs
Original file line number Diff line number Diff line change
@@ -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() {
}

5 comments on commit 71acc54

@bors
Copy link
Contributor

@bors bors commented on 71acc54 Nov 6, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from pcwalton
at nikomatsakis@71acc54

@bors
Copy link
Contributor

@bors bors commented on 71acc54 Nov 6, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging nikomatsakis/rust/issue-10157-TypeContents-refactor = 71acc54 into auto

@bors
Copy link
Contributor

@bors bors commented on 71acc54 Nov 6, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nikomatsakis/rust/issue-10157-TypeContents-refactor = 71acc54 merged ok, testing candidate = fdc830d

@bors
Copy link
Contributor

@bors bors commented on 71acc54 Nov 6, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors
Copy link
Contributor

@bors bors commented on 71acc54 Nov 6, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding master to auto = fdc830d

Please sign in to comment.