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

Reply via email to