Fold rustfix tests back into the UI test suite

This commit is contained in:
Alex Crichton 2018-05-03 11:26:58 -07:00
parent a563027cb8
commit 6f2d023028
29 changed files with 223 additions and 80 deletions

View file

@ -326,7 +326,7 @@ impl<'a> Builder<'a> {
test::TheBook, test::UnstableBook, test::RustcBook,
test::Rustfmt, test::Miri, test::Clippy, test::RustdocJS, test::RustdocTheme,
// Run run-make last, since these won't pass without make on Windows
test::RunMake, test::RustdocUi, test::Rustfix),
test::RunMake, test::RustdocUi),
Kind::Bench => describe!(test::Crate, test::CrateLibrustc),
Kind::Doc => describe!(doc::UnstableBook, doc::UnstableBookGen, doc::TheBook,
doc::Standalone, doc::Std, doc::Test, doc::WhitelistedRustc, doc::Rustc,

View file

@ -716,12 +716,6 @@ default_test!(RunFail {
suite: "run-fail"
});
default_test!(Rustfix {
path: "src/test/rustfix",
mode: "rustfix",
suite: "rustfix"
});
default_test!(RunPassValgrind {
path: "src/test/run-pass-valgrind",
mode: "run-pass-valgrind",

View file

@ -0,0 +1,22 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
// Point at the captured immutable outer variable
fn foo(mut f: Box<FnMut()>) {
f();
}
fn main() {
let mut y = true;
foo(Box::new(move || y = false) as Box<_>); //~ ERROR cannot assign to captured outer variable
}

View file

@ -0,0 +1,22 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
// Point at the captured immutable outer variable
fn foo(mut f: Box<FnMut()>) {
f();
}
fn main() {
let y = true;
foo(Box::new(move || y = false) as Box<_>); //~ ERROR cannot assign to captured outer variable
}

View file

@ -1,5 +1,5 @@
error[E0594]: cannot assign to immutable item `y`
--> $DIR/closure-immutable-outer-variable.rs:19:26
--> $DIR/closure-immutable-outer-variable.rs:21:26
|
LL | foo(Box::new(move || y = false) as Box<_>); //~ ERROR cannot assign to captured outer variable
| ^^^^^^^^^ cannot mutate

View file

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
// Point at the captured immutable outer variable
fn foo(mut f: Box<FnMut()>) {

View file

@ -1,5 +1,5 @@
error[E0594]: cannot assign to captured outer variable in an `FnMut` closure
--> $DIR/closure-immutable-outer-variable.rs:19:26
--> $DIR/closure-immutable-outer-variable.rs:21:26
|
LL | let y = true;
| - help: consider making `y` mutable: `mut y`

View file

@ -0,0 +1,16 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#[no_mangle] pub static RAH: usize = 5;
//~^ ERROR const items should never be #[no_mangle]
fn main() {}

View file

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#[no_mangle] pub const RAH: usize = 5;
//~^ ERROR const items should never be #[no_mangle]

View file

@ -1,5 +1,5 @@
error: const items should never be #[no_mangle]
--> $DIR/issue-45562.rs:11:14
--> $DIR/issue-45562.rs:13:14
|
LL | #[no_mangle] pub const RAH: usize = 5;
| ---------^^^^^^^^^^^^^^^^

View file

@ -0,0 +1,15 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
extern crate std as other_std;
fn main() {}
//~^^ ERROR the name `std` is defined multiple times [E0259]

View file

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
extern crate std;
fn main() {}
//~^^ ERROR the name `std` is defined multiple times [E0259]

View file

@ -1,5 +1,5 @@
error[E0259]: the name `std` is defined multiple times
--> $DIR/issue-45799-bad-extern-crate-rename-suggestion-formatting.rs:11:1
--> $DIR/issue-45799-bad-extern-crate-rename-suggestion-formatting.rs:13:1
|
LL | extern crate std;
| ^^^^^^^^^^^^^^^^^ `std` reimported here

View file

@ -0,0 +1,26 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#![allow(unused)]
fn light_flows_our_war_of_mocking_words(and_yet: &usize) -> usize {
and_yet + 1
}
fn main() {
let behold: isize = 2;
let with_tears: usize = 3;
light_flows_our_war_of_mocking_words(&(behold as usize));
//~^ ERROR mismatched types [E0308]
light_flows_our_war_of_mocking_words(&(with_tears + 4));
//~^ ERROR mismatched types [E0308]
}

View file

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#![allow(unused)]
fn light_flows_our_war_of_mocking_words(and_yet: &usize) -> usize {

View file

@ -1,5 +1,5 @@
error[E0308]: mismatched types
--> $DIR/issue-46756-consider-borrowing-cast-or-binexpr.rs:20:42
--> $DIR/issue-46756-consider-borrowing-cast-or-binexpr.rs:22:42
|
LL | light_flows_our_war_of_mocking_words(behold as usize);
| ^^^^^^^^^^^^^^^
@ -11,7 +11,7 @@ LL | light_flows_our_war_of_mocking_words(behold as usize);
found type `usize`
error[E0308]: mismatched types
--> $DIR/issue-46756-consider-borrowing-cast-or-binexpr.rs:22:42
--> $DIR/issue-46756-consider-borrowing-cast-or-binexpr.rs:24:42
|
LL | light_flows_our_war_of_mocking_words(with_tears + 4);
| ^^^^^^^^^^^^^^

View file

@ -0,0 +1,21 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
fn main() {
match &Some(3) {
&None => 1,
&Some(2) => { 3 }
//~^ ERROR expected one of `,`, `.`, `?`, `}`, or an operator, found `=>`
//~| NOTE expected one of `,`, `.`, `?`, `}`, or an operator here
_ => 2
};
}

View file

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
fn main() {
match &Some(3) {
&None => 1

View file

@ -1,5 +1,5 @@
error: expected one of `,`, `.`, `?`, `}`, or an operator, found `=>`
--> $DIR/missing-comma-in-match.rs:14:18
--> $DIR/missing-comma-in-match.rs:16:18
|
LL | &None => 1
| - help: missing a comma here to end this `match` arm

View file

@ -0,0 +1,16 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
fn main() {
println!("●●");
//~^ ERROR character literal may only contain one codepoint
}

View file

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
fn main() {
println!('');
//~^ ERROR character literal may only contain one codepoint

View file

@ -1,5 +1,5 @@
error: character literal may only contain one codepoint
--> $DIR/str-as-char.rs:12:14
--> $DIR/str-as-char.rs:14:14
|
LL | println!('●●');
| ^^^^

View file

@ -0,0 +1,16 @@
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
// compile-flags: -Z parse-only
fn main () {
((1, (2, 3)).1).1; //~ ERROR unexpected token: `1.1`
}

View file

@ -8,6 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
// compile-flags: -Z parse-only
fn main () {

View file

@ -1,5 +1,5 @@
error: unexpected token: `1.1`
--> $DIR/tuple-float-index.rs:14:17
--> $DIR/tuple-float-index.rs:15:17
|
LL | (1, (2, 3)).1.1; //~ ERROR unexpected token: `1.1`
| ------------^^^

View file

@ -26,7 +26,6 @@ if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" || "$2" == "" ]]; then
echo " $0 ../../../build/x86_64-apple-darwin/test/ui *.rs */*.rs"
fi
MYDIR=$(dirname $0)
BUILD_DIR="$1"
shift
@ -34,7 +33,8 @@ shift
shopt -s nullglob
while [[ "$1" != "" ]]; do
for EXT in "stderr" "stdout"; do
MYDIR=$(dirname $1)
for EXT in "stderr" "stdout" "fixed"; do
for OUT_NAME in $BUILD_DIR/${1%.rs}.*$EXT; do
OUT_BASE=`basename "$OUT_NAME"`
if ! (diff $OUT_NAME $MYDIR/$OUT_BASE >& /dev/null); then

View file

@ -32,7 +32,6 @@ pub enum Mode {
RunMake,
Ui,
MirOpt,
Rustfix,
}
impl Mode {
@ -68,7 +67,6 @@ impl FromStr for Mode {
"run-make" => Ok(RunMake),
"ui" => Ok(Ui),
"mir-opt" => Ok(MirOpt),
"rustfix" => Ok(Rustfix),
_ => Err(()),
}
}
@ -92,7 +90,6 @@ impl fmt::Display for Mode {
RunMake => "run-make",
Ui => "ui",
MirOpt => "mir-opt",
Rustfix => "rustfix",
};
fmt::Display::fmt(s, f)
}

View file

@ -236,6 +236,7 @@ pub struct TestProps {
pub normalize_stdout: Vec<(String, String)>,
pub normalize_stderr: Vec<(String, String)>,
pub failure_status: i32,
pub run_rustfix: bool,
}
impl TestProps {
@ -267,6 +268,7 @@ impl TestProps {
normalize_stdout: vec![],
normalize_stderr: vec![],
failure_status: 101,
run_rustfix: false,
}
}
@ -403,6 +405,10 @@ impl TestProps {
if let Some(code) = config.parse_failure_status(ln) {
self.failure_status = code;
}
if !self.run_rustfix {
self.run_rustfix = config.parse_run_rustfix(ln);
}
});
for key in &["RUST_TEST_NOCAPTURE", "RUST_TEST_THREADS"] {
@ -642,6 +648,10 @@ impl Config {
None
}
fn parse_run_rustfix(&self, line: &str) -> bool {
self.parse_name_directive(line, "run-rustfix")
}
}
pub fn lldb_version_to_int(version_string: &str) -> isize {

View file

@ -11,7 +11,7 @@
use common::{Config, TestPaths};
use common::{CompileFail, ParseFail, Pretty, RunFail, RunPass, RunPassValgrind};
use common::{Codegen, CodegenUnits, DebugInfoGdb, DebugInfoLldb, Rustdoc};
use common::{Incremental, MirOpt, RunMake, Ui, Rustfix};
use common::{Incremental, MirOpt, RunMake, Ui};
use common::{expected_output_path, UI_STDERR, UI_STDOUT, UI_FIXED};
use common::CompareMode;
use diff;
@ -242,7 +242,6 @@ impl<'test> TestCx<'test> {
CodegenUnits => self.run_codegen_units_test(),
Incremental => self.run_incremental_test(),
RunMake => self.run_rmake_test(),
Rustfix => self.run_rustfix_test(),
Ui => self.run_ui_test(),
MirOpt => self.run_mir_opt_test(),
}
@ -1689,7 +1688,6 @@ impl<'test> TestCx<'test> {
rustc.arg(dir_opt);
}
Rustfix |
RunPass |
RunFail |
RunPassValgrind |
@ -2555,6 +2553,7 @@ impl<'test> TestCx<'test> {
let expected_stderr = self.load_expected_output(UI_STDERR);
let expected_stdout = self.load_expected_output(UI_STDOUT);
let expected_fixed = self.load_expected_output(UI_FIXED);
let normalized_stdout =
self.normalize_output(&proc_res.stdout, &self.props.normalize_stdout);
@ -2571,6 +2570,21 @@ impl<'test> TestCx<'test> {
errors += self.compare_output("stdout", &normalized_stdout, &expected_stdout);
errors += self.compare_output("stderr", &normalized_stderr, &expected_stderr);
if self.config.compare_mode.is_some() {
// don't test rustfix with nll right now
} else if self.props.run_rustfix {
// Apply suggestions from rustc to the code itself
let unfixed_code = self.load_expected_output_from_path(&self.testpaths.file)
.unwrap();
let suggestions = get_suggestions_from_json(&proc_res.stderr, &HashSet::new()).unwrap();
let fixed_code = apply_suggestions(&unfixed_code, &suggestions);
errors += self.compare_output("fixed", &fixed_code, &expected_fixed);
} else if !expected_fixed.is_empty() {
panic!("the `// run-rustfix` directive wasn't found but a `*.fixed` \
file was found");
}
if errors > 0 {
println!("To update references, run this command from build directory:");
let relative_path_to_file = self.testpaths
@ -2606,6 +2620,23 @@ impl<'test> TestCx<'test> {
self.check_error_patterns(&proc_res.stderr, &proc_res);
}
}
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 mut rustc = self.make_compile_args(
&self.testpaths.file.with_extension(UI_FIXED),
TargetLocation::ThisFile(self.make_exe_name()),
);
rustc.arg("-L").arg(&self.aux_output_dir_name());
let res = self.compose_and_run_compiler(rustc, None);
if !res.status.success() {
self.fatal_proc_rec("failed to compile fixed code", &res);
}
if !res.stderr.is_empty() {
self.fatal_proc_rec("fixed code is still producing diagnostics", &res);
}
}
}
fn run_mir_opt_test(&self) {
@ -2930,62 +2961,6 @@ impl<'test> TestCx<'test> {
println!("Actual {} saved to {}", kind, output_file.display());
1
}
fn run_rustfix_test(&self) {
// First up, compile the test with --error-format=json
let mut rustc = self.make_compile_args(
&self.testpaths.file,
TargetLocation::ThisFile(self.make_exe_name()),
);
rustc.arg("--error-format").arg("json")
.arg("-L").arg(&self.aux_output_dir_name());
let proc_res = self.compose_and_run_compiler(rustc, None);
// Now apply suggestions from rustc to the code itself
let unfixed_code = self.load_expected_output_from_path(&self.testpaths.file)
.unwrap();
let suggestions = get_suggestions_from_json(&proc_res.stderr, &HashSet::new()).unwrap();
let fixed_code = apply_suggestions(&unfixed_code, &suggestions);
// Load up what the expected result of fixing should be
let fixture_path = expected_output_path(&self.testpaths, None, &None, UI_FIXED);
let expected_fixed = self.load_expected_output_from_path(&fixture_path)
.unwrap_or(String::new());
// Make sure our fixed code is the same as what we're expecting
let errors = self.compare_output(UI_FIXED, &fixed_code, &expected_fixed);
if errors > 0 {
println!("To update references, run this command from build directory:");
let relative_path_to_file = self.testpaths
.relative_dir
.join(self.testpaths.file.file_name().unwrap());
println!(
"{}/update-references.sh '{}' '{}'",
self.config.src_base.display(),
self.config.build_base.display(),
relative_path_to_file.display()
);
self.fatal_proc_rec(
&format!("{} errors occurred comparing output.", errors),
&proc_res,
);
}
// And finally, compile the fixed code and make sure it both succeeds
// and has no diagnostics.
let mut rustc = self.make_compile_args(
&self.testpaths.file.with_extension(UI_FIXED),
TargetLocation::ThisFile(self.make_exe_name()),
);
rustc.arg("-L").arg(&self.aux_output_dir_name());
let res = self.compose_and_run_compiler(rustc, None);
if !res.status.success() {
self.fatal_proc_rec("failed to compile fixed code", &res);
}
if !res.stderr.is_empty() {
self.fatal_proc_rec("fixed code is still producing diagnostics", &res);
}
}
}
struct ProcArgs {