diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-11-20 18:32:04 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-11-20 18:32:04 +0100 |
| commit | e32397a75404d3e23701a727ebba753e391c1471 (patch) | |
| tree | e0b1b353d1b6e6d185d96780fc85e92725ab8b57 /src/tools/compiletest | |
| parent | b9cf5417892ef242c783ef963deff5436205b0f6 (diff) | |
| parent | e01d9415e26dfcdd31c182bec21049502f5477ff (diff) | |
Rollup merge of #66060 - traxys:test_65401, r=michaelwoerister
Making ICEs and test them in incremental This adds: - A way to make the compiler ICE - A way to check for ICE in `cfail` tests with `should-ice` - A regression test for issue #65401 I am not sure the attribute added `should-ice` is the best for this job
Diffstat (limited to 'src/tools/compiletest')
| -rw-r--r-- | src/tools/compiletest/src/header.rs | 13 | ||||
| -rw-r--r-- | src/tools/compiletest/src/runtest.rs | 28 |
2 files changed, 37 insertions, 4 deletions
diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index d750595e272..dc4811e5d24 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -375,6 +375,8 @@ pub struct TestProps { // If true, `rustfix` will only apply `MachineApplicable` suggestions. pub rustfix_only_machine_applicable: bool, pub assembly_output: Option<String>, + // If true, the test is expected to ICE + pub should_ice: bool, } impl TestProps { @@ -413,6 +415,7 @@ impl TestProps { run_rustfix: false, rustfix_only_machine_applicable: false, assembly_output: None, + should_ice: false, } } @@ -463,6 +466,10 @@ impl TestProps { self.pp_exact = config.parse_pp_exact(ln, testfile); } + if !self.should_ice { + self.should_ice = config.parse_should_ice(ln); + } + if !self.build_aux_docs { self.build_aux_docs = config.parse_build_aux_docs(ln); } @@ -577,6 +584,9 @@ impl TestProps { _ => 1, }; } + if self.should_ice { + self.failure_status = 101; + } for key in &["RUST_TEST_NOCAPTURE", "RUST_TEST_THREADS"] { if let Ok(val) = env::var(key) { @@ -687,6 +697,9 @@ fn iter_header(testfile: &Path, cfg: Option<&str>, it: &mut dyn FnMut(&str)) { } impl Config { + fn parse_should_ice(&self, line: &str) -> bool { + self.parse_name_directive(line, "should-ice") + } fn parse_error_pattern(&self, line: &str) -> Option<String> { self.parse_name_value_directive(line, "error-pattern") } diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index 28b6d2c1d01..15ae67fb12c 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -298,6 +298,12 @@ impl<'test> TestCx<'test> { /// Code executed for each revision in turn (or, if there are no /// revisions, exactly once, with revision == None). fn run_revision(&self) { + if self.props.should_ice { + if self.config.mode != CompileFail && + self.config.mode != Incremental { + self.fatal("cannot use should-ice in a test that is not cfail"); + } + } match self.config.mode { CompileFail => self.run_cfail_test(), RunFail => self.run_rfail_test(), @@ -383,7 +389,7 @@ impl<'test> TestCx<'test> { fn run_cfail_test(&self) { let proc_res = self.compile_test(); self.check_if_test_should_compile(&proc_res); - self.check_no_compiler_crash(&proc_res); + self.check_no_compiler_crash(&proc_res, self.props.should_ice); let output_to_check = self.get_output(&proc_res); let expected_errors = errors::load_errors(&self.testpaths.file, self.revision); @@ -395,6 +401,12 @@ impl<'test> TestCx<'test> { } else { self.check_error_patterns(&output_to_check, &proc_res); } + if self.props.should_ice { + match proc_res.status.code() { + Some(101) => (), + _ => self.fatal("expected ICE"), + } + } self.check_forbid_output(&output_to_check, &proc_res); } @@ -1402,9 +1414,11 @@ impl<'test> TestCx<'test> { } } - fn check_no_compiler_crash(&self, proc_res: &ProcRes) { + fn check_no_compiler_crash(&self, proc_res: &ProcRes, should_ice: bool) { match proc_res.status.code() { - Some(101) => self.fatal_proc_rec("compiler encountered internal error", proc_res), + Some(101) if !should_ice => { + self.fatal_proc_rec("compiler encountered internal error", proc_res) + } None => self.fatal_proc_rec("compiler terminated by signal", proc_res), _ => (), } @@ -2518,7 +2532,7 @@ impl<'test> TestCx<'test> { self.fatal_proc_rec("compilation failed!", &proc_res); } - self.check_no_compiler_crash(&proc_res); + self.check_no_compiler_crash(&proc_res, self.props.should_ice); const PREFIX: &'static str = "MONO_ITEM "; const CGU_MARKER: &'static str = "@@"; @@ -2774,8 +2788,14 @@ impl<'test> TestCx<'test> { } if revision.starts_with("rpass") { + if revision_cx.props.should_ice { + revision_cx.fatal("can only use should-ice in cfail tests"); + } revision_cx.run_rpass_test(); } else if revision.starts_with("rfail") { + if revision_cx.props.should_ice { + revision_cx.fatal("can only use should-ice in cfail tests"); + } revision_cx.run_rfail_test(); } else if revision.starts_with("cfail") { revision_cx.run_cfail_test(); |
