Move unsafety out of the subtyping relation and into coercion.

This commit is contained in:
Niko Matsakis 2015-03-17 15:22:11 -04:00
parent 1b0f0ad280
commit 0947f4076d
19 changed files with 173 additions and 59 deletions

View file

@ -0,0 +1,21 @@
// Copyright 2013-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.
// Check that safe fns are not a subtype of unsafe fns.
fn foo(x: Option<fn(i32)>) -> Option<unsafe fn(i32)> {
x //~ ERROR mismatched types
}
fn bar(x: fn(i32)) -> unsafe fn(i32) {
x // OK, coercion!
}
fn main() { }

View file

@ -0,0 +1,22 @@
// Copyright 2013-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.
// Check that safe fns are not a subtype of unsafe fns.
trait Foo {
unsafe fn len(&self) -> u32;
}
impl Foo for u32 {
fn len(&self) -> u32 { *self }
//~^ ERROR incompatible type for trait: expected unsafe fn, found normal fn
}
fn main() { }

View file

@ -30,9 +30,9 @@ fn main() {
//~| expected non-variadic fn
//~| found variadic function
let y: unsafe extern "C" fn(f: isize, x: u8, ...) = bar;
let y: extern "C" fn(f: isize, x: u8, ...) = bar;
//~^ ERROR: mismatched types
//~| expected `unsafe extern "C" fn(isize, u8, ...)`
//~| expected `extern "C" fn(isize, u8, ...)`
//~| found `extern "C" fn(isize, u8) {bar}`
//~| expected variadic fn
//~| found non-variadic function

View file

@ -0,0 +1,25 @@
// Copyright 2013-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.
// Check that safe fns are not a subtype of unsafe fns.
fn foo(x: i32) -> i32 {
x * 22
}
fn bar(x: fn(i32) -> i32) -> unsafe fn(i32) -> i32 {
x // OK, coercion!
}
fn main() {
let f = bar(foo);
let x = unsafe { f(2) };
assert_eq!(x, 44);
}