diff --git a/src/cc65/expr.c b/src/cc65/expr.c index 8b0824c31..aef0679d4 100644 --- a/src/cc65/expr.c +++ b/src/cc65/expr.c @@ -3001,8 +3001,9 @@ static void parseadd (ExprDesc* Expr, int DoArrayRef) } if (!AddDone) { - if (ED_IsLocQuasiConst (&Expr2) && - rscale == 1 && + if (ED_IsLocQuasiConst (&Expr2) && + !IsTypeBitField (Expr2.Type) && + rscale == 1 && CheckedSizeOf (rhst) == SIZEOF_CHAR) { /* Change the order back */ RemoveCode (&Mark); diff --git a/test/val/bug2186.c b/test/val/bug2186.c new file mode 100644 index 000000000..143111d97 --- /dev/null +++ b/test/val/bug2186.c @@ -0,0 +1,39 @@ +/* Bug #2186 - Wrong array indexing when index comes from bit-field */ + +#include + +unsigned failures; + +typedef struct { + char flag : 1; + char index : 7; +} weird_type; + +const char array[] = { '6', '5', '0', '2' }; + +weird_type data; + +int main(void) { + data.flag = 1; + + data.index = 0; + if (array[data.index] != array[0]) + { + ++failures; + printf("Got '%c', expected '%c'\n", array[data.index], array[0]); + } + + data.index = 1; + if (array[data.index] != array[1]) + { + ++failures; + printf("Got '%c', expected '%c'\n", array[data.index], array[1]); + } + + if (failures > 0) + { + printf("Failures: %u\n", failures); + } + + return failures; +} \ No newline at end of file