summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-12-12 00:16:02 +0000
committerAnders Carlsson <andersca@mac.com>2009-12-12 00:16:02 +0000
commitc0b2ce14cdc18508fff784c7826b7bb35334fbf0 (patch)
treeab7b9bca29342c3f68f3f0794b3fa0337ed0529e /clang/lib/Sema/SemaDeclCXX.cpp
parent9221e646f538cc0f6d1445ec02da083a94f4574a (diff)
downloadbcm5719-llvm-c0b2ce14cdc18508fff784c7826b7bb35334fbf0.tar.gz
bcm5719-llvm-c0b2ce14cdc18508fff784c7826b7bb35334fbf0.zip
More work on improving the operator delete diagnostics.
llvm-svn: 91187
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp28
1 files changed, 19 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 5712555e7c4..35846602ca0 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -4626,26 +4626,36 @@ CheckOperatorDeleteDeclaration(Sema &SemaRef, const FunctionDecl *FnDecl) {
// Each deallocation function shall return void and its first parameter
// shall be void*.
QualType ResultType = FnDecl->getResultType();
- if (!ResultType->isDependentType() && !ResultType->isVoidType()) {
+ if (ResultType->isDependentType())
+ return SemaRef.Diag(FnDecl->getLocation(),
+ diag::err_operator_new_delete_dependent_result_type)
+ << FnDecl->getDeclName() << SemaRef.Context.VoidTy;
+
+ if (!ResultType->isVoidType())
return SemaRef.Diag(FnDecl->getLocation(),
diag::err_operator_new_delete_invalid_result_type)
<< FnDecl->getDeclName() << SemaRef.Context.VoidTy;
- }
- if (FnDecl->getNumParams() == 0) {
+ if (FnDecl->getDescribedFunctionTemplate() && FnDecl->getNumParams() < 2)
+ return SemaRef.Diag(FnDecl->getLocation(),
+ diag::err_operator_new_delete_template_too_few_parameters)
+ << FnDecl->getDeclName();
+ else if (FnDecl->getNumParams() == 0)
return SemaRef.Diag(FnDecl->getLocation(),
diag::err_operator_new_delete_too_few_parameters)
<< FnDecl->getDeclName();
- }
- QualType FirstParamType =
- SemaRef.Context.getCanonicalType(FnDecl->getParamDecl(0)->getType());
- if (!FirstParamType->isDependentType() &&
- FirstParamType != SemaRef.Context.VoidPtrTy) {
+ QualType FirstParamType = FnDecl->getParamDecl(0)->getType();
+ if (FirstParamType->isDependentType())
+ return SemaRef.Diag(FnDecl->getLocation(),
+ diag::err_operator_delete_dependent_param_type)
+ << FnDecl->getDeclName() << SemaRef.Context.VoidPtrTy;
+
+ if (SemaRef.Context.getCanonicalType(FirstParamType) !=
+ SemaRef.Context.VoidPtrTy)
return SemaRef.Diag(FnDecl->getLocation(),
diag::err_operator_delete_param_type)
<< FnDecl->getDeclName() << SemaRef.Context.VoidPtrTy;
- }
return false;
}
OpenPOWER on IntegriCloud