On June 16, 2015 5:31:57 PM GMT+02:00, "Martin Liška" <mli...@suse.cz> wrote:
>On 06/16/2015 04:02 PM, Richard Biener wrote:
>> On Tue, Jun 16, 2015 at 3:38 PM, Martin Liška <mli...@suse.cz> wrote:
>>> On 06/16/2015 03:17 PM, Richard Biener wrote:
>>>> On Tue, Jun 16, 2015 at 11:26 AM, Martin Liška <mli...@suse.cz>
>wrote:
>>>>> On 06/15/2015 07:31 PM, Marc Glisse wrote:
>>>>>> On Mon, 15 Jun 2015, Martin Liška wrote:
>>>>>>
>>>>>>> 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
>>>>>>
>>>>>> #include <new>
>>>>>>
>>>>>
>>>>> Hi.
>>>>>
>>>>> <new> header file is not missing (explicit addition of the file
>does not help).
>>>>> Feel free to play with following patch which should fix cselib.h
>compilation error.
>>>>
>>>> cselib_val overrides the new operator but fails to provide an
>overload
>>>> for the placement new
>>>> form.  Fix that and it should work (of course it gets quite awkward
>>>> with its 'new' calling
>>>> pool.allocate and its placement new doing value-construction
>then...)
>>>>
>>>> Richard.
>>>
>>> Do you mean Richard following changes:
>>>
>>> alloc-pool.h (allocate):
>>> ...
>>> +  /* Placement new contructor.  */
>>> +  inline void *operator new (size_t, elt_loc_list *&ptr)
>>> +  {
>>> +    return ptr;
>>> +  }
>> 
>> That should be there with including <new>
>> 
>>> and e.g. cselib.h:
>>>
>>> struct cselib_val
>>> {
>>>   /* Pool allocation new operator.  */
>>>   inline void *operator new (size_t)
>>>   {
>>>     return pool.allocate ();
>>>   }
>>>
>>>   /* Placement new contructor.  */
>>>   inline void *operator new (size_t, char *&ptr)
>>>   {
>>>     return ptr;
>>>   }
>> 
>> Yes, though I wonder whether cselib_val should really have undefined
>> contents after
>> allocating it?  (or does the pool allocator zero the memory?)
>> 
>> Richard.
>
>Hio.
>
>I've added calling of placement new operators and memset a memory, look
>the patch
>works for me.

It might be better to just dispatch to
::new?

Richard.

>
>If it's the right way, I'll write Changelog and run testsuite.
>
>Thanks,
>Martin
>
>> 
>>> }
>>>
>>> Thanks,
>>> Martin
>>>
>>>
>>>
>>>>
>>>>> Thanks,
>>>>> Martin
>>>


Reply via email to