On Mon, 5 Nov 2012, Kenneth Zadeck wrote:

> This switch to doing math within the precision causes many test cases to
> behave differently.   However, I want to know if differently means
> "incorrectly" or "I have fixed problems that we have just decided to live
> with".

As far as I know, the TREE_OVERFLOW settings follow the most sensible 
interpretation of the C standard requirements (that any overflowing 
operation, with signed result type, whose operands are integer constant 
expressions, results in the overall containing expression, wherein that 
overflowing operation is evaluated in the abstract C semantics, not being 
an integer constant expression).

Nothing in the testcases should care in the least about the "two HWI" 
internal implementation - from the front-end perspective, arithmetic 
according to the relevant precision is always right, and overflow should 
always be determined according to that precision.

> The question is why is having a case label of 256 on a unsigned char switch
> legal?

"The integer promotions are performed on the controlling expression. The 
constant expression in each case label is converted to the promoted type 
of the controlling expression." (C11, 6.8.4.2 paragraph 5).  That is, in 
the semantics of C the switch is on an int value, not an unsigned char, 
and 256 is converted to int (which leaves it unchanged).  If the value 
*is* modified by the conversion (say if it's 0x100000000ULL, converted to 
int), that's still valid C, as long as you don't get duplicate case 
labels.

I don't know if the *implementation* of this bit of C does anything funny 
with constants outside the range of their types, but the specification is 
clear enough.

-- 
Joseph S. Myers
jos...@codesourcery.com

Reply via email to