From 8e5d5f1febf8f1bbe1552b25303c7962a72e8953 Mon Sep 17 00:00:00 2001 From: Dmitri Gribenko Date: Mon, 6 Aug 2012 21:31:15 +0000 Subject: [PATCH] Comment AST: DeclInfo: collapse a bunch of boolean flags into an enum. llvm-svn: 161352 --- clang/include/clang/AST/Comment.h | 24 +++++++++++++++--------- clang/include/clang/AST/CommentSema.h | 2 +- clang/lib/AST/Comment.cpp | 19 +++++++------------ clang/lib/AST/CommentSema.cpp | 8 ++++---- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/clang/include/clang/AST/Comment.h b/clang/include/clang/AST/Comment.h index 6006d8d2998f..981f22fd8e5d 100644 --- a/clang/include/clang/AST/Comment.h +++ b/clang/include/clang/AST/Comment.h @@ -925,7 +925,8 @@ struct DeclInfo { QualType ResultType; /// Template parameters that can be referenced by \\tparam if \c ThisDecl is - /// a template. + /// a template (\c IsTemplateDecl or \c IsTemplatePartialSpecialization is + /// true). const TemplateParameterList *TemplateParameters; /// A simplified description of \c ThisDecl kind that should be good enough @@ -963,6 +964,14 @@ struct DeclInfo { TypedefKind }; + /// What kind of template specialization \c ThisDecl is. + enum TemplateDeclKind { + NotTemplate, + Template, + TemplateSpecialization, + TemplatePartialSpecialization + }; + /// If false, only \c ThisDecl is valid. unsigned IsFilled : 1; @@ -970,14 +979,7 @@ struct DeclInfo { unsigned Kind : 3; /// Is \c ThisDecl a template declaration. - unsigned IsTemplateDecl : 1; - - /// Is \c ThisDecl a template specialization. - unsigned IsTemplateSpecialization : 1; - - /// Is \c ThisDecl a template partial specialization. - /// Never true if \c IsFunctionDecl is true. - unsigned IsTemplatePartialSpecialization : 1; + unsigned TemplateKind : 2; /// Is \c ThisDecl an ObjCMethodDecl. unsigned IsObjCMethod : 1; @@ -997,6 +999,10 @@ struct DeclInfo { DeclKind getKind() const LLVM_READONLY { return static_cast(Kind); } + + TemplateDeclKind getTemplateKind() const LLVM_READONLY { + return static_cast(TemplateKind); + } }; /// A full comment attached to a declaration, contains block content. diff --git a/clang/include/clang/AST/CommentSema.h b/clang/include/clang/AST/CommentSema.h index bbb7c94e248a..2fc741e7d1ce 100644 --- a/clang/include/clang/AST/CommentSema.h +++ b/clang/include/clang/AST/CommentSema.h @@ -188,7 +188,7 @@ public: void checkBlockCommandDuplicate(const BlockCommandComment *Command); bool isFunctionDecl(); - bool isTemplateDecl(); + bool isTemplateOrSpecialization(); ArrayRef getParamVars(); diff --git a/clang/lib/AST/Comment.cpp b/clang/lib/AST/Comment.cpp index e35b2a3d5e08..96b09d0e38c6 100644 --- a/clang/lib/AST/Comment.cpp +++ b/clang/lib/AST/Comment.cpp @@ -142,9 +142,7 @@ void DeclInfo::fill() { // Set defaults. Kind = OtherKind; - IsTemplateDecl = false; - IsTemplateSpecialization = false; - IsTemplatePartialSpecialization = false; + TemplateKind = NotTemplate; IsObjCMethod = false; IsInstanceMethod = false; IsClassMethod = false; @@ -174,8 +172,7 @@ void DeclInfo::fill() { ResultType = FD->getResultType(); unsigned NumLists = FD->getNumTemplateParameterLists(); if (NumLists != 0) { - IsTemplateDecl = true; - IsTemplateSpecialization = true; + TemplateKind = TemplateSpecialization; TemplateParameters = FD->getTemplateParameterList(NumLists - 1); } @@ -202,7 +199,7 @@ void DeclInfo::fill() { case Decl::FunctionTemplate: { const FunctionTemplateDecl *FTD = cast(ThisDecl); Kind = FunctionKind; - IsTemplateDecl = true; + TemplateKind = Template; const FunctionDecl *FD = FTD->getTemplatedDecl(); ParamVars = ArrayRef(FD->param_begin(), FD->getNumParams()); @@ -213,7 +210,7 @@ void DeclInfo::fill() { case Decl::ClassTemplate: { const ClassTemplateDecl *CTD = cast(ThisDecl); Kind = ClassKind; - IsTemplateDecl = true; + TemplateKind = Template; TemplateParameters = CTD->getTemplateParameters(); break; } @@ -221,15 +218,13 @@ void DeclInfo::fill() { const ClassTemplatePartialSpecializationDecl *CTPSD = cast(ThisDecl); Kind = ClassKind; - IsTemplateDecl = true; - IsTemplatePartialSpecialization = true; + TemplateKind = TemplatePartialSpecialization; TemplateParameters = CTPSD->getTemplateParameters(); break; } case Decl::ClassTemplateSpecialization: Kind = ClassKind; - IsTemplateDecl = true; - IsTemplateSpecialization = true; + TemplateKind = TemplateSpecialization; break; case Decl::Record: case Decl::CXXRecord: @@ -251,7 +246,7 @@ void DeclInfo::fill() { case Decl::TypeAliasTemplate: { const TypeAliasTemplateDecl *TAT = cast(ThisDecl); Kind = TypedefKind; - IsTemplateDecl = true; + TemplateKind = Template; TemplateParameters = TAT->getTemplateParameters(); break; } diff --git a/clang/lib/AST/CommentSema.cpp b/clang/lib/AST/CommentSema.cpp index 42dd320b5c0d..978c748b7416 100644 --- a/clang/lib/AST/CommentSema.cpp +++ b/clang/lib/AST/CommentSema.cpp @@ -205,7 +205,7 @@ TParamCommandComment *Sema::actOnTParamCommandStart(SourceLocation LocBegin, TParamCommandComment *Command = new (Allocator) TParamCommandComment(LocBegin, LocEnd, Name); - if (!isTemplateDecl()) + if (!isTemplateOrSpecialization()) Diag(Command->getLocation(), diag::warn_doc_tparam_not_attached_to_a_template_decl) << Command->getCommandNameRange(); @@ -226,7 +226,7 @@ void Sema::actOnTParamCommandParamNameArg(TParamCommandComment *Command, Arg); Command->setArgs(llvm::makeArrayRef(A, 1)); - if (!isTemplateDecl()) { + if (!isTemplateOrSpecialization()) { // We already warned that this \\tparam is not attached to a template decl. return; } @@ -536,12 +536,12 @@ bool Sema::isFunctionDecl() { return ThisDeclInfo->getKind() == DeclInfo::FunctionKind; } -bool Sema::isTemplateDecl() { +bool Sema::isTemplateOrSpecialization() { if (!ThisDeclInfo) return false; if (!ThisDeclInfo->IsFilled) inspectThisDecl(); - return ThisDeclInfo->IsTemplateDecl; + return ThisDeclInfo->getTemplateKind() != DeclInfo::NotTemplate; } ArrayRef Sema::getParamVars() {