From 8a96884981c97c4c35e304004290271308a67637 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Tue, 27 Sep 2022 20:56:05 +0200 Subject: [PATCH 1/4] Flush delayed bugs before codegen Sometimes it can happen that invalid code like a TyKind::Error makes its way through the compiler without triggering any errors (this is always a bug in rustc but bugs do happen sometimes :)). These ICEs will manifest in the backend like as cg_llvm not being able to get the layout of `[type error]`, which makes it hard to debug. By flushing before codegen, we display all the delayed bugs, making it easier to trace it to the root of the problem. --- compiler/rustc_errors/src/lib.rs | 6 ++++++ compiler/rustc_interface/src/queries.rs | 2 ++ 2 files changed, 8 insertions(+) diff --git a/compiler/rustc_errors/src/lib.rs b/compiler/rustc_errors/src/lib.rs index 4d262ae0f5ec8..b4e99225f811f 100644 --- a/compiler/rustc_errors/src/lib.rs +++ b/compiler/rustc_errors/src/lib.rs @@ -1133,6 +1133,12 @@ impl Handler { ); std::mem::take(&mut self.inner.borrow_mut().fulfilled_expectations) } + + pub fn flush_delayed(&self) { + let mut inner = self.inner.lock(); + let bugs = std::mem::replace(&mut inner.delayed_span_bugs, Vec::new()); + inner.flush_delayed(bugs, "no errors encountered even though `delay_span_bug` issued"); + } } impl HandlerInner { diff --git a/compiler/rustc_interface/src/queries.rs b/compiler/rustc_interface/src/queries.rs index 6c725a01b5315..60ed48d89886f 100644 --- a/compiler/rustc_interface/src/queries.rs +++ b/compiler/rustc_interface/src/queries.rs @@ -246,6 +246,8 @@ impl<'tcx> Queries<'tcx> { // Don't do code generation if there were any errors self.session().compile_status()?; + self.session().diagnostic().flush_delayed(); + // Hook for UI tests. Self::check_for_rustc_errors_attr(tcx); From 477846f491284973f1f3f8b4bf9c6d9deb6ad98e Mon Sep 17 00:00:00 2001 From: nils <48135649+Nilstrieb@users.noreply.github.com> Date: Fri, 30 Sep 2022 14:11:18 +0200 Subject: [PATCH 2/4] Add comment explaining why we flush delayed bugs before codegen --- compiler/rustc_interface/src/queries.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/compiler/rustc_interface/src/queries.rs b/compiler/rustc_interface/src/queries.rs index 60ed48d89886f..05775f376472a 100644 --- a/compiler/rustc_interface/src/queries.rs +++ b/compiler/rustc_interface/src/queries.rs @@ -246,6 +246,8 @@ impl<'tcx> Queries<'tcx> { // Don't do code generation if there were any errors self.session().compile_status()?; + // If we have any delayed bugs, for example beacuse we created TyKind::Error earlier, + // it's likey that codegen will only cause more ICEs, obscuring the original problem self.session().diagnostic().flush_delayed(); // Hook for UI tests. From 4b1cf846bd39a7409949a394f4c1655f2410c7e6 Mon Sep 17 00:00:00 2001 From: Camille Gillot Date: Fri, 30 Sep 2022 19:50:48 +0200 Subject: [PATCH 3/4] Update compiler/rustc_interface/src/queries.rs --- compiler/rustc_interface/src/queries.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_interface/src/queries.rs b/compiler/rustc_interface/src/queries.rs index 05775f376472a..6dfaa4453ef3e 100644 --- a/compiler/rustc_interface/src/queries.rs +++ b/compiler/rustc_interface/src/queries.rs @@ -246,7 +246,7 @@ impl<'tcx> Queries<'tcx> { // Don't do code generation if there were any errors self.session().compile_status()?; - // If we have any delayed bugs, for example beacuse we created TyKind::Error earlier, + // If we have any delayed bugs, for example because we created TyKind::Error earlier, // it's likey that codegen will only cause more ICEs, obscuring the original problem self.session().diagnostic().flush_delayed(); From e8f1bfe1937c51c1a408c98cf810d10ead454314 Mon Sep 17 00:00:00 2001 From: nils <48135649+Nilstrieb@users.noreply.github.com> Date: Fri, 30 Sep 2022 21:02:53 +0200 Subject: [PATCH 4/4] Fix typo --- compiler/rustc_interface/src/queries.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_interface/src/queries.rs b/compiler/rustc_interface/src/queries.rs index 6dfaa4453ef3e..91d180e1eb7e5 100644 --- a/compiler/rustc_interface/src/queries.rs +++ b/compiler/rustc_interface/src/queries.rs @@ -247,7 +247,7 @@ impl<'tcx> Queries<'tcx> { self.session().compile_status()?; // If we have any delayed bugs, for example because we created TyKind::Error earlier, - // it's likey that codegen will only cause more ICEs, obscuring the original problem + // it's likely that codegen will only cause more ICEs, obscuring the original problem self.session().diagnostic().flush_delayed(); // Hook for UI tests.