Rollup merge of #61755 - Centril:compiletest-force-check, r=petrochenkov
Add `--pass $mode` to compiletest through `./x.py` Adds a flag `--pass $mode` to compiletest, which is exposed through `./x.py`. When `--pass $mode` is passed, `{check,build,compile,run}-pass` tests will be forced to run under the given `$mode` unless the directive `// ignore-pass` exists in the test file. The modes are explained in https://github.com/rust-lang/rust/pull/61778: - `check` has the same effect as `cargo check` - `build` or `compile` have the same effect as `cargo build` - `run` has the same effect as `cargo run` On my machine, `./x.py -i test src/test/run-pass --stage 1 --pass check` takes 38 seconds whereas it takes 2 min 7 seconds without `--pass check`. cc https://github.com/rust-lang/rust/issues/61712 r? @petrochenkov
This commit is contained in:
commit
0721364f0d
20 changed files with 194 additions and 88 deletions
|
@ -598,6 +598,7 @@ fn test_with_no_doc_stage0() {
|
||||||
bless: false,
|
bless: false,
|
||||||
compare_mode: None,
|
compare_mode: None,
|
||||||
rustfix_coverage: false,
|
rustfix_coverage: false,
|
||||||
|
pass: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let build = Build::new(config);
|
let build = Build::new(config);
|
||||||
|
@ -640,6 +641,7 @@ fn test_exclude() {
|
||||||
bless: false,
|
bless: false,
|
||||||
compare_mode: None,
|
compare_mode: None,
|
||||||
rustfix_coverage: false,
|
rustfix_coverage: false,
|
||||||
|
pass: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let build = Build::new(config);
|
let build = Build::new(config);
|
||||||
|
|
|
@ -58,6 +58,7 @@ pub enum Subcommand {
|
||||||
/// Whether to automatically update stderr/stdout files
|
/// Whether to automatically update stderr/stdout files
|
||||||
bless: bool,
|
bless: bool,
|
||||||
compare_mode: Option<String>,
|
compare_mode: Option<String>,
|
||||||
|
pass: Option<String>,
|
||||||
test_args: Vec<String>,
|
test_args: Vec<String>,
|
||||||
rustc_args: Vec<String>,
|
rustc_args: Vec<String>,
|
||||||
fail_fast: bool,
|
fail_fast: bool,
|
||||||
|
@ -199,6 +200,12 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`"
|
||||||
"mode describing what file the actual ui output will be compared to",
|
"mode describing what file the actual ui output will be compared to",
|
||||||
"COMPARE MODE",
|
"COMPARE MODE",
|
||||||
);
|
);
|
||||||
|
opts.optopt(
|
||||||
|
"",
|
||||||
|
"pass",
|
||||||
|
"force {check,build,run}-pass tests to this mode.",
|
||||||
|
"check | build | run"
|
||||||
|
);
|
||||||
opts.optflag(
|
opts.optflag(
|
||||||
"",
|
"",
|
||||||
"rustfix-coverage",
|
"rustfix-coverage",
|
||||||
|
@ -401,6 +408,7 @@ Arguments:
|
||||||
paths,
|
paths,
|
||||||
bless: matches.opt_present("bless"),
|
bless: matches.opt_present("bless"),
|
||||||
compare_mode: matches.opt_str("compare-mode"),
|
compare_mode: matches.opt_str("compare-mode"),
|
||||||
|
pass: matches.opt_str("pass"),
|
||||||
test_args: matches.opt_strs("test-args"),
|
test_args: matches.opt_strs("test-args"),
|
||||||
rustc_args: matches.opt_strs("rustc-args"),
|
rustc_args: matches.opt_strs("rustc-args"),
|
||||||
fail_fast: !matches.opt_present("no-fail-fast"),
|
fail_fast: !matches.opt_present("no-fail-fast"),
|
||||||
|
@ -524,6 +532,15 @@ impl Subcommand {
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn pass(&self) -> Option<&str> {
|
||||||
|
match *self {
|
||||||
|
Subcommand::Test {
|
||||||
|
ref pass, ..
|
||||||
|
} => pass.as_ref().map(|s| &s[..]),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn split(s: &[String]) -> Vec<String> {
|
fn split(s: &[String]) -> Vec<String> {
|
||||||
|
|
|
@ -1065,6 +1065,11 @@ impl Step for Compiletest {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if let Some(ref pass) = builder.config.cmd.pass() {
|
||||||
|
cmd.arg("--pass");
|
||||||
|
cmd.arg(pass);
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(ref nodejs) = builder.config.nodejs {
|
if let Some(ref nodejs) = builder.config.nodejs {
|
||||||
cmd.arg("--nodejs").arg(nodejs);
|
cmd.arg("--nodejs").arg(nodejs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,23 @@
|
||||||
#![warn(const_err)]
|
|
||||||
|
|
||||||
// compile-pass
|
|
||||||
// compile-flags: -O
|
// compile-flags: -O
|
||||||
|
|
||||||
|
#![deny(const_err)]
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("{}", 0u32 - 1);
|
println!("{}", 0u32 - 1);
|
||||||
let _x = 0u32 - 1;
|
let _x = 0u32 - 1;
|
||||||
//~^ WARN const_err
|
//~^ ERROR this expression will panic at runtime [const_err]
|
||||||
println!("{}", 1/(1-1));
|
println!("{}", 1/(1-1));
|
||||||
//~^ WARN const_err
|
//~^ ERROR this expression will panic at runtime [const_err]
|
||||||
|
//~| ERROR attempt to divide by zero [const_err]
|
||||||
|
//~| ERROR reaching this expression at runtime will panic or abort [const_err]
|
||||||
let _x = 1/(1-1);
|
let _x = 1/(1-1);
|
||||||
//~^ WARN const_err
|
//~^ ERROR const_err
|
||||||
//~| WARN const_err
|
//~| ERROR const_err
|
||||||
println!("{}", 1/(false as u32));
|
println!("{}", 1/(false as u32));
|
||||||
//~^ WARN const_err
|
//~^ ERROR this expression will panic at runtime [const_err]
|
||||||
|
//~| ERROR attempt to divide by zero [const_err]
|
||||||
|
//~| ERROR reaching this expression at runtime will panic or abort [const_err]
|
||||||
let _x = 1/(false as u32);
|
let _x = 1/(false as u32);
|
||||||
//~^ WARN const_err
|
//~^ ERROR const_err
|
||||||
//~| WARN const_err
|
//~| ERROR const_err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,72 +1,74 @@
|
||||||
warning: this expression will panic at runtime
|
error: this expression will panic at runtime
|
||||||
--> $DIR/promoted_errors.rs:7:14
|
--> $DIR/promoted_errors.rs:7:14
|
||||||
|
|
|
|
||||||
LL | let _x = 0u32 - 1;
|
LL | let _x = 0u32 - 1;
|
||||||
| ^^^^^^^^ attempt to subtract with overflow
|
| ^^^^^^^^ attempt to subtract with overflow
|
||||||
|
|
|
|
||||||
note: lint level defined here
|
note: lint level defined here
|
||||||
--> $DIR/promoted_errors.rs:1:9
|
--> $DIR/promoted_errors.rs:3:9
|
||||||
|
|
|
|
||||||
LL | #![warn(const_err)]
|
LL | #![deny(const_err)]
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
||||||
warning: attempt to divide by zero
|
error: attempt to divide by zero
|
||||||
--> $DIR/promoted_errors.rs:9:20
|
--> $DIR/promoted_errors.rs:9:20
|
||||||
|
|
|
|
||||||
LL | println!("{}", 1/(1-1));
|
LL | println!("{}", 1/(1-1));
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
||||||
warning: this expression will panic at runtime
|
error: this expression will panic at runtime
|
||||||
--> $DIR/promoted_errors.rs:9:20
|
--> $DIR/promoted_errors.rs:9:20
|
||||||
|
|
|
|
||||||
LL | println!("{}", 1/(1-1));
|
LL | println!("{}", 1/(1-1));
|
||||||
| ^^^^^^^ attempt to divide by zero
|
| ^^^^^^^ attempt to divide by zero
|
||||||
|
|
||||||
warning: attempt to divide by zero
|
error: attempt to divide by zero
|
||||||
--> $DIR/promoted_errors.rs:11:14
|
--> $DIR/promoted_errors.rs:13:14
|
||||||
|
|
|
|
||||||
LL | let _x = 1/(1-1);
|
LL | let _x = 1/(1-1);
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
||||||
warning: this expression will panic at runtime
|
error: this expression will panic at runtime
|
||||||
--> $DIR/promoted_errors.rs:11:14
|
--> $DIR/promoted_errors.rs:13:14
|
||||||
|
|
|
|
||||||
LL | let _x = 1/(1-1);
|
LL | let _x = 1/(1-1);
|
||||||
| ^^^^^^^ attempt to divide by zero
|
| ^^^^^^^ attempt to divide by zero
|
||||||
|
|
||||||
warning: attempt to divide by zero
|
error: attempt to divide by zero
|
||||||
--> $DIR/promoted_errors.rs:14:20
|
--> $DIR/promoted_errors.rs:16:20
|
||||||
|
|
|
|
||||||
LL | println!("{}", 1/(false as u32));
|
LL | println!("{}", 1/(false as u32));
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: this expression will panic at runtime
|
error: this expression will panic at runtime
|
||||||
--> $DIR/promoted_errors.rs:14:20
|
--> $DIR/promoted_errors.rs:16:20
|
||||||
|
|
|
|
||||||
LL | println!("{}", 1/(false as u32));
|
LL | println!("{}", 1/(false as u32));
|
||||||
| ^^^^^^^^^^^^^^^^ attempt to divide by zero
|
| ^^^^^^^^^^^^^^^^ attempt to divide by zero
|
||||||
|
|
||||||
warning: attempt to divide by zero
|
error: attempt to divide by zero
|
||||||
--> $DIR/promoted_errors.rs:16:14
|
--> $DIR/promoted_errors.rs:20:14
|
||||||
|
|
|
|
||||||
LL | let _x = 1/(false as u32);
|
LL | let _x = 1/(false as u32);
|
||||||
| ^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: this expression will panic at runtime
|
error: this expression will panic at runtime
|
||||||
--> $DIR/promoted_errors.rs:16:14
|
--> $DIR/promoted_errors.rs:20:14
|
||||||
|
|
|
|
||||||
LL | let _x = 1/(false as u32);
|
LL | let _x = 1/(false as u32);
|
||||||
| ^^^^^^^^^^^^^^^^ attempt to divide by zero
|
| ^^^^^^^^^^^^^^^^ attempt to divide by zero
|
||||||
|
|
||||||
warning: reaching this expression at runtime will panic or abort
|
error: reaching this expression at runtime will panic or abort
|
||||||
--> $DIR/promoted_errors.rs:14:20
|
--> $DIR/promoted_errors.rs:16:20
|
||||||
|
|
|
|
||||||
LL | println!("{}", 1/(false as u32));
|
LL | println!("{}", 1/(false as u32));
|
||||||
| ^^^^^^^^^^^^^^^^ attempt to divide by zero
|
| ^^^^^^^^^^^^^^^^ attempt to divide by zero
|
||||||
|
|
||||||
warning: reaching this expression at runtime will panic or abort
|
error: reaching this expression at runtime will panic or abort
|
||||||
--> $DIR/promoted_errors.rs:9:20
|
--> $DIR/promoted_errors.rs:9:20
|
||||||
|
|
|
|
||||||
LL | println!("{}", 1/(1-1));
|
LL | println!("{}", 1/(1-1));
|
||||||
| ^^^^^^^ attempt to divide by zero
|
| ^^^^^^^ attempt to divide by zero
|
||||||
|
|
||||||
|
error: aborting due to 11 previous errors
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// compile-flags:--emit=metadata --error-format=json -Z emit-artifact-notifications
|
// compile-flags:--emit=metadata --error-format=json -Z emit-artifact-notifications
|
||||||
// compile-pass
|
// compile-pass
|
||||||
|
// ignore-pass
|
||||||
|
// ^-- needed because `--pass check` does not emit the output needed.
|
||||||
|
|
||||||
// A very basic test for the emission of artifact notifications in JSON output.
|
// A very basic test for the emission of artifact notifications in JSON output.
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,13 @@
|
||||||
// compile-flags: -O
|
// compile-flags: -O
|
||||||
#![warn(overflowing_literals)]
|
|
||||||
#![warn(const_err)]
|
|
||||||
// compile-pass
|
|
||||||
|
|
||||||
#[allow(unused_variables)]
|
#![deny(overflowing_literals)]
|
||||||
|
#![deny(const_err)]
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x2: i8 = --128; //~ warn: literal out of range for i8
|
let x2: i8 = --128; //~ ERROR literal out of range for `i8`
|
||||||
|
|
||||||
let x = -3.40282357e+38_f32; //~ warn: literal out of range for f32
|
let x = -3.40282357e+38_f32; //~ ERROR literal out of range for `f32`
|
||||||
let x = 3.40282357e+38_f32; //~ warn: literal out of range for f32
|
let x = 3.40282357e+38_f32; //~ ERROR literal out of range for `f32`
|
||||||
let x = -1.7976931348623159e+308_f64; //~ warn: literal out of range for f64
|
let x = -1.7976931348623159e+308_f64; //~ ERROR literal out of range for `f64`
|
||||||
let x = 1.7976931348623159e+308_f64; //~ warn: literal out of range for f64
|
let x = 1.7976931348623159e+308_f64; //~ ERROR literal out of range for `f64`
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,48 +1,38 @@
|
||||||
warning: literal out of range for `i8`
|
error: literal out of range for `i8`
|
||||||
--> $DIR/lint-type-overflow2.rs:9:20
|
--> $DIR/lint-type-overflow2.rs:7:20
|
||||||
|
|
|
|
||||||
LL | let x2: i8 = --128;
|
LL | let x2: i8 = --128;
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
|
||||||
note: lint level defined here
|
note: lint level defined here
|
||||||
--> $DIR/lint-type-overflow2.rs:2:9
|
--> $DIR/lint-type-overflow2.rs:3:9
|
||||||
|
|
|
|
||||||
LL | #![warn(overflowing_literals)]
|
LL | #![deny(overflowing_literals)]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: literal out of range for `f32`
|
error: literal out of range for `f32`
|
||||||
--> $DIR/lint-type-overflow2.rs:11:14
|
--> $DIR/lint-type-overflow2.rs:9:14
|
||||||
|
|
|
|
||||||
LL | let x = -3.40282357e+38_f32;
|
LL | let x = -3.40282357e+38_f32;
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: literal out of range for `f32`
|
error: literal out of range for `f32`
|
||||||
--> $DIR/lint-type-overflow2.rs:12:14
|
--> $DIR/lint-type-overflow2.rs:10:14
|
||||||
|
|
|
|
||||||
LL | let x = 3.40282357e+38_f32;
|
LL | let x = 3.40282357e+38_f32;
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: literal out of range for `f64`
|
error: literal out of range for `f64`
|
||||||
--> $DIR/lint-type-overflow2.rs:13:14
|
--> $DIR/lint-type-overflow2.rs:11:14
|
||||||
|
|
|
|
||||||
LL | let x = -1.7976931348623159e+308_f64;
|
LL | let x = -1.7976931348623159e+308_f64;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: literal out of range for `f64`
|
error: literal out of range for `f64`
|
||||||
--> $DIR/lint-type-overflow2.rs:14:14
|
--> $DIR/lint-type-overflow2.rs:12:14
|
||||||
|
|
|
|
||||||
LL | let x = 1.7976931348623159e+308_f64;
|
LL | let x = 1.7976931348623159e+308_f64;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
warning: this expression will panic at runtime
|
error: aborting due to 5 previous errors
|
||||||
--> $DIR/lint-type-overflow2.rs:9:18
|
|
||||||
|
|
|
||||||
LL | let x2: i8 = --128;
|
|
||||||
| ^^^^^ attempt to negate with overflow
|
|
||||||
|
|
|
||||||
note: lint level defined here
|
|
||||||
--> $DIR/lint-type-overflow2.rs:3:9
|
|
||||||
|
|
|
||||||
LL | #![warn(const_err)]
|
|
||||||
| ^^^^^^^^^
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
// compile-flags: -Z print-type-sizes
|
// compile-flags: -Z print-type-sizes
|
||||||
// compile-pass
|
// compile-pass
|
||||||
|
// ignore-pass
|
||||||
|
// ^-- needed because `--pass check` does not emit the output needed.
|
||||||
|
// FIXME: consider using an attribute instead of side-effects.
|
||||||
|
|
||||||
// This file illustrates how generics are handled: types have to be
|
// This file illustrates how generics are handled: types have to be
|
||||||
// monomorphized, in the MIR of the original function in which they
|
// monomorphized, in the MIR of the original function in which they
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
// compile-flags: -Z print-type-sizes
|
// compile-flags: -Z print-type-sizes
|
||||||
// compile-pass
|
// compile-pass
|
||||||
|
// ignore-pass
|
||||||
|
// ^-- needed because `--pass check` does not emit the output needed.
|
||||||
|
// FIXME: consider using an attribute instead of side-effects.
|
||||||
|
|
||||||
// This file illustrates how niche-filling enums are handled,
|
// This file illustrates how niche-filling enums are handled,
|
||||||
// modelled after cases like `Option<&u32>`, `Option<bool>` and such.
|
// modelled after cases like `Option<&u32>`, `Option<bool>` and such.
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
// compile-flags: -Z print-type-sizes
|
// compile-flags: -Z print-type-sizes
|
||||||
// compile-pass
|
// compile-pass
|
||||||
|
// ignore-pass
|
||||||
|
// ^-- needed because `--pass check` does not emit the output needed.
|
||||||
|
// FIXME: consider using an attribute instead of side-effects.
|
||||||
|
|
||||||
// This file illustrates that when the same type occurs repeatedly
|
// This file illustrates that when the same type occurs repeatedly
|
||||||
// (even if multiple functions), it is only printed once in the
|
// (even if multiple functions), it is only printed once in the
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
// compile-flags: -Z print-type-sizes
|
// compile-flags: -Z print-type-sizes
|
||||||
// compile-pass
|
// compile-pass
|
||||||
|
// ignore-pass
|
||||||
|
// ^-- needed because `--pass check` does not emit the output needed.
|
||||||
|
// FIXME: consider using an attribute instead of side-effects.
|
||||||
|
|
||||||
// This file illustrates how packing is handled; it should cause
|
// This file illustrates how packing is handled; it should cause
|
||||||
// the elimination of padding that would normally be introduced
|
// the elimination of padding that would normally be introduced
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
// compile-flags: -Z print-type-sizes
|
// compile-flags: -Z print-type-sizes
|
||||||
// compile-pass
|
// compile-pass
|
||||||
|
// ignore-pass
|
||||||
|
// ^-- needed because `--pass check` does not emit the output needed.
|
||||||
|
// FIXME: consider using an attribute instead of side-effects.
|
||||||
|
|
||||||
// This file illustrates how padding is handled: alignment
|
// This file illustrates how padding is handled: alignment
|
||||||
// requirements can lead to the introduction of padding, either before
|
// requirements can lead to the introduction of padding, either before
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
// compile-flags: -Z print-type-sizes
|
// compile-flags: -Z print-type-sizes
|
||||||
// compile-pass
|
// compile-pass
|
||||||
|
// ignore-pass
|
||||||
|
// ^-- needed because `--pass check` does not emit the output needed.
|
||||||
|
// FIXME: consider using an attribute instead of side-effects.
|
||||||
|
|
||||||
#![feature(never_type)]
|
#![feature(never_type)]
|
||||||
#![feature(start)]
|
#![feature(start)]
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
// force-host
|
// force-host
|
||||||
// no-prefer-dynamic
|
// no-prefer-dynamic
|
||||||
|
// ignore-pass
|
||||||
|
|
||||||
#![crate_type = "proc-macro"]
|
#![crate_type = "proc-macro"]
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
// compile-pass
|
// compile-pass
|
||||||
// compile-flags: -Zsave-analysis -Zemit-artifact-notifications
|
// compile-flags: -Zsave-analysis -Zemit-artifact-notifications
|
||||||
// compile-flags: --crate-type rlib --error-format=json
|
// compile-flags: --crate-type rlib --error-format=json
|
||||||
|
// ignore-pass
|
||||||
|
// ^-- needed because otherwise, the .stderr file changes with --pass check
|
||||||
|
|
||||||
pub fn foo() {}
|
pub fn foo() {}
|
||||||
|
|
|
@ -99,6 +99,36 @@ impl fmt::Display for Mode {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, PartialEq, Debug, Hash)]
|
||||||
|
pub enum PassMode {
|
||||||
|
Check,
|
||||||
|
Build,
|
||||||
|
Run,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for PassMode {
|
||||||
|
type Err = ();
|
||||||
|
fn from_str(s: &str) -> Result<Self, ()> {
|
||||||
|
match s {
|
||||||
|
"check" => Ok(PassMode::Check),
|
||||||
|
"build" => Ok(PassMode::Build),
|
||||||
|
"run" => Ok(PassMode::Run),
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for PassMode {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
let s = match *self {
|
||||||
|
PassMode::Check => "check",
|
||||||
|
PassMode::Build => "build",
|
||||||
|
PassMode::Run => "run",
|
||||||
|
};
|
||||||
|
fmt::Display::fmt(s, f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
pub enum CompareMode {
|
pub enum CompareMode {
|
||||||
Nll,
|
Nll,
|
||||||
|
@ -184,6 +214,9 @@ pub struct Config {
|
||||||
/// Exactly match the filter, rather than a substring
|
/// Exactly match the filter, rather than a substring
|
||||||
pub filter_exact: bool,
|
pub filter_exact: bool,
|
||||||
|
|
||||||
|
/// Force the pass mode of a check/build/run-pass test to this mode.
|
||||||
|
pub force_pass_mode: Option<PassMode>,
|
||||||
|
|
||||||
/// Write out a parseable log of tests that were run
|
/// Write out a parseable log of tests that were run
|
||||||
pub logfile: Option<PathBuf>,
|
pub logfile: Option<PathBuf>,
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
use log::*;
|
use log::*;
|
||||||
|
|
||||||
use crate::common::{self, CompareMode, Config, Mode};
|
use crate::common::{self, CompareMode, Config, Mode, PassMode};
|
||||||
use crate::util;
|
use crate::util;
|
||||||
|
|
||||||
use crate::extract_gdb_version;
|
use crate::extract_gdb_version;
|
||||||
|
@ -290,13 +290,6 @@ impl EarlyProps {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Debug)]
|
|
||||||
pub enum PassMode {
|
|
||||||
Check,
|
|
||||||
Build,
|
|
||||||
Run,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct TestProps {
|
pub struct TestProps {
|
||||||
// Lines that should be expected, in order, on standard out
|
// Lines that should be expected, in order, on standard out
|
||||||
|
@ -357,7 +350,9 @@ pub struct TestProps {
|
||||||
// arguments. (In particular, it propagates to the aux-builds.)
|
// arguments. (In particular, it propagates to the aux-builds.)
|
||||||
pub incremental_dir: Option<PathBuf>,
|
pub incremental_dir: Option<PathBuf>,
|
||||||
// How far should the test proceed while still passing.
|
// How far should the test proceed while still passing.
|
||||||
pub pass_mode: Option<PassMode>,
|
pass_mode: Option<PassMode>,
|
||||||
|
// Ignore `--pass` overrides from the command line for this test.
|
||||||
|
ignore_pass: bool,
|
||||||
// rustdoc will test the output of the `--test` option
|
// rustdoc will test the output of the `--test` option
|
||||||
pub check_test_line_numbers_match: bool,
|
pub check_test_line_numbers_match: bool,
|
||||||
// Do not pass `-Z ui-testing` to UI tests
|
// Do not pass `-Z ui-testing` to UI tests
|
||||||
|
@ -400,6 +395,7 @@ impl TestProps {
|
||||||
forbid_output: vec![],
|
forbid_output: vec![],
|
||||||
incremental_dir: None,
|
incremental_dir: None,
|
||||||
pass_mode: None,
|
pass_mode: None,
|
||||||
|
ignore_pass: false,
|
||||||
check_test_line_numbers_match: false,
|
check_test_line_numbers_match: false,
|
||||||
disable_ui_testing_normalization: false,
|
disable_ui_testing_normalization: false,
|
||||||
normalize_stdout: vec![],
|
normalize_stdout: vec![],
|
||||||
|
@ -528,6 +524,10 @@ impl TestProps {
|
||||||
|
|
||||||
self.update_pass_mode(ln, cfg, config);
|
self.update_pass_mode(ln, cfg, config);
|
||||||
|
|
||||||
|
if !self.ignore_pass {
|
||||||
|
self.ignore_pass = config.parse_ignore_pass(ln);
|
||||||
|
}
|
||||||
|
|
||||||
if !self.disable_ui_testing_normalization {
|
if !self.disable_ui_testing_normalization {
|
||||||
self.disable_ui_testing_normalization =
|
self.disable_ui_testing_normalization =
|
||||||
config.parse_disable_ui_testing_normalization(ln);
|
config.parse_disable_ui_testing_normalization(ln);
|
||||||
|
@ -608,6 +608,15 @@ impl TestProps {
|
||||||
(_, None) => {}
|
(_, None) => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn pass_mode(&self, config: &Config) -> Option<PassMode> {
|
||||||
|
if !self.ignore_pass {
|
||||||
|
if let (mode @ Some(_), Some(_)) = (config.force_pass_mode, self.pass_mode) {
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.pass_mode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn iter_header(testfile: &Path, cfg: Option<&str>, it: &mut dyn FnMut(&str)) {
|
fn iter_header(testfile: &Path, cfg: Option<&str>, it: &mut dyn FnMut(&str)) {
|
||||||
|
@ -743,6 +752,10 @@ impl Config {
|
||||||
self.parse_name_directive(line, "check-test-line-numbers-match")
|
self.parse_name_directive(line, "check-test-line-numbers-match")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_ignore_pass(&self, line: &str) -> bool {
|
||||||
|
self.parse_name_directive(line, "ignore-pass")
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_assembly_output(&self, line: &str) -> Option<String> {
|
fn parse_assembly_output(&self, line: &str) -> Option<String> {
|
||||||
self.parse_name_value_directive(line, "assembly-output")
|
self.parse_name_value_directive(line, "assembly-output")
|
||||||
.map(|r| r.trim().to_string())
|
.map(|r| r.trim().to_string())
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
extern crate test;
|
extern crate test;
|
||||||
|
|
||||||
use crate::common::CompareMode;
|
use crate::common::{CompareMode, PassMode};
|
||||||
use crate::common::{expected_output_path, output_base_dir, output_relative_path, UI_EXTENSIONS};
|
use crate::common::{expected_output_path, output_base_dir, output_relative_path, UI_EXTENSIONS};
|
||||||
use crate::common::{Config, TestPaths};
|
use crate::common::{Config, TestPaths};
|
||||||
use crate::common::{DebugInfoCdb, DebugInfoGdbLldb, DebugInfoGdb, DebugInfoLldb, Mode, Pretty};
|
use crate::common::{DebugInfoCdb, DebugInfoGdbLldb, DebugInfoGdb, DebugInfoLldb, Mode, Pretty};
|
||||||
|
@ -128,6 +128,12 @@ pub fn parse_config(args: Vec<String>) -> Config {
|
||||||
"(compile-fail|run-fail|run-pass|\
|
"(compile-fail|run-fail|run-pass|\
|
||||||
run-pass-valgrind|pretty|debug-info|incremental|mir-opt)",
|
run-pass-valgrind|pretty|debug-info|incremental|mir-opt)",
|
||||||
)
|
)
|
||||||
|
.optopt(
|
||||||
|
"",
|
||||||
|
"pass",
|
||||||
|
"force {check,build,run}-pass tests to this mode.",
|
||||||
|
"check | build | run"
|
||||||
|
)
|
||||||
.optflag("", "ignored", "run tests marked as ignored")
|
.optflag("", "ignored", "run tests marked as ignored")
|
||||||
.optflag("", "exact", "filters match exactly")
|
.optflag("", "exact", "filters match exactly")
|
||||||
.optopt(
|
.optopt(
|
||||||
|
@ -320,6 +326,10 @@ pub fn parse_config(args: Vec<String>) -> Config {
|
||||||
run_ignored,
|
run_ignored,
|
||||||
filter: matches.free.first().cloned(),
|
filter: matches.free.first().cloned(),
|
||||||
filter_exact: matches.opt_present("exact"),
|
filter_exact: matches.opt_present("exact"),
|
||||||
|
force_pass_mode: matches.opt_str("pass").map(|mode|
|
||||||
|
mode.parse::<PassMode>()
|
||||||
|
.unwrap_or_else(|_| panic!("unknown `--pass` option `{}` given", mode))
|
||||||
|
),
|
||||||
logfile: matches.opt_str("logfile").map(|s| PathBuf::from(&s)),
|
logfile: matches.opt_str("logfile").map(|s| PathBuf::from(&s)),
|
||||||
runtool: matches.opt_str("runtool"),
|
runtool: matches.opt_str("runtool"),
|
||||||
host_rustcflags: matches.opt_str("host-rustcflags"),
|
host_rustcflags: matches.opt_str("host-rustcflags"),
|
||||||
|
@ -382,6 +392,10 @@ pub fn log_config(config: &Config) {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
logv(c, format!("filter_exact: {}", config.filter_exact));
|
logv(c, format!("filter_exact: {}", config.filter_exact));
|
||||||
|
logv(c, format!(
|
||||||
|
"force_pass_mode: {}",
|
||||||
|
opt_str(&config.force_pass_mode.map(|m| format!("{}", m))),
|
||||||
|
));
|
||||||
logv(c, format!("runtool: {}", opt_str(&config.runtool)));
|
logv(c, format!("runtool: {}", opt_str(&config.runtool)));
|
||||||
logv(
|
logv(
|
||||||
c,
|
c,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// ignore-tidy-filelength
|
// ignore-tidy-filelength
|
||||||
|
|
||||||
use crate::common::CompareMode;
|
use crate::common::{CompareMode, PassMode};
|
||||||
use crate::common::{expected_output_path, UI_EXTENSIONS, UI_FIXED, UI_STDERR, UI_STDOUT};
|
use crate::common::{expected_output_path, UI_EXTENSIONS, UI_FIXED, UI_STDERR, UI_STDOUT};
|
||||||
use crate::common::{output_base_dir, output_base_name, output_testname_unique};
|
use crate::common::{output_base_dir, output_base_name, output_testname_unique};
|
||||||
use crate::common::{Codegen, CodegenUnits, Rustdoc};
|
use crate::common::{Codegen, CodegenUnits, Rustdoc};
|
||||||
|
@ -10,7 +10,7 @@ use crate::common::{Config, TestPaths};
|
||||||
use crate::common::{Incremental, MirOpt, RunMake, Ui, JsDocTest, Assembly};
|
use crate::common::{Incremental, MirOpt, RunMake, Ui, JsDocTest, Assembly};
|
||||||
use diff;
|
use diff;
|
||||||
use crate::errors::{self, Error, ErrorKind};
|
use crate::errors::{self, Error, ErrorKind};
|
||||||
use crate::header::{TestProps, PassMode};
|
use crate::header::TestProps;
|
||||||
use crate::json;
|
use crate::json;
|
||||||
use regex::{Captures, Regex};
|
use regex::{Captures, Regex};
|
||||||
use rustfix::{apply_suggestions, get_suggestions_from_json, Filter};
|
use rustfix::{apply_suggestions, get_suggestions_from_json, Filter};
|
||||||
|
@ -260,6 +260,10 @@ pub fn compute_stamp_hash(config: &Config) -> String {
|
||||||
env::var_os("PYTHONPATH").hash(&mut hash);
|
env::var_os("PYTHONPATH").hash(&mut hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Ui | RunPass | Incremental | Pretty = config.mode {
|
||||||
|
config.force_pass_mode.hash(&mut hash);
|
||||||
|
}
|
||||||
|
|
||||||
format!("{:x}", hash.finish())
|
format!("{:x}", hash.finish())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,10 +313,13 @@ impl<'test> TestCx<'test> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn pass_mode(&self) -> Option<PassMode> {
|
||||||
|
self.props.pass_mode(self.config)
|
||||||
|
}
|
||||||
|
|
||||||
fn should_run_successfully(&self) -> bool {
|
fn should_run_successfully(&self) -> bool {
|
||||||
match self.config.mode {
|
match self.config.mode {
|
||||||
RunPass => true,
|
RunPass | Ui => self.pass_mode() == Some(PassMode::Run),
|
||||||
Ui => self.props.pass_mode == Some(PassMode::Run),
|
|
||||||
mode => panic!("unimplemented for mode {:?}", mode),
|
mode => panic!("unimplemented for mode {:?}", mode),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -322,7 +329,7 @@ impl<'test> TestCx<'test> {
|
||||||
CompileFail => false,
|
CompileFail => false,
|
||||||
RunPass => true,
|
RunPass => true,
|
||||||
JsDocTest => true,
|
JsDocTest => true,
|
||||||
Ui => self.props.pass_mode.is_some(),
|
Ui => self.pass_mode().is_some(),
|
||||||
Incremental => {
|
Incremental => {
|
||||||
let revision = self.revision
|
let revision = self.revision
|
||||||
.expect("incremental tests require a list of revisions");
|
.expect("incremental tests require a list of revisions");
|
||||||
|
@ -330,7 +337,7 @@ impl<'test> TestCx<'test> {
|
||||||
true
|
true
|
||||||
} else if revision.starts_with("cfail") {
|
} else if revision.starts_with("cfail") {
|
||||||
// FIXME: would be nice if incremental revs could start with "cpass"
|
// FIXME: would be nice if incremental revs could start with "cpass"
|
||||||
self.props.pass_mode.is_some()
|
self.pass_mode().is_some()
|
||||||
} else {
|
} else {
|
||||||
panic!("revision name must begin with rpass, rfail, or cfail");
|
panic!("revision name must begin with rpass, rfail, or cfail");
|
||||||
}
|
}
|
||||||
|
@ -1341,7 +1348,7 @@ impl<'test> TestCx<'test> {
|
||||||
fn check_error_patterns(&self, output_to_check: &str, proc_res: &ProcRes) {
|
fn check_error_patterns(&self, output_to_check: &str, proc_res: &ProcRes) {
|
||||||
debug!("check_error_patterns");
|
debug!("check_error_patterns");
|
||||||
if self.props.error_patterns.is_empty() {
|
if self.props.error_patterns.is_empty() {
|
||||||
if self.props.pass_mode.is_some() {
|
if self.pass_mode().is_some() {
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
self.fatal(&format!(
|
self.fatal(&format!(
|
||||||
|
@ -1871,7 +1878,11 @@ impl<'test> TestCx<'test> {
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_compile_args(&self, input_file: &Path, output_file: TargetLocation) -> Command {
|
fn make_compile_args(
|
||||||
|
&self,
|
||||||
|
input_file: &Path,
|
||||||
|
output_file: TargetLocation,
|
||||||
|
) -> Command {
|
||||||
let is_rustdoc = self.config.src_base.ends_with("rustdoc-ui") ||
|
let is_rustdoc = self.config.src_base.ends_with("rustdoc-ui") ||
|
||||||
self.config.src_base.ends_with("rustdoc-js");
|
self.config.src_base.ends_with("rustdoc-js");
|
||||||
let mut rustc = if !is_rustdoc {
|
let mut rustc = if !is_rustdoc {
|
||||||
|
@ -1968,14 +1979,7 @@ impl<'test> TestCx<'test> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.props.pass_mode == Some(PassMode::Check) {
|
if let Some(PassMode::Check) = self.pass_mode() {
|
||||||
assert!(
|
|
||||||
!self
|
|
||||||
.props
|
|
||||||
.compile_flags
|
|
||||||
.iter()
|
|
||||||
.any(|s| s.starts_with("--emit"))
|
|
||||||
);
|
|
||||||
rustc.args(&["--emit", "metadata"]);
|
rustc.args(&["--emit", "metadata"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue