Rollup merge of #144143 - Gelbpunkt:target-features-crt-static, r=RalfJung
Fix `-Ctarget-feature`s getting ignored after `crt-static`
The current behaviour introduced by commit a50a3b8e31 would discard any target features specified after `crt-static` (the only member of `RUSTC_SPECIFIC_FEATURES`). This is because it returned instead of continuing processing the next feature.
I wasn't entirely sure how the regression test should look like, but this one should do. If anyone has some suggestions, I'm happy to learn, it's my first test :)
I've confirmed that the test fails without the fix on `powerpc64le-unknown-linux-musl` and `x86_64-unknown-linux-gnu`.
cc ``@RalfJung``
This commit is contained in:
@@ -149,14 +149,14 @@ fn parse_rust_feature_flag<'a>(
|
|||||||
if let Some(base_feature) = feature.strip_prefix('+') {
|
if let Some(base_feature) = feature.strip_prefix('+') {
|
||||||
// Skip features that are not target features, but rustc features.
|
// Skip features that are not target features, but rustc features.
|
||||||
if RUSTC_SPECIFIC_FEATURES.contains(&base_feature) {
|
if RUSTC_SPECIFIC_FEATURES.contains(&base_feature) {
|
||||||
return;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
callback(base_feature, sess.target.implied_target_features(base_feature), true)
|
callback(base_feature, sess.target.implied_target_features(base_feature), true)
|
||||||
} else if let Some(base_feature) = feature.strip_prefix('-') {
|
} else if let Some(base_feature) = feature.strip_prefix('-') {
|
||||||
// Skip features that are not target features, but rustc features.
|
// Skip features that are not target features, but rustc features.
|
||||||
if RUSTC_SPECIFIC_FEATURES.contains(&base_feature) {
|
if RUSTC_SPECIFIC_FEATURES.contains(&base_feature) {
|
||||||
return;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If `f1` implies `f2`, then `!f2` implies `!f1` -- this is standard logical
|
// If `f1` implies `f2`, then `!f2` implies `!f1` -- this is standard logical
|
||||||
|
|||||||
24
tests/ui/cfg/crt-static-with-target-features-works.rs
Normal file
24
tests/ui/cfg/crt-static-with-target-features-works.rs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
// Test to ensure that specifying a value for crt-static in target features
|
||||||
|
// does not result in skipping the features following it.
|
||||||
|
// This is a regression test for #144143
|
||||||
|
|
||||||
|
//@ add-core-stubs
|
||||||
|
//@ needs-llvm-components: x86
|
||||||
|
//@ compile-flags: --target=x86_64-unknown-linux-gnu
|
||||||
|
//@ compile-flags: -Ctarget-feature=+crt-static,+avx2
|
||||||
|
|
||||||
|
#![crate_type = "rlib"]
|
||||||
|
#![feature(no_core, rustc_attrs, lang_items)]
|
||||||
|
#![no_core]
|
||||||
|
|
||||||
|
extern crate minicore;
|
||||||
|
use minicore::*;
|
||||||
|
|
||||||
|
#[rustc_builtin_macro]
|
||||||
|
macro_rules! compile_error {
|
||||||
|
() => {};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_feature = "avx2")]
|
||||||
|
compile_error!("+avx2");
|
||||||
|
//~^ ERROR: +avx2
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
error: +avx2
|
||||||
|
--> $DIR/crt-static-with-target-features-works.rs:23:1
|
||||||
|
|
|
||||||
|
LL | compile_error!("+avx2");
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
Reference in New Issue
Block a user