[Issue 1977] Relax warnings for implicit narrowing conversions caused by promotions

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Nov 24 11:41:11 PST 2008


http://d.puremagic.com/issues/show_bug.cgi?id=1977





------- Comment #13 from schveiguy at yahoo.com  2008-11-24 13:41 -------
(In reply to comment #12)
> (In reply to comment #10)
> > c += 'A' - 'a';
> > 
> > Casting seems too strict a requirement in these types of situations.  I can't
> > imagine that anyone has a positive experience with these warnings, most are
> > just going to grumble, then insert the cast without thinking about it.
> 
> Notice that in the particular example you mention, the code does go through
> because it uses +=.

Wow, that surprises me.

c = c + c should be equivalent to c += c;

So right there, either both should be invalid, or neither should.  Both have an
equal chance of overflow.

In fact, using obj2asm, I found that both are essentially equivalent.  With
optimization on, here are the two different code generations (minus all
bookkeeping stuff):

char foo(char c)
{
   c += c; // version 1
   c = c + c; // version 2
   return c;
}

c += c;
<               mov     ECX,EAX
<               add     CL,CL
<               mov     AL,CL

c = c + c;
>               push    EAX
>               movzx   ECX,byte ptr -4[EBP]
>               mov     EAX,ECX
>               add     AL,AL

These are essentially the same, except in the second version, the compiler
optimizer didn't see the oportunity to get down to the same code as the first
version (there's probably even more optimization to be had even in the first
version).  But the danger of overflow still exists in both cases.  I'm not sure
why one is treated more dangerously than the other by the compiler.


-- 



More information about the Digitalmars-d-bugs mailing list