On 06/15/2015 11:13 AM, Andrew Pinski wrote:
> On Mon, Jun 15, 2015 at 2:09 AM, Martin Liška <mli...@suse.cz> wrote:
>> On 06/11/2015 08:19 PM, Richard Biener wrote:
>>> On June 11, 2015 7:50:36 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> 
>>> wrote:
>>>> On Fri, Jun 12, 2015 at 12:58:12AM +0800, pins...@gmail.com wrote:
>>>>> This is just a bug in the older compiler. There was a change to fix
>>>> in
>>>>> placement new operator.  I can't find the reference right now but
>>>> this is
>>>>> the same issue as that.
>>>>
>>>> I'm not claiming 4.1 is aliasing bug free, there are various known
>>>> issues in
>>>> it.  But, is that the case here?
>>>>
>>>>  empty_var = onepart_pool (onepart).allocate ();
>>>>  empty_var->dv = dv;
>>>>  empty_var->refcount = 1;
>>>>  empty_var->n_var_parts = 0;
>>>>
>>>> doesn't really seem to use operator new at all, so I'd say the bug is
>>>> in
>>>> all the spots that call allocate () method of the pool, but don't
>>>> really
>>>> use operator new.
>>>
>>> Yeah.  BTW, I see the same issue on x86_64 and on ia64 with a gcc 4.1 host 
>>> compiler.  I think allocate itself should use placement new, not just a 
>>> static pointer conversion.
>>>
>>> Richard.
>>
>> Hi.
>>
>> What do you mean by calling placement new? Currently 
>> pool_allocator<T>::allocate calls placement new as a last statement in the 
>> function:
>>
>>   return (T *)(header);
> 
> That is only a cast and not a placement new.
> Try this instead:
>   return new(header) T();

Ah, I overlooked that it's not a placement new, but just static casting.
Anyway, if I added:

cselib_val () {}

to struct cselib_val and changed the cast to placement new:
  char *ptr = (char *) header;
  return new (ptr) T ();

I got following compilation error:

In file included from ../../gcc/alias.c:46:0:
../../gcc/alloc-pool.h: In instantiation of ‘T* pool_allocator<T>::allocate() 
[with T = cselib_val]’:
../../gcc/cselib.h:51:27:   required from here
../../gcc/alloc-pool.h:416:23: error: no matching function for call to 
‘cselib_val::operator new(sizetype, char*&)’
   return new (ptr) T ();
                       ^
In file included from ../../gcc/alias.c:47:0:
../../gcc/cselib.h:49:16: note: candidate: static void* cselib_val::operator 
new(size_t)
   inline void *operator new (size_t)
                ^
../../gcc/cselib.h:49:16: note:   candidate expects 1 argument, 2 provided

I am wondering if I can combine overwritten new operator, which is going to 
internally use placement new with a default
ctor?

Martin



> 
> Thanks,
> Andrew
> 
>>
>> Martin
>>
>>>
>>>>      Jakub
>>>
>>>
>>

Reply via email to