diff options
Diffstat (limited to 'include/clang/AST/TemplateBase.h')
-rw-r--r-- | include/clang/AST/TemplateBase.h | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/include/clang/AST/TemplateBase.h b/include/clang/AST/TemplateBase.h index a1920253de78a..6898ef4e1b8a4 100644 --- a/include/clang/AST/TemplateBase.h +++ b/include/clang/AST/TemplateBase.h @@ -252,7 +252,7 @@ public: /// Determine whether this template argument is a pack expansion. bool isPackExpansion() const; - + /// Retrieve the type for a type template argument. QualType getAsType() const { assert(getKind() == Type && "Unexpected kind"); @@ -288,14 +288,14 @@ public: TemplateName getAsTemplateOrTemplatePattern() const { assert((getKind() == Template || getKind() == TemplateExpansion) && "Unexpected kind"); - + return TemplateName::getFromVoidPointer(TemplateArg.Name); } /// Retrieve the number of expansions that a template template argument /// expansion will produce, if known. Optional<unsigned> getNumTemplateExpansions() const; - + /// Retrieve the template argument as an integral value. // FIXME: Provide a way to read the integral data without copying the value. llvm::APSInt getAsIntegral() const { @@ -378,13 +378,13 @@ public: /// Print this template argument to the given output stream. void print(const PrintingPolicy &Policy, raw_ostream &Out) const; - + /// Debugging aid that dumps the template argument. void dump(raw_ostream &Out) const; /// Debugging aid that dumps the template argument to standard error. void dump() const; - + /// Used to insert TemplateArguments into FoldingSets. void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const; }; @@ -411,9 +411,9 @@ public: constexpr TemplateArgumentLocInfo() : Template({nullptr, nullptr, 0, 0}) {} TemplateArgumentLocInfo(TypeSourceInfo *TInfo) : Declarator(TInfo) {} - + TemplateArgumentLocInfo(Expr *E) : Expression(E) {} - + TemplateArgumentLocInfo(NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateNameLoc, SourceLocation EllipsisLoc) { @@ -432,14 +432,14 @@ public: } NestedNameSpecifierLoc getTemplateQualifierLoc() const { - return NestedNameSpecifierLoc(Template.Qualifier, + return NestedNameSpecifierLoc(Template.Qualifier, Template.QualifierLocData); } - + SourceLocation getTemplateNameLoc() const { return SourceLocation::getFromRawEncoding(Template.TemplateNameLoc); } - + SourceLocation getTemplateEllipsisLoc() const { return SourceLocation::getFromRawEncoding(Template.EllipsisLoc); } @@ -465,10 +465,16 @@ public: TemplateArgumentLoc(const TemplateArgument &Argument, Expr *E) : Argument(Argument), LocInfo(E) { - assert(Argument.getKind() == TemplateArgument::Expression); + + // Permit any kind of template argument that can be represented with an + // expression + assert(Argument.getKind() == TemplateArgument::NullPtr || + Argument.getKind() == TemplateArgument::Integral || + Argument.getKind() == TemplateArgument::Declaration || + Argument.getKind() == TemplateArgument::Expression); } - TemplateArgumentLoc(const TemplateArgument &Argument, + TemplateArgumentLoc(const TemplateArgument &Argument, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateNameLoc, SourceLocation EllipsisLoc = SourceLocation()) @@ -477,13 +483,13 @@ public: assert(Argument.getKind() == TemplateArgument::Template || Argument.getKind() == TemplateArgument::TemplateExpansion); } - + /// - Fetches the primary location of the argument. SourceLocation getLocation() const { if (Argument.getKind() == TemplateArgument::Template || Argument.getKind() == TemplateArgument::TemplateExpansion) return getTemplateNameLoc(); - + return getSourceRange().getBegin(); } @@ -528,13 +534,13 @@ public: Argument.getKind() == TemplateArgument::TemplateExpansion); return LocInfo.getTemplateQualifierLoc(); } - + SourceLocation getTemplateNameLoc() const { assert(Argument.getKind() == TemplateArgument::Template || Argument.getKind() == TemplateArgument::TemplateExpansion); return LocInfo.getTemplateNameLoc(); - } - + } + SourceLocation getTemplateEllipsisLoc() const { assert(Argument.getKind() == TemplateArgument::TemplateExpansion); return LocInfo.getTemplateEllipsisLoc(); @@ -689,7 +695,7 @@ inline const TemplateArgument & assert(Idx < getNumArgs() && "Template argument out of range"); return getArgs()[Idx]; } - + } // namespace clang #endif // LLVM_CLANG_AST_TEMPLATEBASE_H |