about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2013-09-05 20:50:10 -0700
committerAlex Crichton <alex@alexcrichton.com>2013-09-11 00:13:41 -0700
commit11e9c48353a6fcbfd036e5ee58b1d4b5f572d7eb (patch)
tree0fe567f92d372b3d756a9e935ca35a82fee514bb
parent19a6fabad8e43a81617182eba24fb80e33da8e52 (diff)
downloadrust-11e9c48353a6fcbfd036e5ee58b1d4b5f572d7eb.tar.gz
rust-11e9c48353a6fcbfd036e5ee58b1d4b5f572d7eb.zip
Flag unsafe blocks from format! as compiler-generated
-rw-r--r--src/librustc/middle/lint.rs5
-rw-r--r--src/libsyntax/ast.rs8
-rw-r--r--src/libsyntax/ext/ifmt.rs2
-rw-r--r--src/libsyntax/parse/parser.rs2
-rw-r--r--src/test/run-pass/ifmt.rs9
5 files changed, 21 insertions, 5 deletions
diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs
index a4b64f5a1d8..da181ff2eb6 100644
--- a/src/librustc/middle/lint.rs
+++ b/src/librustc/middle/lint.rs
@@ -1133,8 +1133,9 @@ impl Visitor<@mut Context> for UnusedUnsafeLintVisitor {
             match e.node {
                 // Don't warn about generated blocks, that'll just pollute the
                 // output.
-                ast::ExprBlock(ref blk) if blk.rules == ast::UnsafeBlock(false) => {
-                    if !cx.tcx.used_unsafe.contains(&blk.id) {
+                ast::ExprBlock(ref blk) => {
+                    if blk.rules == ast::UnsafeBlock(ast::UserProvided) &&
+                       !cx.tcx.used_unsafe.contains(&blk.id) {
                         cx.span_lint(unused_unsafe, blk.span,
                                      "unnecessary `unsafe` block");
                     }
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 63a6e936550..ef2e557b6ea 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -479,7 +479,13 @@ pub struct Field {
 #[deriving(Clone, Eq, Encodable, Decodable, IterBytes)]
 pub enum BlockCheckMode {
     DefaultBlock,
-    UnsafeBlock(/* generated internally */ bool),
+    UnsafeBlock(UnsafeSource),
+}
+
+#[deriving(Clone, Eq, Encodable, Decodable, IterBytes)]
+pub enum UnsafeSource {
+    CompilerGenerated,
+    UserProvided,
 }
 
 #[deriving(Clone, Eq, Encodable, Decodable,IterBytes)]
diff --git a/src/libsyntax/ext/ifmt.rs b/src/libsyntax/ext/ifmt.rs
index b7722ffc297..486069db4f0 100644
--- a/src/libsyntax/ext/ifmt.rs
+++ b/src/libsyntax/ext/ifmt.rs
@@ -632,7 +632,7 @@ impl Context {
            stmts: ~[],
            expr: Some(result),
            id: ast::DUMMY_NODE_ID,
-           rules: ast::UnsafeBlock,
+           rules: ast::UnsafeBlock(ast::CompilerGenerated),
            span: self.fmtsp,
         });
 
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index b0bcc91f962..b5772a9eede 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -1792,7 +1792,7 @@ impl Parser {
         } else if self.eat_keyword(keywords::Match) {
             return self.parse_match_expr();
         } else if self.eat_keyword(keywords::Unsafe) {
-            return self.parse_block_expr(lo, UnsafeBlock(false));
+            return self.parse_block_expr(lo, UnsafeBlock(ast::UserProvided));
         } else if *self.token == token::LBRACKET {
             self.bump();
             let mutbl = self.parse_mutability();
diff --git a/src/test/run-pass/ifmt.rs b/src/test/run-pass/ifmt.rs
index 3f0c7e07041..ab66bfc1011 100644
--- a/src/test/run-pass/ifmt.rs
+++ b/src/test/run-pass/ifmt.rs
@@ -10,6 +10,8 @@
 
 // xfail-fast: check-fast screws up repr paths
 
+#[deny(warnings)];
+
 use std::fmt;
 
 struct A;
@@ -226,6 +228,13 @@ pub fn main() {
     let a = ~3;
     format!("{:?}", a);
     format!("{:?}", a);
+
+    // make sure that format! doesn't cause spurious unused-unsafe warnings when
+    // it's inside of an outer unsafe block
+    unsafe {
+        let a: int = ::std::cast::transmute(3u);
+        format!("{}", a);
+    }
 }
 
 // Basic test to make sure that we can invoke the `write!` macro with an