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. Thanks, Martin
diff --git a/gcc/alloc-pool.h b/gcc/alloc-pool.h index 1785df5..4b4bc56 100644 --- a/gcc/alloc-pool.h +++ b/gcc/alloc-pool.h @@ -413,7 +413,8 @@ pool_allocator<T>::allocate () VALGRIND_DISCARD (VALGRIND_MAKE_MEM_UNDEFINED (header, size)); /* Call default constructor. */ - return (T *)(header); + char *ptr = (char *) header; + return new (ptr) T (); } /* Puts PTR back on POOL's free list. */ diff --git a/gcc/cselib.h b/gcc/cselib.h index cdd06ad..a0da27f 100644 --- a/gcc/cselib.h +++ b/gcc/cselib.h @@ -42,6 +42,9 @@ struct cselib_val struct cselib_val *next_containing_mem; + /* Default constructor. */ + cselib_val () {} + /* Pool allocation new operator. */ inline void *operator new (size_t) { @@ -67,6 +70,9 @@ struct elt_loc_list { /* The insn that made the equivalence. */ rtx_insn *setting_insn; + /* Default constructor. */ + elt_loc_list () {} + /* Pool allocation new operator. */ inline void *operator new (size_t) {