Auto merge of #123601 - jieyouxu:compiletest-run-rustfix-revisions, r=WaffleLapkin
compiletest: properly handle revisioned run-rustfix tests Before this PR, if you have a revisioned `//@ run-rustfix` test like `//`@[foo]` run-rustfix`, you would run into an error saying crate name cannot contain `.` characters because the fixed test file trying to be compiled is named `<test-name>.<revision>.fixed`, from which `rustc` infers the crate name to be `<test-name>.<revision>` which is not a valid crate name. This PR fixes the problem by constructing a synthetic crate name from `<test-name>.<revision>`, by 1. replacing all `-` with `_`, and 2. replacing all `.` with `__` and pass that constructed crate name with `--crate-name` to rustc to compile the fixed file. Fixes https://github.com/rust-lang/rust/issues/123596.
This commit is contained in:
commit
9d5cdf75aa
@ -4252,7 +4252,7 @@ fn run_ui_test(&self) {
|
|||||||
if self.props.run_rustfix && self.config.compare_mode.is_none() {
|
if self.props.run_rustfix && self.config.compare_mode.is_none() {
|
||||||
// And finally, compile the fixed code and make sure it both
|
// And finally, compile the fixed code and make sure it both
|
||||||
// succeeds and has no diagnostics.
|
// succeeds and has no diagnostics.
|
||||||
let rustc = self.make_compile_args(
|
let mut rustc = self.make_compile_args(
|
||||||
&self.expected_output_path(UI_FIXED),
|
&self.expected_output_path(UI_FIXED),
|
||||||
TargetLocation::ThisFile(self.make_exe_name()),
|
TargetLocation::ThisFile(self.make_exe_name()),
|
||||||
emit_metadata,
|
emit_metadata,
|
||||||
@ -4260,6 +4260,26 @@ fn run_ui_test(&self) {
|
|||||||
LinkToAux::Yes,
|
LinkToAux::Yes,
|
||||||
Vec::new(),
|
Vec::new(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// If a test is revisioned, it's fixed source file can be named "a.foo.fixed", which,
|
||||||
|
// well, "a.foo" isn't a valid crate name. So we explicitly mangle the test name
|
||||||
|
// (including the revision) here to avoid the test writer having to manually specify a
|
||||||
|
// `#![crate_name = "..."]` as a workaround. This is okay since we're only checking if
|
||||||
|
// the fixed code is compilable.
|
||||||
|
if self.revision.is_some() {
|
||||||
|
let crate_name =
|
||||||
|
self.testpaths.file.file_stem().expect("test must have a file stem");
|
||||||
|
// crate name must be alphanumeric or `_`.
|
||||||
|
let crate_name =
|
||||||
|
crate_name.to_str().expect("crate name implies file name must be valid UTF-8");
|
||||||
|
// replace `a.foo` -> `a__foo` for crate name purposes.
|
||||||
|
// replace `revision-name-with-dashes` -> `revision_name_with_underscore`
|
||||||
|
let crate_name = crate_name.replace(".", "__");
|
||||||
|
let crate_name = crate_name.replace("-", "_");
|
||||||
|
rustc.arg("--crate-name");
|
||||||
|
rustc.arg(crate_name);
|
||||||
|
}
|
||||||
|
|
||||||
let res = self.compose_and_run_compiler(rustc, None);
|
let res = self.compose_and_run_compiler(rustc, None);
|
||||||
if !res.status.success() {
|
if !res.status.success() {
|
||||||
self.fatal_proc_rec("failed to compile fixed code", &res);
|
self.fatal_proc_rec("failed to compile fixed code", &res);
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
// Check that revisioned `run-rustfix` does not fail with issues related to `.` in crate name.
|
||||||
|
//@ revisions: foo
|
||||||
|
//@[foo] run-rustfix
|
||||||
|
#![deny(unused_variables)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _x = 0usize;
|
||||||
|
//~^ ERROR unused variable: `x`
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
error: unused variable: `x`
|
||||||
|
--> $DIR/run-rustfix-revisions.rs:7:9
|
||||||
|
|
|
||||||
|
LL | let x = 0usize;
|
||||||
|
| ^ help: if this is intentional, prefix it with an underscore: `_x`
|
||||||
|
|
|
||||||
|
note: the lint level is defined here
|
||||||
|
--> $DIR/run-rustfix-revisions.rs:4:9
|
||||||
|
|
|
||||||
|
LL | #![deny(unused_variables)]
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
9
tests/ui/compiletest-self-test/run-rustfix-revisions.rs
Normal file
9
tests/ui/compiletest-self-test/run-rustfix-revisions.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// Check that revisioned `run-rustfix` does not fail with issues related to `.` in crate name.
|
||||||
|
//@ revisions: foo
|
||||||
|
//@[foo] run-rustfix
|
||||||
|
#![deny(unused_variables)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x = 0usize;
|
||||||
|
//~^ ERROR unused variable: `x`
|
||||||
|
}
|
@ -2,8 +2,6 @@
|
|||||||
//@[old] edition:2015
|
//@[old] edition:2015
|
||||||
//@[new] edition:2021
|
//@[new] edition:2021
|
||||||
//@[new] run-rustfix
|
//@[new] run-rustfix
|
||||||
// FIXME: the test suite tries to create a crate called `bare_trait_dont_suggest_dyn.new`
|
|
||||||
#![crate_name="bare_trait_dont_suggest_dyn"]
|
|
||||||
#![deny(bare_trait_objects)]
|
#![deny(bare_trait_objects)]
|
||||||
fn ord_prefer_dot(s: String) -> impl Ord {
|
fn ord_prefer_dot(s: String) -> impl Ord {
|
||||||
//~^ ERROR the trait `Ord` cannot be made into an object
|
//~^ ERROR the trait `Ord` cannot be made into an object
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0038]: the trait `Ord` cannot be made into an object
|
error[E0038]: the trait `Ord` cannot be made into an object
|
||||||
--> $DIR/bare-trait-dont-suggest-dyn.rs:8:33
|
--> $DIR/bare-trait-dont-suggest-dyn.rs:6:33
|
||||||
|
|
|
|
||||||
LL | fn ord_prefer_dot(s: String) -> Ord {
|
LL | fn ord_prefer_dot(s: String) -> Ord {
|
||||||
| ^^^ `Ord` cannot be made into an object
|
| ^^^ `Ord` cannot be made into an object
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error: trait objects without an explicit `dyn` are deprecated
|
error: trait objects without an explicit `dyn` are deprecated
|
||||||
--> $DIR/bare-trait-dont-suggest-dyn.rs:8:33
|
--> $DIR/bare-trait-dont-suggest-dyn.rs:6:33
|
||||||
|
|
|
|
||||||
LL | fn ord_prefer_dot(s: String) -> Ord {
|
LL | fn ord_prefer_dot(s: String) -> Ord {
|
||||||
| ^^^
|
| ^^^
|
||||||
@ -7,7 +7,7 @@ LL | fn ord_prefer_dot(s: String) -> Ord {
|
|||||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||||
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
|
||||||
note: the lint level is defined here
|
note: the lint level is defined here
|
||||||
--> $DIR/bare-trait-dont-suggest-dyn.rs:7:9
|
--> $DIR/bare-trait-dont-suggest-dyn.rs:5:9
|
||||||
|
|
|
|
||||||
LL | #![deny(bare_trait_objects)]
|
LL | #![deny(bare_trait_objects)]
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
@ -17,7 +17,7 @@ LL | fn ord_prefer_dot(s: String) -> dyn Ord {
|
|||||||
| +++
|
| +++
|
||||||
|
|
||||||
error[E0038]: the trait `Ord` cannot be made into an object
|
error[E0038]: the trait `Ord` cannot be made into an object
|
||||||
--> $DIR/bare-trait-dont-suggest-dyn.rs:8:33
|
--> $DIR/bare-trait-dont-suggest-dyn.rs:6:33
|
||||||
|
|
|
|
||||||
LL | fn ord_prefer_dot(s: String) -> Ord {
|
LL | fn ord_prefer_dot(s: String) -> Ord {
|
||||||
| ^^^ `Ord` cannot be made into an object
|
| ^^^ `Ord` cannot be made into an object
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
//@[old] edition:2015
|
//@[old] edition:2015
|
||||||
//@[new] edition:2021
|
//@[new] edition:2021
|
||||||
//@[new] run-rustfix
|
//@[new] run-rustfix
|
||||||
// FIXME: the test suite tries to create a crate called `bare_trait_dont_suggest_dyn.new`
|
|
||||||
#![crate_name="bare_trait_dont_suggest_dyn"]
|
|
||||||
#![deny(bare_trait_objects)]
|
#![deny(bare_trait_objects)]
|
||||||
fn ord_prefer_dot(s: String) -> Ord {
|
fn ord_prefer_dot(s: String) -> Ord {
|
||||||
//~^ ERROR the trait `Ord` cannot be made into an object
|
//~^ ERROR the trait `Ord` cannot be made into an object
|
||||||
|
Loading…
Reference in New Issue
Block a user