summaryrefslogtreecommitdiff
path: root/clang/lib/AST/TemplateName.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/AST/TemplateName.cpp')
-rw-r--r--clang/lib/AST/TemplateName.cpp70
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