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 >>>