]> granicus.if.org Git - clang/commitdiff
When performing name lookup for the allocation or deallocation
authorDouglas Gregor <dgregor@apple.com>
Wed, 24 Mar 2010 05:07:21 +0000 (05:07 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 24 Mar 2010 05:07:21 +0000 (05:07 +0000)
operators, make sure that the implicitly-declared global new and
delete operators are always available. Fixes PR5904.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99382 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaLookup.cpp
test/SemaCXX/new-delete-predefined-decl-2.cpp [new file with mode: 0644]

index 9ae520d27a6526eb455e2cc5498f709f98a00073..f1bf88523b5de25ae7ff56cb5c3203fba194a861 100644 (file)
@@ -304,6 +304,23 @@ void LookupResult::configure() {
                  SemaRef.getLangOptions().CPlusPlus,
                  isForRedeclaration());
   IsAcceptableFn = getResultFilter(LookupKind);
+
+  // If we're looking for one of the allocation or deallocation
+  // operators, make sure that the implicitly-declared new and delete
+  // operators can be found.
+  if (!isForRedeclaration()) {
+    switch (Name.getCXXOverloadedOperator()) {
+    case OO_New:
+    case OO_Delete:
+    case OO_Array_New:
+    case OO_Array_Delete:
+      SemaRef.DeclareGlobalNewDelete();
+      break;
+
+    default:
+      break;
+    }
+  }
 }
 
 // Necessary because CXXBasePaths is not complete in Sema.h
diff --git a/test/SemaCXX/new-delete-predefined-decl-2.cpp b/test/SemaCXX/new-delete-predefined-decl-2.cpp
new file mode 100644 (file)
index 0000000..981476d
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -DQUALIFIED -fsyntax-only -verify %s
+
+// PR5904
+void f0(int *ptr) {
+#ifndef QUALIFIED
+  operator delete(ptr);
+#endif
+}
+
+void f1(int *ptr) {
+  ::operator delete[](ptr);
+}