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. > Thanks, > Martin