Skip to content

Commit d27fac6

Browse files
committed
Fix find_width_of_character_at_span bounds check
Commit 0bd9667 added bounds checking of our current target byte position to prevent infinite loops. Unfortunately it was comparing the file-relative `target` versus the global relative `file_start_pos` and `file_end_pos`. The result is failing to detect multibyte characters unless their file-relative offset fit within their global offset. This causes other parts of the compiler to generate spans pointing to the middle of a multibyte character which will ultimately panic in `bytepos_to_file_charpos`. Fix by comparing the `target` to the total file size when moving forward and doing checked subtraction when moving backwards. This should preserve the intent of the bounds check while removing the offset confusion. Fixes #48508
1 parent 6070d3e commit d27fac6

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

src/libsyntax/codemap.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -705,17 +705,20 @@ impl CodeMap {
705705
};
706706
debug!("find_width_of_character_at_span: snippet=`{:?}`", snippet);
707707

708-
let file_start_pos = local_begin.fm.start_pos.to_usize();
709-
let file_end_pos = local_begin.fm.end_pos.to_usize();
710-
debug!("find_width_of_character_at_span: file_start_pos=`{:?}` file_end_pos=`{:?}`",
711-
file_start_pos, file_end_pos);
712-
713708
let mut target = if forwards { end_index + 1 } else { end_index - 1 };
714709
debug!("find_width_of_character_at_span: initial target=`{:?}`", target);
715710

716-
while !snippet.is_char_boundary(target - start_index)
717-
&& target >= file_start_pos && target <= file_end_pos {
718-
target = if forwards { target + 1 } else { target - 1 };
711+
while !snippet.is_char_boundary(target - start_index) && target < source_len {
712+
target = if forwards {
713+
target + 1
714+
} else {
715+
match target.checked_sub(1) {
716+
Some(target) => target,
717+
None => {
718+
break;
719+
}
720+
}
721+
};
719722
debug!("find_width_of_character_at_span: target=`{:?}`", target);
720723
}
721724
debug!("find_width_of_character_at_span: final target=`{:?}`", target);

0 commit comments

Comments
 (0)