about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2011-10-06 21:33:04 -0700
committerBrian Anderson <banderson@mozilla.com>2011-10-12 14:26:47 -0700
commit046ca827dd02ca6e9b18264bfe5ffb8d30f77b47 (patch)
tree09e19a68135d2e4ff624d15df111de4a84ecf7e0 /src
parent29584cc5ac9369a18d1082d3d2c95eb0471a64db (diff)
downloadrust-046ca827dd02ca6e9b18264bfe5ffb8d30f77b47.tar.gz
rust-046ca827dd02ca6e9b18264bfe5ffb8d30f77b47.zip
Add unsafe blocks, unsafe functions, and two rudimentary tests
related to them
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/typeck.rs10
-rw-r--r--src/comp/syntax/parse/parser.rs3
-rw-r--r--src/lib/vec.rs4
-rw-r--r--src/test/compile-fail/unsafe-fn-called-from-safe.rs8
-rw-r--r--src/test/run-pass/unsafe-fn-called-from-unsafe-blk.rs11
5 files changed, 30 insertions, 6 deletions
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<T>(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();
+    }
+}