]> 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>
Fri, 13 May 2022 17:39:30 +0000 (13:39 -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 65fbff3b8933dd20fff80da48e20e75a78ba7f23..53ca229b909fca971da861c599238827d793789e 100644 (file)
@@ -4584,7 +4584,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;
+}