compiletest: add enable-by-default check-cfg

This commit is contained in:
Urgau 2024-04-07 00:33:37 +02:00
parent 517374150c
commit d4e26fbb53
42 changed files with 114 additions and 63 deletions

View File

@ -1028,12 +1028,31 @@ fn compare_source(&self, expected: &str, actual: &str) {
}
fn set_revision_flags(&self, cmd: &mut Command) {
// Normalize revisions to be lowercase and replace `-`s with `_`s.
// Otherwise the `--cfg` flag is not valid.
let normalize_revision = |revision: &str| revision.to_lowercase().replace("-", "_");
if let Some(revision) = self.revision {
// Normalize revisions to be lowercase and replace `-`s with `_`s.
// Otherwise the `--cfg` flag is not valid.
let normalized_revision = revision.to_lowercase().replace("-", "_");
let normalized_revision = normalize_revision(revision);
cmd.args(&["--cfg", &normalized_revision]);
}
if !self.props.no_auto_check_cfg {
let mut check_cfg = String::with_capacity(25);
// Generate `cfg(FALSE, REV1, ..., REVN)` (for all possible revisions)
//
// For compatibility reason we consider the `FALSE` cfg to be expected
// since it is extensively used in the testsuite.
check_cfg.push_str("cfg(FALSE");
for revision in &self.props.revisions {
check_cfg.push_str(",");
check_cfg.push_str(&normalize_revision(&revision));
}
check_cfg.push_str(")");
cmd.args(&["--check-cfg", &check_cfg]);
}
}
fn typecheck_source(&self, src: String) -> ProcRes {

View File

@ -1,7 +1,8 @@
// Check to see if we can get parameters from an @argsfile file
//
//@ check-pass
//@ compile-flags: --cfg cmdline_set @{{src-base}}/argfile/commandline-argfile.args
//@ compile-flags: --cfg cmdline_set --check-cfg=cfg(cmdline_set,unbroken)
//@ compile-flags: @{{src-base}}/argfile/commandline-argfile.args
#[cfg(not(cmdline_set))]
compile_error!("cmdline_set not set");
@ -9,5 +10,4 @@
#[cfg(not(unbroken))]
compile_error!("unbroken not set");
fn main() {
}
fn main() {}

View File

@ -1,7 +1,8 @@
// Check to see if we can get parameters from an @argsfile file
//
//@ build-pass
//@ compile-flags: --cfg cmdline_set @{{src-base}}/argfile/commandline-argfile.args
//@ compile-flags: --cfg cmdline_set --check-cfg=cfg(cmdline_set,unbroken)
//@ compile-flags: @{{src-base}}/argfile/commandline-argfile.args
#[cfg(not(cmdline_set))]
compile_error!("cmdline_set not set");
@ -9,5 +10,4 @@
#[cfg(not(unbroken))]
compile_error!("unbroken not set");
fn main() {
}
fn main() {}

View File

@ -1,5 +1,6 @@
//@ run-pass
//@ compile-flags: --cfg bar -D warnings
//@ compile-flags: --cfg bar --check-cfg=cfg(bar) -D warnings
#![cfg(bar)]
fn main() {}

View File

@ -1,5 +1,5 @@
//@ run-pass
//@ compile-flags: --cfg foo
//@ compile-flags: --cfg foo --check-cfg=cfg(foo)
// check that cfg correctly chooses between the macro impls (see also
// cfg-macros-notfoo.rs)

View File

@ -1,5 +1,7 @@
//@ check-fail
#![allow(unexpected_cfgs)] // invalid cfgs
#[cfg(any(foo, foo::bar))]
//~^ERROR `cfg` predicate key must be an identifier
fn foo1() {}

View File

@ -1,23 +1,23 @@
error: `cfg` predicate key must be an identifier
--> $DIR/cfg-path-error.rs:3:16
--> $DIR/cfg-path-error.rs:5:16
|
LL | #[cfg(any(foo, foo::bar))]
| ^^^^^^^^
error: `cfg` predicate key must be an identifier
--> $DIR/cfg-path-error.rs:7:11
--> $DIR/cfg-path-error.rs:9:11
|
LL | #[cfg(any(foo::bar, foo))]
| ^^^^^^^^
error: `cfg` predicate key must be an identifier
--> $DIR/cfg-path-error.rs:11:16
--> $DIR/cfg-path-error.rs:13:16
|
LL | #[cfg(all(foo, foo::bar))]
| ^^^^^^^^
error: `cfg` predicate key must be an identifier
--> $DIR/cfg-path-error.rs:15:11
--> $DIR/cfg-path-error.rs:17:11
|
LL | #[cfg(all(foo::bar, foo))]
| ^^^^^^^^

View File

@ -1,6 +1,8 @@
//@ run-pass
//@ compile-flags:--cfg set1 --cfg set2
#![allow(dead_code)]
#![allow(dead_code, unexpected_cfgs)]
use std::fmt::Debug;
struct NotDebugable;

View File

@ -1,8 +1,7 @@
//@ run-pass
//@ compile-flags: --cfg fooA --cfg fooB
//@ compile-flags: --cfg fooA --cfg fooB --check-cfg=cfg(fooA,fooB,fooC,bar)
// fooA AND !bar
#[cfg(all(fooA, not(bar)))]
fn foo1() -> isize { 1 }

View File

@ -1,4 +1,7 @@
#![feature(lint_reasons)]
pub mod inner {
#[expect(unexpected_cfgs)]
pub fn i_am_here() {
#[cfg(feature = "another one that doesn't exist")]
loop {}

View File

@ -1,5 +1,5 @@
error[E0425]: cannot find function `i_am_not` in module `inner`
--> $DIR/diagnostics-not-a-def.rs:11:12
--> $DIR/diagnostics-not-a-def.rs:14:12
|
LL | inner::i_am_not();
| ^^^^^^^^ not found in `inner`

View File

@ -1,3 +1,5 @@
#![allow(unexpected_cfgs)] // since we want to recognize them as unexpected
pub mod inner {
#[cfg(FALSE)]
pub fn uwu() {}

View File

@ -1,72 +1,72 @@
error[E0432]: unresolved import `super::inner::doesnt_exist`
--> $DIR/diagnostics-same-crate.rs:28:9
--> $DIR/diagnostics-same-crate.rs:30:9
|
LL | use super::inner::doesnt_exist;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ no `doesnt_exist` in `inner`
|
note: found an item that was configured out
--> $DIR/diagnostics-same-crate.rs:7:13
--> $DIR/diagnostics-same-crate.rs:9:13
|
LL | pub mod doesnt_exist {
| ^^^^^^^^^^^^
error[E0432]: unresolved import `super::inner::doesnt_exist`
--> $DIR/diagnostics-same-crate.rs:31:23
--> $DIR/diagnostics-same-crate.rs:33:23
|
LL | use super::inner::doesnt_exist::hi;
| ^^^^^^^^^^^^ could not find `doesnt_exist` in `inner`
|
note: found an item that was configured out
--> $DIR/diagnostics-same-crate.rs:7:13
--> $DIR/diagnostics-same-crate.rs:9:13
|
LL | pub mod doesnt_exist {
| ^^^^^^^^^^^^
error[E0433]: failed to resolve: could not find `doesnt_exist` in `inner`
--> $DIR/diagnostics-same-crate.rs:50:12
--> $DIR/diagnostics-same-crate.rs:52:12
|
LL | inner::doesnt_exist::hello();
| ^^^^^^^^^^^^ could not find `doesnt_exist` in `inner`
|
note: found an item that was configured out
--> $DIR/diagnostics-same-crate.rs:7:13
--> $DIR/diagnostics-same-crate.rs:9:13
|
LL | pub mod doesnt_exist {
| ^^^^^^^^^^^^
error[E0425]: cannot find function `uwu` in module `inner`
--> $DIR/diagnostics-same-crate.rs:45:12
--> $DIR/diagnostics-same-crate.rs:47:12
|
LL | inner::uwu();
| ^^^ not found in `inner`
|
note: found an item that was configured out
--> $DIR/diagnostics-same-crate.rs:3:12
--> $DIR/diagnostics-same-crate.rs:5:12
|
LL | pub fn uwu() {}
| ^^^
error[E0425]: cannot find function `meow` in module `inner::right`
--> $DIR/diagnostics-same-crate.rs:54:19
--> $DIR/diagnostics-same-crate.rs:56:19
|
LL | inner::right::meow();
| ^^^^ not found in `inner::right`
|
note: found an item that was configured out
--> $DIR/diagnostics-same-crate.rs:22:16
--> $DIR/diagnostics-same-crate.rs:24:16
|
LL | pub fn meow() {}
| ^^^^
= note: the item is gated behind the `what-a-cool-feature` feature
error[E0425]: cannot find function `uwu` in this scope
--> $DIR/diagnostics-same-crate.rs:41:5
--> $DIR/diagnostics-same-crate.rs:43:5
|
LL | uwu();
| ^^^ not found in this scope
error[E0425]: cannot find function `vanished` in this scope
--> $DIR/diagnostics-same-crate.rs:61:5
--> $DIR/diagnostics-same-crate.rs:63:5
|
LL | vanished();
| ^^^^^^^^ not found in this scope

View File

@ -1,5 +1,7 @@
//@ check-pass
#![allow(unexpected_cfgs)] // since we different cfgs
macro_rules! mac {
{} => {
#[cfg(attr)]

View File

@ -1,5 +1,5 @@
//@ check-fail
//@ compile-flags:--cfg foo
//@ compile-flags:--cfg foo --check-cfg=cfg(foo)
#![cfg_attr(foo, crate_type="bin")]
//~^ERROR `crate_type` within

View File

@ -1,6 +1,5 @@
//
//@ error-pattern: `main` function not found
//@ compile-flags: --cfg foo
//@ compile-flags: --cfg foo --check-cfg=cfg(foo,bar)
// main is conditionally compiled, but the conditional compilation
// is conditional too!

View File

@ -1,5 +1,5 @@
error[E0601]: `main` function not found in crate `cfg_attr_cfg_2`
--> $DIR/cfg-attr-cfg-2.rs:9:14
--> $DIR/cfg-attr-cfg-2.rs:8:14
|
LL | fn main() { }
| ^ consider adding a `main` function to `$DIR/cfg-attr-cfg-2.rs`

View File

@ -1,6 +1,6 @@
// https://github.com/rust-lang/rust/issues/21833#issuecomment-72353044
//@ compile-flags: --cfg broken
//@ compile-flags: --cfg broken --check-cfg=cfg(broken)
#![crate_type = "lib"]
#![cfg_attr(broken, no_core)] //~ ERROR the `#[no_core]` attribute is an experimental feature

View File

@ -1,4 +1,4 @@
//@ compile-flags: --cfg broken
//@ compile-flags: --cfg broken --check-cfg=cfg(broken)
#![crate_type = "lib"]
#![cfg_attr(broken, no_core, no_std)]

View File

@ -1,4 +1,4 @@
//@ compile-flags: --cfg broken
//@ compile-flags: --cfg broken --check-cfg=cfg(broken)
#![crate_type = "lib"]
#![cfg_attr(broken, no_std, no_core)]

View File

@ -1,4 +1,4 @@
//@ compile-flags:--cfg yes
//@ compile-flags:--cfg yes --check-cfg=cfg(yes,no)
fn f_lt<#[cfg(yes)] 'a: 'a, #[cfg(FALSE)] T>() {}
fn f_ty<#[cfg(FALSE)] 'a: 'a, #[cfg(yes)] T>() {}

View File

@ -1,4 +1,4 @@
//@ compile-flags: --cfg foo
//@ compile-flags: --cfg foo --check-cfg=cfg(foo,bar)
#[cfg(all(foo, bar))] // foo AND bar
fn foo() {}

View File

@ -1,5 +1,5 @@
//@ build-pass (FIXME(62277): could be check-pass?)
//@ compile-flags:--cfg my_feature
//@ compile-flags:--cfg my_feature --check-cfg=cfg(my_feature)
#![no_std]

View File

@ -51,6 +51,7 @@ fn assert_ne() {
}
#[test]
#[allow(unexpected_cfgs)]
fn cfg() {
let _ = cfg!(pants);
let _ = cfg!(pants,);

View File

@ -1,6 +1,7 @@
//@ run-pass
//@ compile-flags: --cfg foo --check-cfg=cfg(foo)
#![allow(dead_code)]
//@ compile-flags: --cfg foo
macro_rules! compiles_fine {
($at:meta) => {

View File

@ -1,5 +1,5 @@
//@ run-pass
//@ compile-flags: --cfg foo
//@ compile-flags: --cfg foo --check-cfg=cfg(foo)
#[cfg(foo)]

View File

@ -1,6 +1,6 @@
//@ run-pass
//@ compile-flags: --cfg foo --cfg qux="foo"
//@ compile-flags: --check-cfg=cfg(foo) --check-cfg=cfg(qux,values("foo"))
pub fn main() {
// check

View File

@ -18,6 +18,9 @@
//@ revisions: b00001 b00010 b00011 b00100 b00101 b00110 b00111 b01000 b01001 b01100 b01101 b10000 b10001 b10010 b10011 b10101 b10111 b11000 b11001 b11101
//@ compile-flags: --check-cfg=cfg(inherent_mut,bar_for_foo,mutbar_for_foo)
//@ compile-flags: --check-cfg=cfg(valbar_for_et_foo,valbar_for_etmut_foo)
//@[b00001]compile-flags: --cfg inherent_mut
//@[b00010]compile-flags: --cfg bar_for_foo
//@[b00011]compile-flags: --cfg inherent_mut --cfg bar_for_foo

View File

@ -1,6 +1,8 @@
//@ compile-flags: -Zdeduplicate-diagnostics=yes
//@ run-rustfix
#![allow(unexpected_cfgs)]
fn main() {
#[cfg(key="foo")]
//~^ ERROR expected unsuffixed literal, found `foo`

View File

@ -1,6 +1,8 @@
//@ compile-flags: -Zdeduplicate-diagnostics=yes
//@ run-rustfix
#![allow(unexpected_cfgs)]
fn main() {
#[cfg(key=foo)]
//~^ ERROR expected unsuffixed literal, found `foo`

View File

@ -1,5 +1,5 @@
error: expected unsuffixed literal, found `foo`
--> $DIR/attr-unquoted-ident.rs:5:15
--> $DIR/attr-unquoted-ident.rs:7:15
|
LL | #[cfg(key=foo)]
| ^^^
@ -10,7 +10,7 @@ LL | #[cfg(key="foo")]
| + +
error: expected unsuffixed literal, found `foo`
--> $DIR/attr-unquoted-ident.rs:11:15
--> $DIR/attr-unquoted-ident.rs:13:15
|
LL | #[cfg(key=foo bar baz)]
| ^^^

View File

@ -3,6 +3,7 @@
// attempting to bootstrap librustc with new destructor lifetime
// semantics.
#![allow(unexpected_cfgs)] // for the cfg-as-descriptions
use std::collections::HashMap;
use std::cell::RefCell;

View File

@ -1,8 +1,8 @@
//@ run-rustfix
//@ compile-flags: --cfg=whatever -Aunused
//@ compile-flags: -Aunused
use y::z;
#[cfg(whatever)]
#[cfg(all())]
use y::Whatever;
mod y {

View File

@ -1,7 +1,7 @@
//@ run-rustfix
//@ compile-flags: --cfg=whatever -Aunused
//@ compile-flags: -Aunused
#[cfg(whatever)]
#[cfg(all())]
use y::Whatever;
mod y {

View File

@ -1,5 +1,5 @@
//@ check-pass
//@ compile-flags: --cfg something
//@ compile-flags: --cfg something --check-cfg=cfg(nothing,something)
#![deny(unused_mut)]

View File

@ -1,4 +1,4 @@
//@ compile-flags: --cfg something
//@ compile-flags: --cfg something --check-cfg=cfg(nothing,something)
//@ edition:2018
#![feature(async_closure)]

View File

@ -4,7 +4,7 @@
//@ edition:2018
#![deny(rust_2018_idioms)]
#![allow(dead_code)]
#![allow(dead_code, unexpected_cfgs)]
// The suggestion span should include the attribute.

View File

@ -4,7 +4,7 @@
//@ edition:2018
#![deny(rust_2018_idioms)]
#![allow(dead_code)]
#![allow(dead_code, unexpected_cfgs)]
// The suggestion span should include the attribute.

View File

@ -1,6 +1,7 @@
// Check to see if we can get parameters from an @argsfile file
//
//@ build-pass
//@ no-auto-check-cfg
//@ compile-flags: @{{src-base}}/shell-argfiles/shell-argfiles-via-argfile.args @shell:{{src-base}}/shell-argfiles/shell-argfiles-via-argfile-shell.args
#[cfg(not(shell_args_set))]

View File

@ -1,3 +1,4 @@
--cfg unquoted_set
'--cfg' 'single_quoted_set'
"--cfg" "double_quoted_set"
--check-cfg 'cfg(cmdline_set, unquoted_set, single_quoted_set, double_quoted_set)'

View File

@ -2,6 +2,7 @@
#![allow(stable_features)]
#![feature(cfg_target_feature)]
#![feature(lint_reasons)]
use std::env;
@ -20,6 +21,7 @@ fn main() {
"SSE2 was not detected as available on an x86 platform");
}
// check a negative case too -- certainly not enabled by default
assert!(cfg!(not(target_feature = "ferris_wheel")),
"🎡 shouldn't be detected as available by default on any platform");
#[expect(unexpected_cfgs)]
{ assert!(cfg!(not(target_feature = "ferris_wheel")),
"🎡 shouldn't be detected as available by default on any platform") };
}

View File

@ -6,7 +6,7 @@
//@ build-pass
#![no_core]
#![crate_type = "rlib"]
#![feature(intrinsics, rustc_attrs, no_core, lang_items, staged_api)]
#![feature(intrinsics, rustc_attrs, no_core, lang_items, staged_api, lint_reasons)]
#![stable(feature = "test", since = "1.0.0")]
// Supporting minimal rust core code
@ -43,22 +43,30 @@ macro_rules! assert {
#[cfg(target_arch = "aarch64")]
fn check_aarch64() {
// This checks that the rustc feature name is used, not the LLVM feature.
// These checks that the rustc feature name is used, not the LLVM feature.
assert!(cfg!(target_feature = "neon"));
assert!(cfg!(not(target_feature = "fp-armv8")));
// #[expect(unexpected_cfgs)] except that 32-bit arm actually use fp-armv8
{ assert!(cfg!(not(target_feature = "fp-armv8"))); }
assert!(cfg!(target_feature = "fhm"));
assert!(cfg!(not(target_feature = "fp16fml")));
#[expect(unexpected_cfgs)]
{ assert!(cfg!(not(target_feature = "fp16fml"))); }
assert!(cfg!(target_feature = "fp16"));
assert!(cfg!(not(target_feature = "fullfp16")));
#[expect(unexpected_cfgs)]
{ assert!(cfg!(not(target_feature = "fullfp16"))); }
}
#[cfg(target_arch = "x86_64")]
fn check_x86_64() {
// This checks that the rustc feature name is used, not the LLVM feature.
assert!(cfg!(target_feature = "rdrand"));
assert!(cfg!(not(target_feature = "rdrnd")));
#[expect(unexpected_cfgs)]
{ assert!(cfg!(not(target_feature = "rdrnd"))); }
// Likewise: We enable LLVM's crc32 feature with SSE4.2, but Rust says it's just SSE4.2
assert!(cfg!(target_feature = "sse4.2"));
assert!(cfg!(not(target_feature = "crc32")));
#[expect(unexpected_cfgs)]
{ assert!(cfg!(not(target_feature = "crc32"))); }
}