diff options
Diffstat (limited to 'clang/lib/AST/TemplateName.cpp')
-rw-r--r-- | clang/lib/AST/TemplateName.cpp | 70 |
1 files changed, 37 insertions, 33 deletions
diff --git a/clang/lib/AST/TemplateName.cpp b/clang/lib/AST/TemplateName.cpp index 06e1dcec74492..40a8736ae1afd 100644 --- a/clang/lib/AST/TemplateName.cpp +++ b/clang/lib/AST/TemplateName.cpp @@ -11,8 +11,10 @@ //===----------------------------------------------------------------------===// #include "clang/AST/TemplateName.h" +#include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" #include "clang/AST/DeclTemplate.h" +#include "clang/AST/DependenceFlags.h" #include "clang/AST/NestedNameSpecifier.h" #include "clang/AST/PrettyPrinter.h" #include "clang/AST/TemplateBase.h" @@ -168,52 +170,54 @@ TemplateName TemplateName::getNameToSubstitute() const { return TemplateName(Decl); } -bool TemplateName::isDependent() const { +TemplateNameDependence TemplateName::getDependence() const { + auto D = TemplateNameDependence::None; + switch (getKind()) { + case TemplateName::NameKind::QualifiedTemplate: + D |= toTemplateNameDependence( + getAsQualifiedTemplateName()->getQualifier()->getDependence()); + break; + case TemplateName::NameKind::DependentTemplate: + D |= toTemplateNameDependence( + getAsDependentTemplateName()->getQualifier()->getDependence()); + break; + case TemplateName::NameKind::SubstTemplateTemplateParmPack: + D |= TemplateNameDependence::UnexpandedPack; + break; + case TemplateName::NameKind::OverloadedTemplate: + llvm_unreachable("overloaded templates shouldn't survive to here."); + default: + break; + } if (TemplateDecl *Template = getAsTemplateDecl()) { - if (isa<TemplateTemplateParmDecl>(Template)) - return true; + if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(Template)) { + D |= TemplateNameDependence::DependentInstantiation; + if (TTP->isParameterPack()) + D |= TemplateNameDependence::UnexpandedPack; + } // FIXME: Hack, getDeclContext() can be null if Template is still // initializing due to PCH reading, so we check it before using it. // Should probably modify TemplateSpecializationType to allow constructing // it without the isDependent() checking. - return Template->getDeclContext() && - Template->getDeclContext()->isDependentContext(); + if (Template->getDeclContext() && + Template->getDeclContext()->isDependentContext()) + D |= TemplateNameDependence::DependentInstantiation; + } else { + D |= TemplateNameDependence::DependentInstantiation; } + return D; +} - assert(!getAsOverloadedTemplate() && - "overloaded templates shouldn't survive to here"); - - return true; +bool TemplateName::isDependent() const { + return getDependence() & TemplateNameDependence::Dependent; } bool TemplateName::isInstantiationDependent() const { - if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) { - if (QTN->getQualifier()->isInstantiationDependent()) - return true; - } - - return isDependent(); + return getDependence() & TemplateNameDependence::Instantiation; } bool TemplateName::containsUnexpandedParameterPack() const { - if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) { - if (QTN->getQualifier()->containsUnexpandedParameterPack()) - return true; - } - - if (TemplateDecl *Template = getAsTemplateDecl()) { - if (TemplateTemplateParmDecl *TTP - = dyn_cast<TemplateTemplateParmDecl>(Template)) - return TTP->isParameterPack(); - - return false; - } - - if (DependentTemplateName *DTN = getAsDependentTemplateName()) - return DTN->getQualifier() && - DTN->getQualifier()->containsUnexpandedParameterPack(); - - return getAsSubstTemplateTemplateParmPack() != nullptr; + return getDependence() & TemplateNameDependence::UnexpandedPack; } void |