Skip to content

Commit 1f0a025

Browse files
committed
compiler: fix a byte class bug
The code that computes the byte classes had a bug that was only tripped when the maximum number of equivalence classes was necessary (256). This commit fixes that by rewriting the loop such that we never uselessly increment outside the bounds of `u8`. Fixes rust-lang#367
1 parent 68bc958 commit 1f0a025

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

src/compile.rs

+16-2
Original file line numberDiff line numberDiff line change
@@ -1033,11 +1033,16 @@ impl ByteClassSet {
10331033
// (0usize..256).map(|x| x as u8).collect()
10341034
let mut byte_classes = vec![0; 256];
10351035
let mut class = 0u8;
1036-
for i in 0..256 {
1037-
byte_classes[i] = class;
1036+
let mut i = 0;
1037+
loop {
1038+
byte_classes[i] = class as u8;
1039+
if i >= 255 {
1040+
break;
1041+
}
10381042
if self.0[i] {
10391043
class = class.checked_add(1).unwrap();
10401044
}
1045+
i += 1;
10411046
}
10421047
byte_classes
10431048
}
@@ -1084,4 +1089,13 @@ mod tests {
10841089
assert_eq!(classes[7], 3);
10851090
assert_eq!(classes[255], 3);
10861091
}
1092+
1093+
#[test]
1094+
fn full_byte_classes() {
1095+
let mut set = ByteClassSet::new();
1096+
for i in 0..256u16 {
1097+
set.set_range(i as u8, i as u8);
1098+
}
1099+
assert_eq!(set.byte_classes().len(), 256);
1100+
}
10871101
}

0 commit comments

Comments
 (0)