From 6299c3302216174de41a24ca44033f978cd64666 Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Sun, 3 Nov 2019 16:42:09 +0100 Subject: [PATCH 1/9] add header to compiletest to check for ice --- src/tools/compiletest/src/header.rs | 10 ++++++++++ src/tools/compiletest/src/runtest.rs | 14 ++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index df56448dd225d..f63b5997a4ac6 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -376,6 +376,8 @@ pub struct TestProps { // If true, `rustfix` will only apply `MachineApplicable` suggestions. pub rustfix_only_machine_applicable: bool, pub assembly_output: Option, + // If true, the test is expected to ICE + pub should_ice: bool, } impl TestProps { @@ -414,6 +416,7 @@ impl TestProps { run_rustfix: false, rustfix_only_machine_applicable: false, assembly_output: None, + should_ice: false, } } @@ -464,6 +467,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); } @@ -688,6 +695,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 { 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 ea31f37c7a52b..c239e045cc12c 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -383,7 +383,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 +395,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 +1408,9 @@ 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 +2524,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 = "@@"; From 32f3fe7a6d9b11ec029be3655da854514cb0a1db Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Sun, 3 Nov 2019 16:44:19 +0100 Subject: [PATCH 2/9] add rustc_error(delay_span_bug_from_inside_query) attribute --- src/librustc/query/mod.rs | 6 ++++ src/librustc_codegen_utils/lib.rs | 32 +++++++++++++++++++-- src/libsyntax/feature_gate/builtin_attrs.rs | 5 +++- src/libsyntax_pos/symbol.rs | 1 + 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs index c95652f274e36..2bc4b59962b1b 100644 --- a/src/librustc/query/mod.rs +++ b/src/librustc/query/mod.rs @@ -29,6 +29,12 @@ use syntax_pos::symbol::InternedString; // Queries marked with `fatal_cycle` do not need the latter implementation, // as they will raise an fatal error on query cycles instead. rustc_queries! { + Other { + query trigger_delay_span_bug(key: DefId) -> () { + desc { "trigger a delay span bug" } + } + } + Other { /// Records the type of every item. query type_of(key: DefId) -> Ty<'tcx> { diff --git a/src/librustc_codegen_utils/lib.rs b/src/librustc_codegen_utils/lib.rs index 66920342ff6ba..bfc70b0d875a9 100644 --- a/src/librustc_codegen_utils/lib.rs +++ b/src/librustc_codegen_utils/lib.rs @@ -19,7 +19,7 @@ extern crate rustc; use rustc::ty::TyCtxt; use rustc::ty::query::Providers; -use rustc::hir::def_id::LOCAL_CRATE; +use rustc::hir::def_id::{LOCAL_CRATE, DefId}; use syntax::symbol::sym; pub mod link; @@ -27,18 +27,44 @@ pub mod codegen_backend; pub mod symbol_names; pub mod symbol_names_test; + +pub fn trigger_delay_span_bug(tcx: TyCtxt<'_>, key: DefId) { + tcx.sess.delay_span_bug(tcx.def_span(key), "compilation successful"); +} + /// check for the #[rustc_error] annotation, which forces an /// error in codegen. This is used to write compile-fail tests /// that actually test that compilation succeeds without /// reporting an error. pub fn check_for_rustc_errors_attr(tcx: TyCtxt<'_>) { if let Some((def_id, _)) = tcx.entry_fn(LOCAL_CRATE) { - if tcx.has_attr(def_id, sym::rustc_error) { - tcx.sess.span_fatal(tcx.def_span(def_id), "compilation successful"); + let attrs = &*tcx.get_attrs(def_id); + for attr in attrs { + if attr.check_name(sym::rustc_error) { + match attr.meta_item_list() { + // check if there is a #[rustc_error(delayed)] + Some(list) => { + if list.iter().any(|list_item| { + list_item.ident().map(|i| i.name) == + Some(sym::delay_span_bug_from_inside_query) + }) { + tcx.ensure().trigger_delay_span_bug(def_id); + } + } + // bare #[rustc_error] + None => { + tcx.sess.span_fatal(tcx.def_span(def_id), "compilation successful"); + } + } + } } } } pub fn provide(providers: &mut Providers<'_>) { crate::symbol_names::provide(providers); + *providers = Providers { + trigger_delay_span_bug, + ..*providers + }; } diff --git a/src/libsyntax/feature_gate/builtin_attrs.rs b/src/libsyntax/feature_gate/builtin_attrs.rs index ab1620b952491..e9eef1c9d6b02 100644 --- a/src/libsyntax/feature_gate/builtin_attrs.rs +++ b/src/libsyntax/feature_gate/builtin_attrs.rs @@ -533,7 +533,10 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ rustc_attr!(TEST, rustc_variance, Normal, template!(Word)), rustc_attr!(TEST, rustc_layout, Normal, template!(List: "field1, field2, ...")), rustc_attr!(TEST, rustc_regions, Normal, template!(Word)), - rustc_attr!(TEST, rustc_error, Whitelisted, template!(Word)), + rustc_attr!( + TEST, rustc_error, Whitelisted, + template!(Word, List: "delay_span_bug_from_inside_query") + ), rustc_attr!(TEST, rustc_dump_user_substs, Whitelisted, template!(Word)), rustc_attr!(TEST, rustc_if_this_changed, Whitelisted, template!(Word, List: "DepNode")), rustc_attr!(TEST, rustc_then_this_would_need, Whitelisted, template!(List: "DepNode")), diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index c37efde9923a7..6ff9ee03e1941 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -234,6 +234,7 @@ symbols! { default_lib_allocator, default_type_parameter_fallback, default_type_params, + delay_span_bug_from_inside_query, deny, deprecated, deref, From aa028cdc995f4a7cc3578ef8eda843198cd1f319 Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Sun, 3 Nov 2019 17:37:35 +0100 Subject: [PATCH 3/9] remove another status code check is should-ice --- src/tools/compiletest/src/runtest.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index c239e045cc12c..b3cb2724b5b1f 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -434,7 +434,12 @@ impl<'test> TestCx<'test> { } fn check_correct_failure_status(&self, proc_res: &ProcRes) { - let expected_status = Some(self.props.failure_status); + let expected_status = + if self.props.should_ice { + Some(101) + } else { + Some(self.props.failure_status) + }; let received_status = proc_res.status.code(); if expected_status != received_status { From 0f91ed41770e65fdac39e72798036fa650269788 Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Sun, 3 Nov 2019 17:43:53 +0100 Subject: [PATCH 4/9] added test for checking that ICEs are not hidden --- src/test/incremental/delayed_span_bug.rs | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/test/incremental/delayed_span_bug.rs diff --git a/src/test/incremental/delayed_span_bug.rs b/src/test/incremental/delayed_span_bug.rs new file mode 100644 index 0000000000000..491cd9d735ca4 --- /dev/null +++ b/src/test/incremental/delayed_span_bug.rs @@ -0,0 +1,8 @@ +// revisions: cfail1 cfail2 +// should-ice +// error-pattern: compilation successful + +#![feature(rustc_attrs)] + +#[rustc_error(delay_span_bug_from_inside_query)] +fn main() {} From fff3c25b85f7ea02f6512edbc441ab2742ea4268 Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Sun, 3 Nov 2019 17:54:50 +0100 Subject: [PATCH 5/9] tidy --- src/tools/compiletest/src/runtest.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index b3cb2724b5b1f..68812bd94eb24 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -1415,7 +1415,9 @@ impl<'test> TestCx<'test> { fn check_no_compiler_crash(&self, proc_res: &ProcRes, should_ice: bool) { match proc_res.status.code() { - Some(101) if !should_ice => 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), _ => (), } From f0d206147e4407c555f1827941b86586be3dad2b Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Tue, 5 Nov 2019 22:42:23 +0100 Subject: [PATCH 6/9] rewrote error messages for #[rustc_error] --- src/librustc_codegen_utils/lib.rs | 10 ++++++++-- src/test/incremental/delayed_span_bug.rs | 2 +- .../ui/associated-types/bound-lifetime-constrained.rs | 2 +- .../bound-lifetime-in-binding-only.ok.stderr | 2 +- .../associated-types/bound-lifetime-in-binding-only.rs | 2 +- .../bound-lifetime-in-return-only.ok.stderr | 2 +- .../associated-types/bound-lifetime-in-return-only.rs | 2 +- .../cache/project-fn-ret-contravariant.ok.stderr | 2 +- .../cache/project-fn-ret-contravariant.oneuse.stderr | 2 +- .../cache/project-fn-ret-contravariant.rs | 4 ++-- .../cache/project-fn-ret-invariant.ok.stderr | 2 +- .../associated-types/cache/project-fn-ret-invariant.rs | 2 +- .../higher-ranked-projection.good.stderr | 2 +- .../ui/associated-types/higher-ranked-projection.rs | 2 +- .../ui/hr-subtype/hr-subtype.bound_a_vs_bound_a.stderr | 2 +- .../ui/hr-subtype/hr-subtype.bound_a_vs_bound_b.stderr | 2 +- .../hr-subtype.bound_co_a_vs_bound_co_b.stderr | 2 +- .../hr-subtype.bound_inv_a_vs_bound_inv_b.stderr | 2 +- .../ui/hr-subtype/hr-subtype.free_x_vs_free_x.stderr | 2 +- src/test/ui/hr-subtype/hr-subtype.rs | 10 +++++----- src/test/ui/proc-macro/no-macro-use-attr.rs | 2 +- src/test/ui/proc-macro/no-macro-use-attr.stderr | 2 +- src/test/ui/rfc1445/feature-gate.rs | 2 +- src/test/ui/rfc1445/feature-gate.with_gate.stderr | 2 +- src/test/ui/rustc-error.rs | 2 +- src/test/ui/rustc-error.stderr | 2 +- 26 files changed, 38 insertions(+), 32 deletions(-) diff --git a/src/librustc_codegen_utils/lib.rs b/src/librustc_codegen_utils/lib.rs index bfc70b0d875a9..fb2099e71a31a 100644 --- a/src/librustc_codegen_utils/lib.rs +++ b/src/librustc_codegen_utils/lib.rs @@ -29,7 +29,10 @@ pub mod symbol_names_test; pub fn trigger_delay_span_bug(tcx: TyCtxt<'_>, key: DefId) { - tcx.sess.delay_span_bug(tcx.def_span(key), "compilation successful"); + tcx.sess.delay_span_bug( + tcx.def_span(key), + "delayed span bug triggered by #[rustc_error(delay_span_bug_from_inside_query)]" + ); } /// check for the #[rustc_error] annotation, which forces an @@ -53,7 +56,10 @@ pub fn check_for_rustc_errors_attr(tcx: TyCtxt<'_>) { } // bare #[rustc_error] None => { - tcx.sess.span_fatal(tcx.def_span(def_id), "compilation successful"); + tcx.sess.span_fatal( + tcx.def_span(def_id), + "fatal error triggered by #[rustc_error]" + ); } } } diff --git a/src/test/incremental/delayed_span_bug.rs b/src/test/incremental/delayed_span_bug.rs index 491cd9d735ca4..20cffbdf0add8 100644 --- a/src/test/incremental/delayed_span_bug.rs +++ b/src/test/incremental/delayed_span_bug.rs @@ -1,6 +1,6 @@ // revisions: cfail1 cfail2 // should-ice -// error-pattern: compilation successful +// error-pattern: fatal error triggered by #[rustc_error] #![feature(rustc_attrs)] diff --git a/src/test/ui/associated-types/bound-lifetime-constrained.rs b/src/test/ui/associated-types/bound-lifetime-constrained.rs index fb82b3fa66660..4e6754c865dce 100644 --- a/src/test/ui/associated-types/bound-lifetime-constrained.rs +++ b/src/test/ui/associated-types/bound-lifetime-constrained.rs @@ -45,4 +45,4 @@ fn clause2() where T: for<'a> Fn() -> <() as Foo<'a>>::Item { } #[rustc_error] -fn main() { } //[ok]~ ERROR compilation successful +fn main() { } //[ok]~ ERROR fatal error triggered by #[rustc_error] diff --git a/src/test/ui/associated-types/bound-lifetime-in-binding-only.ok.stderr b/src/test/ui/associated-types/bound-lifetime-in-binding-only.ok.stderr index fcdb371a6e599..5ece425196c77 100644 --- a/src/test/ui/associated-types/bound-lifetime-in-binding-only.ok.stderr +++ b/src/test/ui/associated-types/bound-lifetime-in-binding-only.ok.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/bound-lifetime-in-binding-only.rs:71:1 | LL | fn main() { } diff --git a/src/test/ui/associated-types/bound-lifetime-in-binding-only.rs b/src/test/ui/associated-types/bound-lifetime-in-binding-only.rs index 843f5f0619588..e714457ef7b38 100644 --- a/src/test/ui/associated-types/bound-lifetime-in-binding-only.rs +++ b/src/test/ui/associated-types/bound-lifetime-in-binding-only.rs @@ -68,4 +68,4 @@ fn ok3() where for<'a> Parameterized<'a>: Foo { } #[rustc_error] -fn main() { } //[ok]~ ERROR compilation successful +fn main() { } //[ok]~ ERROR fatal error triggered by #[rustc_error] diff --git a/src/test/ui/associated-types/bound-lifetime-in-return-only.ok.stderr b/src/test/ui/associated-types/bound-lifetime-in-return-only.ok.stderr index 504d68e66e23e..8c0980983119b 100644 --- a/src/test/ui/associated-types/bound-lifetime-in-return-only.ok.stderr +++ b/src/test/ui/associated-types/bound-lifetime-in-return-only.ok.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/bound-lifetime-in-return-only.rs:49:1 | LL | fn main() { } diff --git a/src/test/ui/associated-types/bound-lifetime-in-return-only.rs b/src/test/ui/associated-types/bound-lifetime-in-return-only.rs index 9c0dc61494d1f..a60ccb6c4b28d 100644 --- a/src/test/ui/associated-types/bound-lifetime-in-return-only.rs +++ b/src/test/ui/associated-types/bound-lifetime-in-return-only.rs @@ -46,4 +46,4 @@ fn ok2(_: &dyn for<'a,'b> Fn<(&'b Parameterized<'a>,), Output=&'a i32>) { } #[rustc_error] -fn main() { } //[ok]~ ERROR compilation successful +fn main() { } //[ok]~ ERROR fatal error triggered by #[rustc_error] diff --git a/src/test/ui/associated-types/cache/project-fn-ret-contravariant.ok.stderr b/src/test/ui/associated-types/cache/project-fn-ret-contravariant.ok.stderr index 15bbea671c50f..baa8e6f82f646 100644 --- a/src/test/ui/associated-types/cache/project-fn-ret-contravariant.ok.stderr +++ b/src/test/ui/associated-types/cache/project-fn-ret-contravariant.ok.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/project-fn-ret-contravariant.rs:50:1 | LL | fn main() { } diff --git a/src/test/ui/associated-types/cache/project-fn-ret-contravariant.oneuse.stderr b/src/test/ui/associated-types/cache/project-fn-ret-contravariant.oneuse.stderr index 15bbea671c50f..baa8e6f82f646 100644 --- a/src/test/ui/associated-types/cache/project-fn-ret-contravariant.oneuse.stderr +++ b/src/test/ui/associated-types/cache/project-fn-ret-contravariant.oneuse.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/project-fn-ret-contravariant.rs:50:1 | LL | fn main() { } diff --git a/src/test/ui/associated-types/cache/project-fn-ret-contravariant.rs b/src/test/ui/associated-types/cache/project-fn-ret-contravariant.rs index d953325df2349..ebf52918153c1 100644 --- a/src/test/ui/associated-types/cache/project-fn-ret-contravariant.rs +++ b/src/test/ui/associated-types/cache/project-fn-ret-contravariant.rs @@ -48,5 +48,5 @@ fn transmute<'a,'b>(x: &'a u32, y: &'b u32) -> (&'a u32, &'b u32) { #[rustc_error] fn main() { } -//[ok]~^ ERROR compilation successful -//[oneuse]~^^ ERROR compilation successful +//[ok]~^ ERROR fatal error triggered by #[rustc_error] +//[oneuse]~^^ ERROR fatal error triggered by #[rustc_error] diff --git a/src/test/ui/associated-types/cache/project-fn-ret-invariant.ok.stderr b/src/test/ui/associated-types/cache/project-fn-ret-invariant.ok.stderr index 8110ed40cfe4e..8f445acf2b98c 100644 --- a/src/test/ui/associated-types/cache/project-fn-ret-invariant.ok.stderr +++ b/src/test/ui/associated-types/cache/project-fn-ret-invariant.ok.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/project-fn-ret-invariant.rs:59:1 | LL | fn main() { } diff --git a/src/test/ui/associated-types/cache/project-fn-ret-invariant.rs b/src/test/ui/associated-types/cache/project-fn-ret-invariant.rs index 54b6e3642c2ea..23d873212ed1e 100644 --- a/src/test/ui/associated-types/cache/project-fn-ret-invariant.rs +++ b/src/test/ui/associated-types/cache/project-fn-ret-invariant.rs @@ -57,4 +57,4 @@ fn transmute<'a,'b>(x: Type<'a>, y: Type<'b>) -> (Type<'a>, Type<'b>) { #[rustc_error] fn main() { } -//[ok]~^ ERROR compilation successful +//[ok]~^ ERROR fatal error triggered by #[rustc_error] diff --git a/src/test/ui/associated-types/higher-ranked-projection.good.stderr b/src/test/ui/associated-types/higher-ranked-projection.good.stderr index 16fef0510f871..63d88543607f3 100644 --- a/src/test/ui/associated-types/higher-ranked-projection.good.stderr +++ b/src/test/ui/associated-types/higher-ranked-projection.good.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/higher-ranked-projection.rs:24:1 | LL | / fn main() { diff --git a/src/test/ui/associated-types/higher-ranked-projection.rs b/src/test/ui/associated-types/higher-ranked-projection.rs index a2ea6d8f206b6..5315e21b0f5a9 100644 --- a/src/test/ui/associated-types/higher-ranked-projection.rs +++ b/src/test/ui/associated-types/higher-ranked-projection.rs @@ -21,7 +21,7 @@ fn foo(_t: T) {} #[rustc_error] -fn main() { //[good]~ ERROR compilation successful +fn main() { //[good]~ ERROR fatal error triggered by #[rustc_error] foo(()); //[bad]~^ ERROR type mismatch } diff --git a/src/test/ui/hr-subtype/hr-subtype.bound_a_vs_bound_a.stderr b/src/test/ui/hr-subtype/hr-subtype.bound_a_vs_bound_a.stderr index 9ec36f4c142e9..6aba6466fada5 100644 --- a/src/test/ui/hr-subtype/hr-subtype.bound_a_vs_bound_a.stderr +++ b/src/test/ui/hr-subtype/hr-subtype.bound_a_vs_bound_a.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/hr-subtype.rs:100:1 | LL | / fn main() { diff --git a/src/test/ui/hr-subtype/hr-subtype.bound_a_vs_bound_b.stderr b/src/test/ui/hr-subtype/hr-subtype.bound_a_vs_bound_b.stderr index 9ec36f4c142e9..6aba6466fada5 100644 --- a/src/test/ui/hr-subtype/hr-subtype.bound_a_vs_bound_b.stderr +++ b/src/test/ui/hr-subtype/hr-subtype.bound_a_vs_bound_b.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/hr-subtype.rs:100:1 | LL | / fn main() { diff --git a/src/test/ui/hr-subtype/hr-subtype.bound_co_a_vs_bound_co_b.stderr b/src/test/ui/hr-subtype/hr-subtype.bound_co_a_vs_bound_co_b.stderr index 9ec36f4c142e9..6aba6466fada5 100644 --- a/src/test/ui/hr-subtype/hr-subtype.bound_co_a_vs_bound_co_b.stderr +++ b/src/test/ui/hr-subtype/hr-subtype.bound_co_a_vs_bound_co_b.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/hr-subtype.rs:100:1 | LL | / fn main() { diff --git a/src/test/ui/hr-subtype/hr-subtype.bound_inv_a_vs_bound_inv_b.stderr b/src/test/ui/hr-subtype/hr-subtype.bound_inv_a_vs_bound_inv_b.stderr index 9ec36f4c142e9..6aba6466fada5 100644 --- a/src/test/ui/hr-subtype/hr-subtype.bound_inv_a_vs_bound_inv_b.stderr +++ b/src/test/ui/hr-subtype/hr-subtype.bound_inv_a_vs_bound_inv_b.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/hr-subtype.rs:100:1 | LL | / fn main() { diff --git a/src/test/ui/hr-subtype/hr-subtype.free_x_vs_free_x.stderr b/src/test/ui/hr-subtype/hr-subtype.free_x_vs_free_x.stderr index 9ec36f4c142e9..6aba6466fada5 100644 --- a/src/test/ui/hr-subtype/hr-subtype.free_x_vs_free_x.stderr +++ b/src/test/ui/hr-subtype/hr-subtype.free_x_vs_free_x.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/hr-subtype.rs:100:1 | LL | / fn main() { diff --git a/src/test/ui/hr-subtype/hr-subtype.rs b/src/test/ui/hr-subtype/hr-subtype.rs index 2f7c1e6fd8c0d..b31f198bd97bf 100644 --- a/src/test/ui/hr-subtype/hr-subtype.rs +++ b/src/test/ui/hr-subtype/hr-subtype.rs @@ -98,9 +98,9 @@ check! { bound_a_b_ret_a_vs_bound_a_ret_a: (for<'a,'b> fn(&'a u32, &'b u32) -> & #[rustc_error] fn main() { -//[bound_a_vs_bound_a]~^ ERROR compilation successful -//[bound_a_vs_bound_b]~^^ ERROR compilation successful -//[bound_inv_a_vs_bound_inv_b]~^^^ ERROR compilation successful -//[bound_co_a_vs_bound_co_b]~^^^^ ERROR compilation successful -//[free_x_vs_free_x]~^^^^^ ERROR compilation successful +//[bound_a_vs_bound_a]~^ ERROR fatal error triggered by #[rustc_error] +//[bound_a_vs_bound_b]~^^ ERROR fatal error triggered by #[rustc_error] +//[bound_inv_a_vs_bound_inv_b]~^^^ ERROR fatal error triggered by #[rustc_error] +//[bound_co_a_vs_bound_co_b]~^^^^ ERROR fatal error triggered by #[rustc_error] +//[free_x_vs_free_x]~^^^^^ ERROR fatal error triggered by #[rustc_error] } diff --git a/src/test/ui/proc-macro/no-macro-use-attr.rs b/src/test/ui/proc-macro/no-macro-use-attr.rs index 15ab431fe754a..a8a8fa4e19a4a 100644 --- a/src/test/ui/proc-macro/no-macro-use-attr.rs +++ b/src/test/ui/proc-macro/no-macro-use-attr.rs @@ -7,4 +7,4 @@ extern crate test_macros; //~^ WARN unused extern crate #[rustc_error] -fn main() {} //~ ERROR compilation successful +fn main() {} //~ ERROR fatal error triggered by #[rustc_error] diff --git a/src/test/ui/proc-macro/no-macro-use-attr.stderr b/src/test/ui/proc-macro/no-macro-use-attr.stderr index 87487bcc7d662..50552ea7dbb68 100644 --- a/src/test/ui/proc-macro/no-macro-use-attr.stderr +++ b/src/test/ui/proc-macro/no-macro-use-attr.stderr @@ -10,7 +10,7 @@ note: lint level defined here LL | #![warn(unused_extern_crates)] | ^^^^^^^^^^^^^^^^^^^^ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/no-macro-use-attr.rs:10:1 | LL | fn main() {} diff --git a/src/test/ui/rfc1445/feature-gate.rs b/src/test/ui/rfc1445/feature-gate.rs index 550610c5444e9..b97cc1bb6290c 100644 --- a/src/test/ui/rfc1445/feature-gate.rs +++ b/src/test/ui/rfc1445/feature-gate.rs @@ -18,7 +18,7 @@ struct Foo { const FOO: Foo = Foo { x: 0 }; #[rustc_error] -fn main() { //[with_gate]~ ERROR compilation successful +fn main() { //[with_gate]~ ERROR fatal error triggered by #[rustc_error] let y = Foo { x: 1 }; match y { FOO => { } diff --git a/src/test/ui/rfc1445/feature-gate.with_gate.stderr b/src/test/ui/rfc1445/feature-gate.with_gate.stderr index ca8dc75c5335f..fabbfd5c70bb9 100644 --- a/src/test/ui/rfc1445/feature-gate.with_gate.stderr +++ b/src/test/ui/rfc1445/feature-gate.with_gate.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/feature-gate.rs:21:1 | LL | / fn main() { diff --git a/src/test/ui/rustc-error.rs b/src/test/ui/rustc-error.rs index 0504198032cc3..69d57948fb5e7 100644 --- a/src/test/ui/rustc-error.rs +++ b/src/test/ui/rustc-error.rs @@ -2,5 +2,5 @@ #[rustc_error] fn main() { - //~^ ERROR compilation successful + //~^ ERROR fatal error triggered by #[rustc_error] } diff --git a/src/test/ui/rustc-error.stderr b/src/test/ui/rustc-error.stderr index dcbc0e1feb213..7dfc444929594 100644 --- a/src/test/ui/rustc-error.stderr +++ b/src/test/ui/rustc-error.stderr @@ -1,4 +1,4 @@ -error: compilation successful +error: fatal error triggered by #[rustc_error] --> $DIR/rustc-error.rs:4:1 | LL | / fn main() { From 9305e606e15d1ef514206ae8fc13b84eb84b42ab Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Tue, 5 Nov 2019 22:49:19 +0100 Subject: [PATCH 7/9] was not the same replace as others --- src/test/incremental/delayed_span_bug.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/incremental/delayed_span_bug.rs b/src/test/incremental/delayed_span_bug.rs index 20cffbdf0add8..2529e531e30ad 100644 --- a/src/test/incremental/delayed_span_bug.rs +++ b/src/test/incremental/delayed_span_bug.rs @@ -1,6 +1,6 @@ // revisions: cfail1 cfail2 // should-ice -// error-pattern: fatal error triggered by #[rustc_error] +// error-pattern: delayed span bug triggered by #[rustc_error(delay_span_bug_from_inside_query)] #![feature(rustc_attrs)] From 5852a3f4e9f07d7cb2cc155fbb071ce97c377a6a Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Thu, 7 Nov 2019 21:53:00 +0100 Subject: [PATCH 8/9] putting the failure_status code in header.rs --- src/tools/compiletest/src/header.rs | 3 +++ src/tools/compiletest/src/runtest.rs | 7 +------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index f63b5997a4ac6..0212ff45eecb2 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -585,6 +585,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) { diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index 68812bd94eb24..fd250d6c7a607 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -434,12 +434,7 @@ impl<'test> TestCx<'test> { } fn check_correct_failure_status(&self, proc_res: &ProcRes) { - let expected_status = - if self.props.should_ice { - Some(101) - } else { - Some(self.props.failure_status) - }; + let expected_status = Some(self.props.failure_status); let received_status = proc_res.status.code(); if expected_status != received_status { From e01d9415e26dfcdd31c182bec21049502f5477ff Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Fri, 8 Nov 2019 17:38:15 +0100 Subject: [PATCH 9/9] check for sould-ice either in compilefail or incremental cfail --- src/tools/compiletest/src/runtest.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index fd250d6c7a607..1782074fc9234 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(), @@ -2782,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();