about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Sullivan <sully@msully.net>2012-06-01 15:58:04 -0700
committerMichael Sullivan <sully@msully.net>2012-06-04 09:54:03 -0700
commit7213274e57ef779620e6d68939816c66201d7d36 (patch)
treebbbd652356885ef816aaad8584d6d7e3c7baeb46
parent9be94f66509677ed41431369d89260c7218956eb (diff)
downloadrust-7213274e57ef779620e6d68939816c66201d7d36.tar.gz
rust-7213274e57ef779620e6d68939816c66201d7d36.zip
Make how lint handles unknown warn directives configurable by lint (default to warn). Closes #2480.
-rw-r--r--src/rustc/driver/driver.rs6
-rw-r--r--src/rustc/middle/lint.rs30
2 files changed, 24 insertions, 12 deletions
diff --git a/src/rustc/driver/driver.rs b/src/rustc/driver/driver.rs
index 019c40abe5d..ebdccf59c53 100644
--- a/src/rustc/driver/driver.rs
+++ b/src/rustc/driver/driver.rs
@@ -406,8 +406,10 @@ fn build_session_options(match: getopts::match,
     let lint_dict = lint::get_lint_dict();
     let lint_opts = vec::map(lint_flags) {|flag|
         alt lint::lookup_lint(lint_dict, flag) {
-          none { early_error(demitter, #fmt("unknown warning: %s", flag)) }
-          some(x) { x }
+          (flag, none) {
+            early_error(demitter, #fmt("unknown warning: %s", flag))
+          }
+          (_, some(x)) { x }
         }
     };
 
diff --git a/src/rustc/middle/lint.rs b/src/rustc/middle/lint.rs
index 7d8953f2fd4..88444f9a0f1 100644
--- a/src/rustc/middle/lint.rs
+++ b/src/rustc/middle/lint.rs
@@ -37,6 +37,7 @@ enum lint {
     while_true,
     path_statement,
     old_vecs,
+    unrecognized_warning,
 }
 
 // This is pretty unfortunate. We really want some sort of "deriving Enum"
@@ -48,6 +49,7 @@ fn int_to_lint(i: int) -> lint {
       2 { while_true }
       3 { path_statement }
       4 { old_vecs }
+      5 { unrecognized_warning }
     }
 }
 
@@ -90,7 +92,12 @@ fn get_lint_dict() -> lint_dict {
         ("old_vecs",
          @{lint: old_vecs,
            desc: "old (deprecated) vectors and strings",
-           default: ignore})
+           default: ignore}),
+
+        ("unrecognized_warning",
+         @{lint: unrecognized_warning,
+           desc: "unrecognized warning attribute",
+           default: warn})
 
     ];
     hash_from_strs(v)
@@ -188,12 +195,13 @@ impl methods for ctxt {
                     alt meta.node {
                       ast::meta_word(lintname) {
                         alt lookup_lint(self.dict, lintname) {
-                          none {
-                            self.tcx.sess.span_err(
+                          (name, none) {
+                            self.span_lint(
+                                self.get_level(unrecognized_warning),
                                 meta.span,
-                                #fmt("unknown warning: '%s'", lintname));
+                                #fmt("unknown warning: '%s'", name));
                           }
-                          some((lint, new_level)) {
+                          (_, some((lint, new_level))) {
                             // we do multiple unneeded copies of the map
                             // if many attributes are set, but this shouldn't
                             // actually be a problem...
@@ -225,7 +233,7 @@ impl methods for ctxt {
 
 
 fn lookup_lint(dict: lint_dict, s: str)
-    -> option<(lint, level)> {
+    -> (str, option<(lint, level)>) {
     let s = str::replace(s, "-", "_");
     let (name, level) = if s.starts_with("no_") {
         (s.substr(3u, s.len() - 3u), ignore)
@@ -234,10 +242,11 @@ fn lookup_lint(dict: lint_dict, s: str)
     } else {
         (s, warn)
     };
-    alt dict.find(name) {
-      none { none }
-      some(spec) { some((spec.lint, level)) }
-    }
+    (name,
+     alt dict.find(name) {
+         none { none }
+         some(spec) { some((spec.lint, level)) }
+     })
 }
 
 fn check_item(i: @ast::item, &&cx: ctxt, v: visit::vt<ctxt>) {
@@ -249,6 +258,7 @@ fn check_item(i: @ast::item, &&cx: ctxt, v: visit::vt<ctxt>) {
               while_true { check_item_while_true(cx, level, i); }
               path_statement { check_item_path_statement(cx, level, i); }
               old_vecs { check_item_old_vecs(cx, level, i); }
+              unrecognized_warning { /* this is checked elsewhere */ }
             }
         }
         if !cx.is_default {