]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: operator new lookup [PR98249]
authorJason Merrill <jason@redhat.com>
Mon, 11 Apr 2022 17:06:05 +0000 (13:06 -0400)
committerJason Merrill <jason@redhat.com>
Thu, 12 May 2022 21:14:31 +0000 (17:14 -0400)
The standard says, as we quote in the comment just above, that if we don't
find operator new in the allocated type, it should be looked up in the
global scope.  This is specifically ::, not just any namespace, and we
already give an error for an operator new declared in any other namespace.

PR c++/98249

gcc/cp/ChangeLog:

* call.c (build_operator_new_call): Just look in ::.

gcc/testsuite/ChangeLog:

* g++.dg/lookup/new3.C: New test.

gcc/cp/call.c
gcc/testsuite/g++.dg/lookup/new3.C [new file with mode: 0644]

index 29e4a52b6c458397daa2dba3c7097bd5b1cc5ade..49eb673ebccf6aedcb30bbd1d7b94c2e5f40bac9 100644 (file)
@@ -4682,7 +4682,6 @@ build_operator_new_call (tree fnname, vec<tree, va_gc> **args,
 
      we disregard block-scope declarations of "operator new".  */
   fns = lookup_name_real (fnname, 0, 1, /*block_p=*/false, 0, 0);
-  fns = lookup_arg_dependent (fnname, fns, *args);
 
   if (align_arg)
     {
diff --git a/gcc/testsuite/g++.dg/lookup/new3.C b/gcc/testsuite/g++.dg/lookup/new3.C
new file mode 100644 (file)
index 0000000..36afb5b
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/98249
+
+#include <new>
+struct Incomplete;
+template<class T> struct Holder { T t; };
+Holder<Incomplete> *p;
+void test() {
+    ::new (p) int;
+    new (p) int;
+}