From: Anders Carlsson Date: Thu, 30 Apr 2009 23:18:11 +0000 (+0000) Subject: C++ destructors can have a single unnamed void parameter. Fixes . X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7786d1c5d752b90ff74093bd1ffda37daf0dbe6e;p=clang C++ destructors can have a single unnamed void parameter. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70519 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 6e00488c50..54c887e303 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1351,6 +1351,13 @@ void Sema::CheckConstructor(CXXConstructorDecl *Constructor) { ClassDecl->addedConstructor(Context, Constructor); } +static inline bool +FTIHasSingleVoidArgument(DeclaratorChunk::FunctionTypeInfo &FTI) { + return (FTI.NumArgs == 1 && !FTI.isVariadic && FTI.ArgInfo[0].Ident == 0 && + FTI.ArgInfo[0].Param && + FTI.ArgInfo[0].Param.getAs()->getType()->isVoidType()); +} + /// CheckDestructorDeclarator - Called by ActOnDeclarator to check /// the well-formednes of the destructor declarator @p D with type @p /// R. If there are any errors in the declarator, this routine will @@ -1416,7 +1423,7 @@ QualType Sema::CheckDestructorDeclarator(Declarator &D, } // Make sure we don't have any parameters. - if (FTI.NumArgs > 0) { + if (FTI.NumArgs > 0 && !FTIHasSingleVoidArgument(FTI)) { Diag(D.getIdentifierLoc(), diag::err_destructor_with_params); // Delete the parameters. diff --git a/test/SemaCXX/destructor.cpp b/test/SemaCXX/destructor.cpp index f066993c26..f544db0b1b 100644 --- a/test/SemaCXX/destructor.cpp +++ b/test/SemaCXX/destructor.cpp @@ -50,3 +50,7 @@ struct G { G::~G() { } +// +struct H { + ~H(void) { } +};