mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-10 22:13:27 +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();
|
let time_passes = sess.time_passes();
|
||||||
|
|
||||||
sess.building_library.set(session::building_library(sess.opts, &crate));
|
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", (), |_|
|
time(time_passes, "gated feature checking", (), |_|
|
||||||
front::feature_gate::check_crate(sess, &crate));
|
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] {
|
attrs: &[ast::Attribute]) -> ~[OutputStyle] {
|
||||||
// If we're generating a test executable, then ignore all other output
|
// If we're generating a test executable, then ignore all other output
|
||||||
// styles at all other locations
|
// styles at all other locations
|
||||||
if options.test {
|
if session.opts.test {
|
||||||
return ~[OutputExecutable];
|
return ~[OutputExecutable];
|
||||||
}
|
}
|
||||||
let mut base = options.outputs.clone();
|
let mut base = session.opts.outputs.clone();
|
||||||
let mut iter = attrs.iter().filter_map(|a| {
|
let mut iter = attrs.iter().filter_map(|a| {
|
||||||
if "crate_type" == a.name() {
|
if "crate_type" == a.name() {
|
||||||
match a.value_str() {
|
match a.value_str() {
|
||||||
@ -442,7 +442,16 @@ pub fn collect_outputs(options: &options,
|
|||||||
Some(n) if "lib" == n => Some(OutputDylib),
|
Some(n) if "lib" == n => Some(OutputDylib),
|
||||||
Some(n) if "staticlib" == n => Some(OutputStaticlib),
|
Some(n) if "staticlib" == n => Some(OutputStaticlib),
|
||||||
Some(n) if "bin" == n => Some(OutputExecutable),
|
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 {
|
} else {
|
||||||
None
|
None
|
||||||
|
@ -309,7 +309,7 @@ pub fn run_compiler(args: &[~str], demitter: @diagnostic::Emitter) {
|
|||||||
if crate_file_name {
|
if crate_file_name {
|
||||||
let lm = link::build_link_meta(sess, attrs, &t_outputs.obj_filename,
|
let lm = link::build_link_meta(sess, attrs, &t_outputs.obj_filename,
|
||||||
&mut ::util::sha2::Sha256::new());
|
&mut ::util::sha2::Sha256::new());
|
||||||
let outputs = session::collect_outputs(sopts, attrs);
|
let outputs = session::collect_outputs(&sess, attrs);
|
||||||
for &style in outputs.iter() {
|
for &style in outputs.iter() {
|
||||||
let fname = link::filename_for_input(&sess, style, &lm,
|
let fname = link::filename_for_input(&sess, style, &lm,
|
||||||
&t_outputs.out_filename);
|
&t_outputs.out_filename);
|
||||||
|
@ -80,6 +80,7 @@ pub enum lint {
|
|||||||
unsafe_block,
|
unsafe_block,
|
||||||
attribute_usage,
|
attribute_usage,
|
||||||
unknown_features,
|
unknown_features,
|
||||||
|
unknown_crate_type,
|
||||||
|
|
||||||
managed_heap_memory,
|
managed_heap_memory,
|
||||||
owned_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",
|
desc: "unknown features found in crate-level #[feature] directives",
|
||||||
default: deny,
|
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