about summary refs log tree commit diff
diff options
context:
space:
mode:
authora_m0d <damien.schoof@gmail.com>2014-01-01 16:26:07 -0500
committera_m0d <damien.schoof@gmail.com>2014-01-01 19:55:59 -0500
commit8965e347891eb4decda473cd413e39c806baacad (patch)
treebafa342db0d3c2bb5c69290b71c5ee1bc98a46bb
parentc34ef5d7e4f44f8e65600a2c3866f5861c401ea1 (diff)
downloadrust-8965e347891eb4decda473cd413e39c806baacad.tar.gz
rust-8965e347891eb4decda473cd413e39c806baacad.zip
Add linting for `crate_type` attribute values.
This ensures that the `crate_type` attribute always contains a value,
and does not contain an invalid value.
-rw-r--r--src/librustc/driver/driver.rs2
-rw-r--r--src/librustc/driver/session.rs17
-rw-r--r--src/librustc/lib.rs2
-rw-r--r--src/librustc/middle/lint.rs8
-rw-r--r--src/test/compile-fail/invalid-crate-type.rs6
-rw-r--r--src/test/compile-fail/no_crate_type.rs6
6 files changed, 35 insertions, 6 deletions
diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs
index c4a3e21cbad..9269893c062 100644
--- a/src/librustc/driver/driver.rs
+++ b/src/librustc/driver/driver.rs
@@ -167,7 +167,7 @@ pub fn phase_2_configure_and_expand(sess: Session,
     let time_passes = sess.time_passes();
 
     sess.building_library.set(session::building_library(sess.opts, &crate));
-    sess.outputs.set(session::collect_outputs(sess.opts, crate.attrs));
+    sess.outputs.set(session::collect_outputs(&sess, crate.attrs));
 
     time(time_passes, "gated feature checking", (), |_|
          front::feature_gate::check_crate(sess, &crate));
diff --git a/src/librustc/driver/session.rs b/src/librustc/driver/session.rs
index 3f9274bc901..b3f093f7677 100644
--- a/src/librustc/driver/session.rs
+++ b/src/librustc/driver/session.rs
@@ -426,14 +426,14 @@ pub fn building_library(options: &options, crate: &ast::Crate) -> bool {
     }
 }
 
-pub fn collect_outputs(options: &options,
+pub fn collect_outputs(session: &Session,
                        attrs: &[ast::Attribute]) -> ~[OutputStyle] {
     // If we're generating a test executable, then ignore all other output
     // styles at all other locations
-    if options.test {
+    if session.opts.test {
         return ~[OutputExecutable];
     }
-    let mut base = options.outputs.clone();
+    let mut base = session.opts.outputs.clone();
     let mut iter = attrs.iter().filter_map(|a| {
         if "crate_type" == a.name() {
             match a.value_str() {
@@ -442,7 +442,16 @@ pub fn collect_outputs(options: &options,
                 Some(n) if "lib" == n => Some(OutputDylib),
                 Some(n) if "staticlib" == n => Some(OutputStaticlib),
                 Some(n) if "bin" == n => Some(OutputExecutable),
-                _ => None
+                Some(_) => {
+                    session.add_lint(lint::unknown_crate_type, ast::CRATE_NODE_ID,
+                                     a.span, ~"invalid `crate_type` value");
+                    None
+                }
+                _ => {
+                    session.add_lint(lint::unknown_crate_type, ast::CRATE_NODE_ID,
+                                    a.span, ~"`crate_type` requires a value");
+                    None
+                }
             }
         } else {
             None
diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs
index e6afdf7fe14..6b5e5140e49 100644
--- a/src/librustc/lib.rs
+++ b/src/librustc/lib.rs
@@ -309,7 +309,7 @@ pub fn run_compiler(args: &[~str], demitter: @diagnostic::Emitter) {
         if crate_file_name {
             let lm = link::build_link_meta(sess, attrs, &t_outputs.obj_filename,
                                            &mut ::util::sha2::Sha256::new());
-            let outputs = session::collect_outputs(sopts, attrs);
+            let outputs = session::collect_outputs(&sess, attrs);
             for &style in outputs.iter() {
                 let fname = link::filename_for_input(&sess, style, &lm,
                                                      &t_outputs.out_filename);
diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs
index d94bfe1447e..35791337910 100644
--- a/src/librustc/middle/lint.rs
+++ b/src/librustc/middle/lint.rs
@@ -80,6 +80,7 @@ pub enum lint {
     unsafe_block,
     attribute_usage,
     unknown_features,
+    unknown_crate_type,
 
     managed_heap_memory,
     owned_heap_memory,
@@ -335,6 +336,13 @@ static lint_table: &'static [(&'static str, LintSpec)] = &[
         desc: "unknown features found in create-level #[feature] directives",
         default: deny,
     }),
+
+     ("unknown_crate_type",
+     LintSpec {
+         lint: unknown_crate_type,
+         desc: "unknown crate type found in #[crate_type] directive",
+         default: deny,
+     }),
 ];
 
 /*
diff --git a/src/test/compile-fail/invalid-crate-type.rs b/src/test/compile-fail/invalid-crate-type.rs
new file mode 100644
index 00000000000..2a80760cd1b
--- /dev/null
+++ b/src/test/compile-fail/invalid-crate-type.rs
@@ -0,0 +1,6 @@
+// regression test for issue 11256
+#[crate_type="foo"];    //~ ERROR invalid `crate_type` value
+
+fn main() {
+    return
+}
diff --git a/src/test/compile-fail/no_crate_type.rs b/src/test/compile-fail/no_crate_type.rs
new file mode 100644
index 00000000000..9ba006e8c44
--- /dev/null
+++ b/src/test/compile-fail/no_crate_type.rs
@@ -0,0 +1,6 @@
+// regresion test for issue 11256
+#[crate_type];  //~ ERROR `crate_type` requires a value
+
+fn main() {
+    return
+}