rust-lang/rust

rustc silently ignores invalid -C target-feature names

Opened this issue · 3 comments

Compiling a simple Hello, World program:

$ rustc -V
rustc 1.20.0 (f3d6973f4 2017-08-27)

# Note the trailing "zzzz"
$ RUSTFLAGS=-Ctarget-feature=+crt-staticzzzz cargo build -v
   Compiling rust-test v0.1.0 (rust-test)
     Running `rustc --crate-name rust_test src/main.rs --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=aafe1708c049ad76 -C extra-filename=-aafe1708c049ad76 --out-dir rust-test/target/debug/deps -L dependency=rust-test/target/debug/deps '-Ctarget-feature=+crt-staticzzzz'`
    Finished dev [unoptimized + debuginfo] target(s) in 0.25 secs

Should RUSTFLAGS=-Ctarget-feature=+crt-staticzzzz be silently accepted?

If I pass RUSTFLAGS=-Ctarget-feature=+batman, a warning is printed, as expected.

'+batman' is not a recognized feature for this target (ignoring feature)

Why is trailing misspelling silently allowed?

This is happening inside LLVM and plausibly should be filed with that project.

crt-static is not passed to LLVM (and shouldn't be). It seems as if rustc consumes not just crt-static but also other target features that have it as a prefix? This filtering looks suspicious:

let llvm_features = requested_features.filter(|f| {
!rustc_features.iter().any(|s| f.contains(s))
});

Also rustc: