diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-12-12 00:16:02 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-12-12 00:16:02 +0000 |
| commit | c0b2ce14cdc18508fff784c7826b7bb35334fbf0 (patch) | |
| tree | ab7b9bca29342c3f68f3f0794b3fa0337ed0529e /clang/lib/Sema/SemaDeclCXX.cpp | |
| parent | 9221e646f538cc0f6d1445ec02da083a94f4574a (diff) | |
| download | bcm5719-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.cpp | 28 |
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; } |

