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,
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",
--- /dev/null
+// 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
+}
--- /dev/null
+// 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
+}
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
// 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()>) {
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`
--- /dev/null
+// 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() {}
// 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]
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;
| ---------^^^^^^^^^^^^^^^^
--- /dev/null
+// 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]
// 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]
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
--- /dev/null
+// 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]
+}
// 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 {
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);
| ^^^^^^^^^^^^^^^
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);
| ^^^^^^^^^^^^^^
--- /dev/null
+// 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
+ };
+}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+// run-rustfix
+
fn main() {
match &Some(3) {
&None => 1
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
--- /dev/null
+// 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
+}
// 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
error: character literal may only contain one codepoint
- --> $DIR/str-as-char.rs:12:14
+ --> $DIR/str-as-char.rs:14:14
|
LL | println!('●●');
| ^^^^
--- /dev/null
+// 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`
+}
// option. This file may not be copied, modified, or distributed
// except according to those terms.
+// run-rustfix
// compile-flags: -Z parse-only
fn main () {
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`
| ------------^^^
echo " $0 ../../../build/x86_64-apple-darwin/test/ui *.rs */*.rs"
fi
-MYDIR=$(dirname $0)
BUILD_DIR="$1"
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
RunMake,
Ui,
MirOpt,
- Rustfix,
}
impl Mode {
"run-make" => Ok(RunMake),
"ui" => Ok(Ui),
"mir-opt" => Ok(MirOpt),
- "rustfix" => Ok(Rustfix),
_ => Err(()),
}
}
RunMake => "run-make",
Ui => "ui",
MirOpt => "mir-opt",
- Rustfix => "rustfix",
};
fmt::Display::fmt(s, f)
}
pub normalize_stdout: Vec<(String, String)>,
pub normalize_stderr: Vec<(String, String)>,
pub failure_status: i32,
+ pub run_rustfix: bool,
}
impl TestProps {
normalize_stdout: vec![],
normalize_stderr: vec![],
failure_status: 101,
+ run_rustfix: false,
}
}
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"] {
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 {
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;
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(),
}
rustc.arg(dir_opt);
}
- Rustfix |
RunPass |
RunFail |
RunPassValgrind |
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);
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
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) {
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 {