about summary refs log tree commit diff
path: root/src/librustc_errors
diff options
context:
space:
mode:
authorNicholas Nethercote <nnethercote@mozilla.com>2020-03-02 11:47:49 +1100
committerNicholas Nethercote <nnethercote@mozilla.com>2020-03-02 14:42:46 +1100
commit99a595e406077375824a1316d4d669ad1f0a15f8 (patch)
tree241f896a43e991cebe3097b7e2b446443e6eaa54 /src/librustc_errors
parentbeac68a88711a90346ec8b68e3baefbec62b3b0d (diff)
Fix a leak in `DiagnosticBuilder::into_diagnostic`.
Fixes #69600.
Diffstat (limited to 'src/librustc_errors')
-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);