summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExprCXX.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-11-15 16:43:15 +0000
committerAnders Carlsson <andersca@mac.com>2009-11-15 16:43:15 +0000
commit2c9e274e57c6d972c1f3ddf5a44778ac6563ffa1 (patch)
treec8d5140d8e273bf513618b863c59a802b4e93100 /clang/lib/Sema/SemaExprCXX.cpp
parente9a58b10adf7217337613f72ac67187c10c23e17 (diff)
downloadbcm5719-llvm-2c9e274e57c6d972c1f3ddf5a44778ac6563ffa1.tar.gz
bcm5719-llvm-2c9e274e57c6d972c1f3ddf5a44778ac6563ffa1.zip
If we find a deallocation function in the class scope, but it is a placement function we should not look for a deallocation function in the global scope.
llvm-svn: 88851
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 3e07f3495ee..f5ce44e1063 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -844,12 +844,12 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
DeclarationName DeleteName = Context.DeclarationNames.getCXXOperatorName(
ArrayForm ? OO_Array_Delete : OO_Delete);
+ LookupResult Found;
if (Pointee->isRecordType() && !UseGlobal) {
CXXRecordDecl *Record
= cast<CXXRecordDecl>(Pointee->getAs<RecordType>()->getDecl());
// Try to find operator delete/operator delete[] in class scope.
- LookupResult Found;
LookupQualifiedName(Found, Record, DeleteName, LookupOrdinaryName);
if (Found.isAmbiguous()) {
@@ -867,6 +867,21 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
}
}
+ if (!OperatorDelete && !Found.empty()) {
+ // We did find operator delete/operator delete[] declarations, but
+ // none of them were suitable.
+ Diag(StartLoc, diag::err_no_suitable_delete_member_function_found)
+ << DeleteName << Record;
+
+ for (LookupResult::iterator F = Found.begin(), FEnd = Found.end();
+ F != FEnd; ++F) {
+ Diag((*F)->getLocation(),
+ diag::note_delete_member_function_declared_here)
+ << DeleteName;
+ }
+ return ExprError();
+ }
+
if (!Record->hasTrivialDestructor())
if (const CXXDestructorDecl *Dtor = Record->getDestructor(Context))
MarkDeclarationReferenced(StartLoc,
OpenPOWER on IntegriCloud