diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 411a8ed213f..838b1f674fb 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 25344a8b2cf..75b72acba3f 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 bf21e056f6c..b2d19d9ed54 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 00000000000..62fcfa689d9 --- /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 00000000000..39cdd19a794 --- /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(); + } +}