Hi Jason,
On 22/07/16 04:01, Jason Merrill wrote:
71913 is a case where unsafe_copy_elision_p was being too
conservative. We can allow copy elision in a new expression; the only
way we could end up initializing a base subobject without knowing it
would be through a placement new, in which case we would already be
using the wrong (complete object) constructor, so copy elision doesn't
make it any worse.
diff --git a/gcc/testsuite/g++.dg/init/elide5.C
b/gcc/testsuite/g++.dg/init/elide5.C
new file mode 100644
index 0000000..0a9978c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/elide5.C
@@ -0,0 +1,27 @@
+// PR c++/71913
+// { dg-do link { target c++11 } }
+
+void* operator new(unsigned long, void* p) { return p; }
g++.dg/init/elide5.C fails on target whose SIZE_TYPE is not "long
unsigned int".
testsuite/g++.dg/init/elide5.C:4:42: error: 'operator new' takes type
'size_t' ('unsigned int') as first parameter [-fpermissive]
I have checked, for most 32 bit architectures or ABI, the SIZE_TYPE is
"unsigned int". arm is one of them.
To make this test case portable, will __SIZE_TYPE__ be better in this
case, instead of "unsigned long" as first argument of new operator?
(sorry for the duplicate reply in the bugzilla, I just found the email here)
Regards,
Renlin