diff --git a/src/compiletest/header.rs b/src/compiletest/header.rs index 2413a001ee8..374fd2e3ef0 100644 --- a/src/compiletest/header.rs +++ b/src/compiletest/header.rs @@ -42,6 +42,8 @@ pub struct TestProps { pub pretty_compare_only: bool, // Patterns which must not appear in the output of a cfail test. pub forbid_output: Vec, + // Ignore errors which originate from a command line span + pub ignore_command_line: bool, } // Load any test directives embedded in the file @@ -60,6 +62,8 @@ pub fn load_props(testfile: &Path) -> TestProps { let mut pretty_mode = None; let mut pretty_compare_only = false; let mut forbid_output = Vec::new(); + let mut ignore_command_line = false; + iter_header(testfile, |ln| { match parse_error_pattern(ln) { Some(ep) => error_patterns.push(ep), @@ -102,6 +106,10 @@ pub fn load_props(testfile: &Path) -> TestProps { pretty_compare_only = parse_pretty_compare_only(ln); } + if !ignore_command_line { + ignore_command_line = parse_ignore_command_line(ln); + } + match parse_aux_build(ln) { Some(ab) => { aux_builds.push(ab); } None => {} @@ -140,6 +148,7 @@ pub fn load_props(testfile: &Path) -> TestProps { pretty_mode: pretty_mode.unwrap_or("normal".to_string()), pretty_compare_only: pretty_compare_only, forbid_output: forbid_output, + ignore_command_line: ignore_command_line, } } @@ -291,6 +300,10 @@ fn parse_pretty_compare_only(line: &str) -> bool { parse_name_directive(line, "pretty-compare-only") } +fn parse_ignore_command_line(line: &str) -> bool { + parse_name_directive(line, "ignore-command-line") +} + fn parse_exec_env(line: &str) -> Option<(String, String)> { parse_name_value_directive(line, "exec-env").map(|nv| { // nv is either FOO or FOO=BAR diff --git a/src/compiletest/runtest.rs b/src/compiletest/runtest.rs index 5de93c52029..a97d4913440 100644 --- a/src/compiletest/runtest.rs +++ b/src/compiletest/runtest.rs @@ -104,7 +104,7 @@ fn run_cfail_test(config: &Config, props: &TestProps, testfile: &Path) { if !props.error_patterns.is_empty() { fatal("both error pattern and expected errors specified"); } - check_expected_errors(expected_errors, testfile, &proc_res); + check_expected_errors(props, expected_errors, testfile, &proc_res); } else { check_error_patterns(props, testfile, output_to_check.as_slice(), &proc_res); } @@ -941,7 +941,8 @@ fn check_forbid_output(props: &TestProps, } } -fn check_expected_errors(expected_errors: Vec , +fn check_expected_errors(props: &TestProps, + expected_errors: Vec , testfile: &Path, proc_res: &ProcRes) { @@ -996,6 +997,11 @@ fn check_expected_errors(expected_errors: Vec , was_expected = true; } + if line.starts_with("") && + props.ignore_command_line { + was_expected = true; + } + if !was_expected && is_compiler_error_or_warning(line) { fatal_proc_rec(format!("unexpected compiler error or warning: '{}'", line).as_slice(), diff --git a/src/test/compile-fail/recursion.rs b/src/test/compile-fail/recursion.rs index da05514f763..de326677c86 100644 --- a/src/test/compile-fail/recursion.rs +++ b/src/test/compile-fail/recursion.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -//~^^^^^^^^^^ ERROR overflow +// ignore-command-line: See https://github.com/rust-lang/rust/issues/20747 // // We also get a second error message at the top of file (dummy // span). This is not helpful, but also kind of annoying to prevent,