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; + } 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; } } Thanks, Martin > >> Thanks, >> Martin