From 5dc276c0da0a79bb84e3b67db677da29db989d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=9D=B0=E5=8F=8B=20Jieyou=20Xu=20=28Joe=29?= Date: Sun, 7 Apr 2024 16:33:56 +0000 Subject: [PATCH 1/2] compiletest: properly handle revisioned run-rustfix tests --- src/tools/compiletest/src/runtest.rs | 22 ++++++++++++++++++- .../run-rustfix-revisions.foo.fixed | 9 ++++++++ .../run-rustfix-revisions.foo.stderr | 14 ++++++++++++ .../run-rustfix-revisions.rs | 9 ++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/ui/compiletest-self-test/run-rustfix-revisions.foo.fixed create mode 100644 tests/ui/compiletest-self-test/run-rustfix-revisions.foo.stderr create mode 100644 tests/ui/compiletest-self-test/run-rustfix-revisions.rs diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index 689fdc5dfebc0..bb8509fe41377 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -4252,7 +4252,7 @@ impl<'test> TestCx<'test> { if self.props.run_rustfix && self.config.compare_mode.is_none() { // And finally, compile the fixed code and make sure it both // succeeds and has no diagnostics. - let rustc = self.make_compile_args( + let mut rustc = self.make_compile_args( &self.expected_output_path(UI_FIXED), TargetLocation::ThisFile(self.make_exe_name()), emit_metadata, @@ -4260,6 +4260,26 @@ impl<'test> TestCx<'test> { LinkToAux::Yes, 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); if !res.status.success() { self.fatal_proc_rec("failed to compile fixed code", &res); diff --git a/tests/ui/compiletest-self-test/run-rustfix-revisions.foo.fixed b/tests/ui/compiletest-self-test/run-rustfix-revisions.foo.fixed new file mode 100644 index 0000000000000..0fa6ac1dd993c --- /dev/null +++ b/tests/ui/compiletest-self-test/run-rustfix-revisions.foo.fixed @@ -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` +} diff --git a/tests/ui/compiletest-self-test/run-rustfix-revisions.foo.stderr b/tests/ui/compiletest-self-test/run-rustfix-revisions.foo.stderr new file mode 100644 index 0000000000000..74384ef24af18 --- /dev/null +++ b/tests/ui/compiletest-self-test/run-rustfix-revisions.foo.stderr @@ -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 + diff --git a/tests/ui/compiletest-self-test/run-rustfix-revisions.rs b/tests/ui/compiletest-self-test/run-rustfix-revisions.rs new file mode 100644 index 0000000000000..84c5b7a2d0a89 --- /dev/null +++ b/tests/ui/compiletest-self-test/run-rustfix-revisions.rs @@ -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` +} From de3857e553b0bfaff2a6bc42a03fc9c8df9f777b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=9D=B0=E5=8F=8B=20Jieyou=20Xu=20=28Joe=29?= Date: Sun, 7 Apr 2024 16:36:44 +0000 Subject: [PATCH 2/2] tests/ui: remove workaround for broken revisioned run-rustfix test --- .../ui/object-safety/bare-trait-dont-suggest-dyn.new.fixed | 2 -- .../ui/object-safety/bare-trait-dont-suggest-dyn.new.stderr | 2 +- .../ui/object-safety/bare-trait-dont-suggest-dyn.old.stderr | 6 +++--- tests/ui/object-safety/bare-trait-dont-suggest-dyn.rs | 2 -- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/ui/object-safety/bare-trait-dont-suggest-dyn.new.fixed b/tests/ui/object-safety/bare-trait-dont-suggest-dyn.new.fixed index aee05f5e51211..4f5310082e18d 100644 --- a/tests/ui/object-safety/bare-trait-dont-suggest-dyn.new.fixed +++ b/tests/ui/object-safety/bare-trait-dont-suggest-dyn.new.fixed @@ -2,8 +2,6 @@ //@[old] edition:2015 //@[new] edition:2021 //@[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)] fn ord_prefer_dot(s: String) -> impl Ord { //~^ ERROR the trait `Ord` cannot be made into an object diff --git a/tests/ui/object-safety/bare-trait-dont-suggest-dyn.new.stderr b/tests/ui/object-safety/bare-trait-dont-suggest-dyn.new.stderr index 52db31d620c3d..efddab6dff63d 100644 --- a/tests/ui/object-safety/bare-trait-dont-suggest-dyn.new.stderr +++ b/tests/ui/object-safety/bare-trait-dont-suggest-dyn.new.stderr @@ -1,5 +1,5 @@ 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 { | ^^^ `Ord` cannot be made into an object diff --git a/tests/ui/object-safety/bare-trait-dont-suggest-dyn.old.stderr b/tests/ui/object-safety/bare-trait-dont-suggest-dyn.old.stderr index f795e910d2152..0545a1afcc143 100644 --- a/tests/ui/object-safety/bare-trait-dont-suggest-dyn.old.stderr +++ b/tests/ui/object-safety/bare-trait-dont-suggest-dyn.old.stderr @@ -1,5 +1,5 @@ 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 { | ^^^ @@ -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! = note: for more information, see 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)] | ^^^^^^^^^^^^^^^^^^ @@ -17,7 +17,7 @@ LL | fn ord_prefer_dot(s: String) -> dyn Ord { | +++ 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 { | ^^^ `Ord` cannot be made into an object diff --git a/tests/ui/object-safety/bare-trait-dont-suggest-dyn.rs b/tests/ui/object-safety/bare-trait-dont-suggest-dyn.rs index e927b510b9da8..cb5a305eab087 100644 --- a/tests/ui/object-safety/bare-trait-dont-suggest-dyn.rs +++ b/tests/ui/object-safety/bare-trait-dont-suggest-dyn.rs @@ -2,8 +2,6 @@ //@[old] edition:2015 //@[new] edition:2021 //@[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)] fn ord_prefer_dot(s: String) -> Ord { //~^ ERROR the trait `Ord` cannot be made into an object