tccgen.c: Give error if statement expression found when const wanted.

Some test cases:

#define SE ({ switch (0) { } 0; })

// Should give error:
int x = SE;
void f(void) { static int x = SE; }
void f(void) { enum e { a = SE }; }
void f(void) { switch (0) { case SE: break; } }

// Correct:
int f(void) { return SE; }
int f(void) { return sizeof(SE); }
This commit is contained in:
Edmund Grimley Evans 2015-11-26 12:24:34 +00:00
parent 51c3465a49
commit 99372bb1d3

View File

@ -3831,12 +3831,8 @@ ST_FUNC void unary(void)
gen_cast(&type);
}
} else if (tok == '{') {
/*
if (nocode_wanted)
tcc_error("statement expression in global scope"); */
/* this check breaks compilation of the linux 2.4.26 with the meesage:
linux/include/net/tcp.h:945: error: statement expression in global scope */
if (const_wanted)
tcc_error("expected constant");
/* save all registers */
save_regs(0);
/* statement expression : we do not accept break/continue