Skip to content

Commit 8965e34

Browse files
committed
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.
1 parent c34ef5d commit 8965e34

File tree

6 files changed

+35
-6
lines changed

6 files changed

+35
-6
lines changed

src/librustc/driver/driver.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ pub fn phase_2_configure_and_expand(sess: Session,
167167
let time_passes = sess.time_passes();
168168

169169
sess.building_library.set(session::building_library(sess.opts, &crate));
170-
sess.outputs.set(session::collect_outputs(sess.opts, crate.attrs));
170+
sess.outputs.set(session::collect_outputs(&sess, crate.attrs));
171171

172172
time(time_passes, "gated feature checking", (), |_|
173173
front::feature_gate::check_crate(sess, &crate));

src/librustc/driver/session.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -426,14 +426,14 @@ pub fn building_library(options: &options, crate: &ast::Crate) -> bool {
426426
}
427427
}
428428

429-
pub fn collect_outputs(options: &options,
429+
pub fn collect_outputs(session: &Session,
430430
attrs: &[ast::Attribute]) -> ~[OutputStyle] {
431431
// If we're generating a test executable, then ignore all other output
432432
// styles at all other locations
433-
if options.test {
433+
if session.opts.test {
434434
return ~[OutputExecutable];
435435
}
436-
let mut base = options.outputs.clone();
436+
let mut base = session.opts.outputs.clone();
437437
let mut iter = attrs.iter().filter_map(|a| {
438438
if "crate_type" == a.name() {
439439
match a.value_str() {
@@ -442,7 +442,16 @@ pub fn collect_outputs(options: &options,
442442
Some(n) if "lib" == n => Some(OutputDylib),
443443
Some(n) if "staticlib" == n => Some(OutputStaticlib),
444444
Some(n) if "bin" == n => Some(OutputExecutable),
445-
_ => None
445+
Some(_) => {
446+
session.add_lint(lint::unknown_crate_type, ast::CRATE_NODE_ID,
447+
a.span, ~"invalid `crate_type` value");
448+
None
449+
}
450+
_ => {
451+
session.add_lint(lint::unknown_crate_type, ast::CRATE_NODE_ID,
452+
a.span, ~"`crate_type` requires a value");
453+
None
454+
}
446455
}
447456
} else {
448457
None

src/librustc/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ pub fn run_compiler(args: &[~str], demitter: @diagnostic::Emitter) {
309309
if crate_file_name {
310310
let lm = link::build_link_meta(sess, attrs, &t_outputs.obj_filename,
311311
&mut ::util::sha2::Sha256::new());
312-
let outputs = session::collect_outputs(sopts, attrs);
312+
let outputs = session::collect_outputs(&sess, attrs);
313313
for &style in outputs.iter() {
314314
let fname = link::filename_for_input(&sess, style, &lm,
315315
&t_outputs.out_filename);

src/librustc/middle/lint.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ pub enum lint {
8080
unsafe_block,
8181
attribute_usage,
8282
unknown_features,
83+
unknown_crate_type,
8384

8485
managed_heap_memory,
8586
owned_heap_memory,
@@ -335,6 +336,13 @@ static lint_table: &'static [(&'static str, LintSpec)] = &[
335336
desc: "unknown features found in create-level #[feature] directives",
336337
default: deny,
337338
}),
339+
340+
("unknown_crate_type",
341+
LintSpec {
342+
lint: unknown_crate_type,
343+
desc: "unknown crate type found in #[crate_type] directive",
344+
default: deny,
345+
}),
338346
];
339347

340348
/*
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// regression test for issue 11256
2+
#[crate_type="foo"]; //~ ERROR invalid `crate_type` value
3+
4+
fn main() {
5+
return
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// regresion test for issue 11256
2+
#[crate_type]; //~ ERROR `crate_type` requires a value
3+
4+
fn main() {
5+
return
6+
}

0 commit comments

Comments
 (0)