diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs index c4a3e21cbad8b..9269893c062f5 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 3f9274bc901b5..b3f093f767769 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 e6afdf7fe1466..6b5e5140e49a3 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 d94bfe1447e01..35791337910d7 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 0000000000000..2a80760cd1b71 --- /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 0000000000000..9ba006e8c4448 --- /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 +}