From 046ca827dd02ca6e9b18264bfe5ffb8d30f77b47 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Thu, 6 Oct 2011 21:33:04 -0700 Subject: [PATCH] Add unsafe blocks, unsafe functions, and two rudimentary tests related to them --- src/comp/middle/typeck.rs | 10 ++++++---- src/comp/syntax/parse/parser.rs | 3 ++- src/lib/vec.rs | 4 +++- src/test/compile-fail/unsafe-fn-called-from-safe.rs | 8 ++++++++ src/test/run-pass/unsafe-fn-called-from-unsafe-blk.rs | 11 +++++++++++ 5 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 src/test/compile-fail/unsafe-fn-called-from-safe.rs create mode 100644 src/test/run-pass/unsafe-fn-called-from-unsafe-blk.rs diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 411a8ed213f9..838b1f674fbf 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -1552,10 +1552,12 @@ fn require_pure_call(ccx: @crate_ctxt, caller_purity: ast::purity, ccx.tcx.sess.span_fatal (sp, "safe function calls function marked unsafe"); } - //some(ast::def_native_fn(_)) { - // ccx.tcx.sess.span_fatal - // (sp, "native functions can only be invoked from unsafe code"); - //} + /* Temporarily disable until unsafe blocks parse! + some(ast::def_native_fn(_)) { + ccx.tcx.sess.span_fatal + (sp, "native functions can only be invoked from unsafe code"); + } + */ _ { } } diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index 25344a8b2cff..75b72acba3f0 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -2165,7 +2165,8 @@ fn parse_item(p: parser, attrs: [ast::attribute]) -> option::t<@ast::item> { let proto = parse_fn_proto(p); ret some(parse_item_fn_or_iter(p, ast::pure_fn, proto, attrs, ast::il_normal)); - } else if eat_word(p, "unsafe") { + } else if is_word(p, "unsafe") && p.look_ahead(1u) != token::LBRACE { + p.bump(); expect_word(p, "fn"); ret some(parse_item_fn_or_iter(p, ast::unsafe_fn, ast::proto_fn, attrs, ast::il_normal)); diff --git a/src/lib/vec.rs b/src/lib/vec.rs index bf21e056f6c8..b2d19d9ed54e 100644 --- a/src/lib/vec.rs +++ b/src/lib/vec.rs @@ -15,7 +15,9 @@ native "rust" mod rustrt { /// Reserves space for `n` elements in the given vector. fn reserve<@T>(&v: [mutable? T], n: uint) { - rustrt::vec_reserve_shared(v, n); + //unsafe { + rustrt::vec_reserve_shared(v, n); + //} } pure fn len(v: [mutable? T]) -> uint { unchecked { rusti::vec_len(v) } } diff --git a/src/test/compile-fail/unsafe-fn-called-from-safe.rs b/src/test/compile-fail/unsafe-fn-called-from-safe.rs new file mode 100644 index 000000000000..62fcfa689d97 --- /dev/null +++ b/src/test/compile-fail/unsafe-fn-called-from-safe.rs @@ -0,0 +1,8 @@ +// -*- rust -*- +// error-pattern: safe function calls function marked unsafe + +unsafe fn f() { ret; } + +fn main() { + f(); +} diff --git a/src/test/run-pass/unsafe-fn-called-from-unsafe-blk.rs b/src/test/run-pass/unsafe-fn-called-from-unsafe-blk.rs new file mode 100644 index 000000000000..39cdd19a794a --- /dev/null +++ b/src/test/run-pass/unsafe-fn-called-from-unsafe-blk.rs @@ -0,0 +1,11 @@ +// -*- rust -*- +// +// See also: compile-fail/unsafe-fn-called-from-safe.rs + +unsafe fn f() { ret; } + +fn main() { + unsafe { + f(); + } +}