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>
Mon, 11 Apr 2022 21:30:45 +0000 (17:30 -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.cc (build_operator_new_call): Just look in ::.

gcc/testsuite/ChangeLog:

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

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

index 73fede5..3a8d7e4 100644 (file)
@@ -4899,8 +4899,7 @@ build_operator_new_call (tree fnname, vec<tree, va_gc> **args,
        up in the global scope.
 
      we disregard block-scope declarations of "operator new".  */
-  fns = lookup_name (fnname, LOOK_where::NAMESPACE);
-  fns = lookup_arg_dependent (fnname, fns, *args);
+  fns = lookup_qualified_name (global_namespace, fnname);
 
   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;
+}