unsigned char data[100]; unsigned char* datapos; #define ENT_DAT(_p) (*((unsigned int*)((unsigned char*)(_p) + 3))) void setFoo() { // this line goes wrong. the address generated should be // datapos -5 + 3 but you get datapos + 0x00FE (not 0xFFFE) ENT_DAT(datapos - 5) = 0xffff; } int main() { datapos = data + 5; setFoo(); return 0; }
code i get:
_setFoo: ;bug1.c:9: ENT_DAT(datapos - 5) = 0xffff; ld a,(#_datapos + 0) add a, #0xFE ld d,a ld a,(#_datapos + 1) adc a, #0x00 <<<<< is wrong, should be 0xff ? ld e,a ld l, d ld h, e ld (hl),#0xFF inc hl ld (hl),#0xFF ret _setFoo_end::
sdcc -v
SDCC : mcs51/gbz80/z80/z180/r2k/r3ka/ds390/pic16/pic14/TININative/ds400/hc08/s08
3.3.0 #8604 (May 11 2013) (MINGW32)
more info contact,
hughserious@gmail.com
thanks,
-- hugh.
Increasing priority, since bad code is generated silently.
Philipp
Diff:
I simplified test case to
char * p;
void f1(void)
{
* (p + 3 - 5) = 0xaa;
}
void f2(void)
{
* ((char * ) (p + 3 - 5)) = 0xaa;
}
f1() was right, and f2() went wrong even in the AST stage.
Last edit: Ben Shi 2015-01-23
Fixed in reversion #9160.