about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Renshaw <dwrenshaw@gmail.com>2020-04-12 11:36:37 -0400
committerDavid Renshaw <dwrenshaw@gmail.com>2020-04-12 11:36:37 -0400
commit57ed3d378d2430b0db296c3b37a81e69cca76e8c (patch)
tree67c9f9af9243d21dfc198541244532bb9aaae629
parent32fb4dcdd7a57683a639a0959442711d0fd123bc (diff)
downloadrust-57ed3d378d2430b0db296c3b37a81e69cca76e8c.tar.gz
rust-57ed3d378d2430b0db296c3b37a81e69cca76e8c.zip
fix issue 69130
-rw-r--r--src/librustc_errors/lib.rs5
-rw-r--r--src/test/ui/consts/miri_unleashed/mutable_const2.stderr2
-rw-r--r--src/test/ui/issues/issue-69130.rs7
-rw-r--r--src/test/ui/issues/issue-69130.stderr21
4 files changed, 33 insertions, 2 deletions
diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs
index 55eb9fd566d..151241fdb0b 100644
--- a/src/librustc_errors/lib.rs
+++ b/src/librustc_errors/lib.rs
@@ -231,7 +231,10 @@ impl CodeSuggestion {
                             }
                         }
                         if let Some(cur_line) = sf.get_line(cur_lo.line - 1) {
-                            let end = std::cmp::min(cur_line.len(), cur_lo.col.to_usize());
+                            let end = match cur_line.char_indices().nth(cur_lo.col.to_usize()) {
+                                Some((i, _)) => i,
+                                None => cur_line.len(),
+                            };
                             buf.push_str(&cur_line[..end]);
                         }
                     }
diff --git a/src/test/ui/consts/miri_unleashed/mutable_const2.stderr b/src/test/ui/consts/miri_unleashed/mutable_const2.stderr
index 1699223f74f..39027dd2b41 100644
--- a/src/test/ui/consts/miri_unleashed/mutable_const2.stderr
+++ b/src/test/ui/consts/miri_unleashed/mutable_const2.stderr
@@ -12,7 +12,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:363:17
+thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:366:17
 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
 
 error: internal compiler error: unexpected panic
diff --git a/src/test/ui/issues/issue-69130.rs b/src/test/ui/issues/issue-69130.rs
new file mode 100644
index 00000000000..9552e8ec2a8
--- /dev/null
+++ b/src/test/ui/issues/issue-69130.rs
@@ -0,0 +1,7 @@
+// Issue 69130: character indexing bug in rustc_errors::CodeSuggestion::splice_lines().
+
+enum F {
+M (§& u8)}
+//~^ ERROR unknown start of token
+//~| missing lifetime specifier
+fn main() {}
diff --git a/src/test/ui/issues/issue-69130.stderr b/src/test/ui/issues/issue-69130.stderr
new file mode 100644
index 00000000000..a4700a5ed1d
--- /dev/null
+++ b/src/test/ui/issues/issue-69130.stderr
@@ -0,0 +1,21 @@
+error: unknown start of token: \u{a7}
+  --> $DIR/issue-69130.rs:4:4
+   |
+LL | M (§& u8)}
+   |    ^
+
+error[E0106]: missing lifetime specifier
+  --> $DIR/issue-69130.rs:4:5
+   |
+LL | M (§& u8)}
+   |     ^ expected named lifetime parameter
+   |
+help: consider introducing a named lifetime parameter
+   |
+LL | enum F<'a> {
+LL | M (§&'a  u8)}
+   |
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0106`.