]> git.lizzy.rs Git - rust.git/commitdiff
Do not ICE on multipart suggestions touching multiple files
authorEsteban Küber <esteban@kuber.com.ar>
Sat, 25 Jan 2020 02:03:09 +0000 (18:03 -0800)
committerEsteban Küber <esteban@kuber.com.ar>
Sat, 25 Jan 2020 02:03:09 +0000 (18:03 -0800)
When encountering a multipart suggestion with spans belonging to
different contexts, skip that suggestion.

src/librustc_errors/lib.rs
src/test/ui/consts/miri_unleashed/mutable_const2.stderr

index 827e9b831f32d711978c1b0c960fc90aabc4ab49..17b293401f89ef1e60813c7f1fff74dc457f93e0 100644 (file)
@@ -185,16 +185,17 @@ fn push_trailing(
                 !invalid
             })
             .cloned()
-            .map(|mut substitution| {
+            .filter_map(|mut substitution| {
                 // Assumption: all spans are in the same file, and all spans
                 // are disjoint. Sort in ascending order.
                 substitution.parts.sort_by_key(|part| part.span.lo());
 
                 // Find the bounding span.
-                let lo = substitution.parts.iter().map(|part| part.span.lo()).min().unwrap();
-                let hi = substitution.parts.iter().map(|part| part.span.hi()).max().unwrap();
+                let lo = substitution.parts.iter().map(|part| part.span.lo()).min()?;
+                let hi = substitution.parts.iter().map(|part| part.span.hi()).max()?;
                 let bounding_span = Span::with_root_ctxt(lo, hi);
-                let lines = cm.span_to_lines(bounding_span).unwrap();
+                // The different spans might belong to different contexts, if so ignore suggestion.
+                let lines = cm.span_to_lines(bounding_span).ok()?;
                 assert!(!lines.lines.is_empty());
 
                 // To build up the result, we do this for each span:
@@ -244,7 +245,7 @@ fn push_trailing(
                 while buf.ends_with('\n') {
                     buf.pop();
                 }
-                (buf, substitution.parts, only_capitalization)
+                Some((buf, substitution.parts, only_capitalization))
             })
             .collect()
     }
index 0d7fb845a40eeffb1cba2bc8193a1c8455e27d92..a316d8f1698ac4d151e4f5904412ac0077270435 100644 (file)
@@ -10,7 +10,7 @@ error: internal compiler error: mutable allocation in constant
 LL | const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _;
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:356:17
+thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:357:17
 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
 
 error: internal compiler error: unexpected panic