I was fiddling with one of my kernels, and I found some odd behaviour which seems to be causing switch statements to evaluate incorrectly.
This works:
unsigned int a = 1;
for (...) {
<do stuff based a (value doesn't change)>
if (a < 3) {
a++;
a %= 3;
}
else if (a == 3) {
a = 1337;
}
}
This also works:
unsigned int a = 1;
for (...) {
<do stuff based a (value doesn't change)>
switch(a) {
case 0: a = 1; break;
case 1: a = 2; break;
case 2: a = 0; break;
}
}
This doesn’t:
unsigned int a = 1;
for (...) {
<do stuff based a (value doesn't change)>
switch(a) {
case 0: a = 1; break;
case 1: a = 2; break;
case 2: a = 0; break;
case 3: a = 1337; break;
}
}
The first and third codeblocks are identical logically. The value of a should never be 3, however adding a case for if it is 3 in the switch statement has an effect, while adding a check in an if-else statement doesn’t.