PR middle-end/30017 (ICE in C++ size hook)

Mark Mitchell mark@codesourcery.com
Mon Dec 4 19:13:00 GMT 2006


Richard Guenther wrote:

>> Until then, I'm not sure what to suggest.  Removing the asserts will
>> actually generate wrong code.  For this input:
>>
>>   __builtin_memcpy (a, b, sizeof (*a))
>>
>> if "a" has type "C*", and "C" has virtual bases, then the C++ hook will
>> return the size of C *without virtual bases* which is wrong, since the
>> user said to copy the entire thing.  (This is what I mean by there being
>> no right answer.)  So, I think you have to disable the transformation
>> for C++, at least when the class in question has virtual bases.
> 
> ... I fail to see how the above can create wrong code removing the asserts.
> Surely if sizeof (*a) can give multiple answers the above code will look
> different after gimplification, and the transformation to an assignment
> cannot
> happen because we don't know the size (I expect a conditional in the
> gimplified version).

sizeof (*a) will be expanded by the front end to a constant, with the
correct value.  Then, Jan will turn the code into:

  *a = *b;

Then, the back end will ask "how many bytes should I copy?" using the
hook, and get the size of *a *without virtual bases* which is different
from what the user originally wrote.

-- 
Mark Mitchell
CodeSourcery
mark@codesourcery.com
(650) 331-3385 x713



More information about the Gcc-patches mailing list