Skip to content

Commit 2a7ee4d

Browse files
committed
rustc_errors: enforce OUTPUT_REPLACEMENTS is sorted with a compile-time assertion
1 parent 51b5bb1 commit 2a7ee4d

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

compiler/rustc_errors/src/emitter.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -2559,9 +2559,7 @@ fn num_decimal_digits(num: usize) -> usize {
25592559

25602560
// We replace some characters so the CLI output is always consistent and underlines aligned.
25612561
// Keep the following list in sync with `rustc_span::char_width`.
2562-
// ATTENTION: keep lexicografically sorted so that the binary search will work
25632562
const OUTPUT_REPLACEMENTS: &[(char, &str)] = &[
2564-
// tidy-alphabetical-start
25652563
// In terminals without Unicode support the following will be garbled, but in *all* terminals
25662564
// the underlying codepoint will be as well. We could gate this replacement behind a "unicode
25672565
// support" gate.
@@ -2574,7 +2572,7 @@ const OUTPUT_REPLACEMENTS: &[(char, &str)] = &[
25742572
('\u{0006}', "␆"),
25752573
('\u{0007}', "␇"),
25762574
('\u{0008}', "␈"),
2577-
('\u{0009}', " "), // We do our own tab replacement
2575+
('\t', " "), // We do our own tab replacement
25782576
('\u{000b}', "␋"),
25792577
('\u{000c}', "␌"),
25802578
('\u{000d}', "␍"),
@@ -2607,10 +2605,20 @@ const OUTPUT_REPLACEMENTS: &[(char, &str)] = &[
26072605
('\u{2067}', "�"),
26082606
('\u{2068}', "�"),
26092607
('\u{2069}', "�"),
2610-
// tidy-alphabetical-end
26112608
];
26122609

26132610
fn normalize_whitespace(s: &str) -> String {
2611+
const {
2612+
let mut i = 1;
2613+
while i < OUTPUT_REPLACEMENTS.len() {
2614+
assert!(
2615+
OUTPUT_REPLACEMENTS[i - 1].0 < OUTPUT_REPLACEMENTS[i].0,
2616+
"The OUTPUT_REPLACEMENTS array must be sorted (for binary search to work) \
2617+
and must contain no duplicate entries"
2618+
);
2619+
i += 1;
2620+
}
2621+
}
26142622
// Scan the input string for a character in the ordered table above. If it's present, replace
26152623
// it with it's alternative string (it can be more than 1 char!). Otherwise, retain the input
26162624
// char. At the end, allocate all chars into a string in one operation.

0 commit comments

Comments
 (0)