about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-03-03 17:50:13 +0900
committerGitHub <noreply@github.com>2020-03-03 17:50:13 +0900
commitef311d5ab41e4ada8de7411e4f47737409f3e6d5 (patch)
tree794ee07ac095f8ee8c1f1ebe2423873768f7fc58
parentc9d421f5c0a1ab319cfea18c9bd4f62cddc6d0e8 (diff)
parent99a595e406077375824a1316d4d669ad1f0a15f8 (diff)
downloadrust-ef311d5ab41e4ada8de7411e4f47737409f3e6d5.tar.gz
rust-ef311d5ab41e4ada8de7411e4f47737409f3e6d5.zip
Rollup merge of #69628 - nnethercote:fix-DiagnosticBuilder-into_diagnostic-leak, r=Centril
Fix a leak in `DiagnosticBuilder::into_diagnostic`.

Fixes #69600.

r? @Centril
-rw-r--r--src/librustc_errors/diagnostic_builder.rs11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/librustc_errors/diagnostic_builder.rs b/src/librustc_errors/diagnostic_builder.rs
index 39f585231ee..008d2e92418 100644
--- a/src/librustc_errors/diagnostic_builder.rs
+++ b/src/librustc_errors/diagnostic_builder.rs
@@ -136,12 +136,11 @@ impl<'a> DiagnosticBuilder<'a> {
 
         let handler = self.0.handler;
 
-        // We need to use `ptr::read` because `DiagnosticBuilder` implements `Drop`.
-        let diagnostic;
-        unsafe {
-            diagnostic = std::ptr::read(&self.0.diagnostic);
-            std::mem::forget(self);
-        };
+        // We must use `Level::Cancelled` for `dummy` to avoid an ICE about an
+        // unused diagnostic.
+        let dummy = Diagnostic::new(Level::Cancelled, "");
+        let diagnostic = std::mem::replace(&mut self.0.diagnostic, dummy);
+
         // Logging here is useful to help track down where in logs an error was
         // actually emitted.
         debug!("buffer: diagnostic={:?}", diagnostic);