On Mon, Jan 16, 2012 at 3:48 PM, Aaron Ballman <[email protected]> wrote: > On Mon, Jan 16, 2012 at 1:12 PM, Eli Friedman <[email protected]> wrote: >> On Mon, Jan 16, 2012 at 10:26 AM, jahanian <[email protected]> wrote: >>> >>> On Jan 16, 2012, at 10:20 AM, Eli Friedman wrote: >>> >>> On Mon, Jan 16, 2012 at 10:14 AM, Aaron Ballman <[email protected]> >>> wrote: >>> >>> On Mon, Jan 16, 2012 at 11:56 AM, David Blaikie <[email protected]> wrote: >>> >>> >>> I'll come up with some test cases to check this out tonight, and pass >>> >>> them along to verify I understand the concerns properly. >>> >>> >>> Okay... I'm specifically concerned about the code generation for >>> non-constant-folded-switch containing a constant-folded switch. >>> >>> >>> Just committed a test case which seems to handle this correctly. >> >> Managed to come up with the testcase I was thinking of: >> >> #include <stdio.h> >> int test(int val){ >> switch (val) { >> case 4: >> do { >> switch (6) { >> case 6: do { case 5: printf("bad\n"); } while (0); >> }; >> } while (0); >> } >> return 0; >> } >> >> int main(void) { >> return test(5); >> } > > I just had the chance to try out this test case, and you're right, it > does produce the wrong code in this instance. It emits the case 5 > against the outer switch (because SwitchInsn is non-null). > > I'll think about ways to handle this, but if anyone has suggestions > they'd like to share, I'm all ears.
A couple of thoughts: The moderate hack: Set SwitchInsn to null while we're evaluating the statement inside a constant-folded switch. The moderately less hacky, maybe: Allocate a constant, reserved SwitchInsn somewhere (or indeed allocate anything in memory & just reinterpret_cast it away) & set that as the switch whenever we're evaluating a constant-folded switch. Minor variation: use a PointerIntPair for SwitchInsn - with the int being a bool set to 'true' if we're evaluating a constant folded switch. _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
