diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2020-03-02 11:47:49 +1100 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2020-03-02 14:42:46 +1100 |
| commit | 99a595e406077375824a1316d4d669ad1f0a15f8 (patch) | |
| tree | 241f896a43e991cebe3097b7e2b446443e6eaa54 /src/librustc_errors | |
| parent | beac68a88711a90346ec8b68e3baefbec62b3b0d (diff) | |
Fix a leak in `DiagnosticBuilder::into_diagnostic`.
Fixes #69600.
Diffstat (limited to 'src/librustc_errors')
| -rw-r--r-- | src/librustc_errors/diagnostic_builder.rs | 11 |
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); |
