mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-05 03:23:25 +00:00
auto merge of #11264 : am0d/rust/crate_type_lint, r=alexcrichton
This ensures that the `crate_type` attribute always contains a value, and does not contain an invalid value. Fixes #11256.
This commit is contained in:
commit
d3ae3a27c4
@ -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));
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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 crate-level #[feature] directives",
|
||||
default: deny,
|
||||
}),
|
||||
|
||||
("unknown_crate_type",
|
||||
LintSpec {
|
||||
lint: unknown_crate_type,
|
||||
desc: "unknown crate type found in #[crate_type] directive",
|
||||
default: deny,
|
||||
}),
|
||||
];
|
||||
|
||||
/*
|
||||
|
6
src/test/compile-fail/invalid-crate-type.rs
Normal file
6
src/test/compile-fail/invalid-crate-type.rs
Normal file
@ -0,0 +1,6 @@
|
||||
// regression test for issue 11256
|
||||
#[crate_type="foo"]; //~ ERROR invalid `crate_type` value
|
||||
|
||||
fn main() {
|
||||
return
|
||||
}
|
6
src/test/compile-fail/no_crate_type.rs
Normal file
6
src/test/compile-fail/no_crate_type.rs
Normal file
@ -0,0 +1,6 @@
|
||||
// regresion test for issue 11256
|
||||
#[crate_type]; //~ ERROR `crate_type` requires a value
|
||||
|
||||
fn main() {
|
||||
return
|
||||
}
|
Loading…
Reference in New Issue
Block a user