13#ifndef LLVM_CLANG_AST_TEMPLATENAME_H
14#define LLVM_CLANG_AST_TEMPLATENAME_H
19#include "llvm/ADT/FoldingSet.h"
20#include "llvm/ADT/PointerIntPair.h"
21#include "llvm/ADT/PointerUnion.h"
22#include "llvm/Support/PointerLikeTypeTraits.h"
30class DependentTemplateName;
33class NestedNameSpecifier;
35class OverloadedTemplateStorage;
36class AssumedTemplateStorage;
37class DeducedTemplateStorage;
39class QualifiedTemplateName;
40class SubstTemplateTemplateParmPackStorage;
41class SubstTemplateTemplateParmStorage;
42class TemplateArgument;
44class TemplateTemplateParmDecl;
60 LLVM_PREFERRED_TYPE(
Kind)
123 return reinterpret_cast<NamedDecl **
>(
this + 1);
126 return reinterpret_cast<NamedDecl *
const *
>(
this + 1);
130 unsigned size()
const {
return Bits.Data; }
149 public llvm::FoldingSetNode {
151 llvm::PointerIntPair<Decl *, 1, bool> AssociatedDeclAndFinal;
155 Decl *AssociatedDecl,
unsigned Index,
160 Decl *getAssociatedDecl()
const;
167 bool getFinal()
const;
176 void Profile(llvm::FoldingSetNodeID &
ID,
ASTContext &Context);
178 static void Profile(llvm::FoldingSetNodeID &
ID,
ASTContext &Context,
180 unsigned Index,
bool Final);
189 operator bool()
const {
return !Args.empty(); }
296 TemplateDecl *getAsTemplateDecl(
bool IgnoreDeduced =
false)
const;
301 std::pair<TemplateDecl *, DefaultArguments>
302 getTemplateDeclAndDefaultArgs()
const;
330 getAsSubstTemplateTemplateParmPack()
const;
347 std::optional<TemplateName> desugar(
bool IgnoreDeduced)
const;
351 TemplateNameDependence getDependence()
const;
354 bool isDependent()
const;
358 bool isInstantiationDependent()
const;
362 bool containsUnexpandedParameterPack()
const;
374 Qualified Qual = Qualified::AsWritten)
const;
384 ID.AddPointer(Storage.getOpaqueValue());
402const StreamingDiagnostic &
operator<<(
const StreamingDiagnostic &DB,
412 Decl *AssociatedDecl;
415 Decl *AssociatedDecl,
unsigned Index,
416 std::optional<unsigned> PackIndex)
418 PackIndex ? *PackIndex + 1 : 0),
419 Replacement(Replacement), AssociatedDecl(AssociatedDecl) {
420 assert(AssociatedDecl !=
nullptr);
435 return Bits.Data - 1;
441 void Profile(llvm::FoldingSetNodeID &
ID);
443 static void Profile(llvm::FoldingSetNodeID &
ID,
TemplateName Replacement,
444 Decl *AssociatedDecl,
unsigned Index,
445 std::optional<unsigned> PackIndex);
449 public llvm::FoldingSetNode {
466 void Profile(llvm::FoldingSetNodeID &
ID,
const ASTContext &Context)
const;
468 static void Profile(llvm::FoldingSetNodeID &
ID,
const ASTContext &Context,
501 llvm::PointerIntPair<NestedNameSpecifier *, 1> Qualifier;
512 : Qualifier(NNS, TemplateKeyword ? 1 : 0), UnderlyingTemplate(Template) {
513 assert(UnderlyingTemplate.
getKind() == TemplateName::Template ||
514 UnderlyingTemplate.
getKind() == TemplateName::UsingTemplate);
529 Profile(
ID, getQualifier(), hasTemplateKeyword(), UnderlyingTemplate);
535 ID.AddBoolean(TemplateKeyword);
557 llvm::PointerIntPair<NestedNameSpecifier *, 1, bool> Qualifier;
583 CanonicalTemplateName(this) {}
585 DependentTemplateName(NestedNameSpecifier *Qualifier,
589 CanonicalTemplateName(Canon) {}
591 DependentTemplateName(NestedNameSpecifier *Qualifier,
592 OverloadedOperatorKind Operator)
594 CanonicalTemplateName(this) {}
596 DependentTemplateName(NestedNameSpecifier *Qualifier,
597 OverloadedOperatorKind Operator,
600 CanonicalTemplateName(Canon) {}
611 assert(isIdentifier() &&
"Template name isn't an identifier?");
621 assert(isOverloadedOperator() &&
622 "Template name isn't an overloaded operator?");
630 Profile(
ID, getQualifier(), getOperator());
636 ID.AddBoolean(
false);
644 ID.AddInteger(Operator);
664 static constexpr int NumLowBitsAvailable = 0;
static llvm::GlobalValue::DLLStorageClassTypes getStorage(CodeGenModule &CGM, StringRef Name)
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
static Decl::Kind getKind(const Decl *D)
static void print(llvm::raw_ostream &OS, const T &V, ASTContext &ASTCtx, QualType Ty)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
static StringRef getIdentifier(const Token &Tok)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
A structure for storing the information associated with a name that has been assumed to be a template...
Decl - This represents one declaration (or definition), e.g.
TemplateName getUnderlying() const
DefaultArguments getDefaultArguments() const
Represents a dependent template name that cannot be resolved prior to template instantiation.
OverloadedOperatorKind Operator
The overloaded operator name.
OverloadedOperatorKind getOperator() const
Return the overloaded operator to which this template name refers.
bool isIdentifier() const
Determine whether this template name refers to an identifier.
static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS, OverloadedOperatorKind Operator)
NestedNameSpecifier * getQualifier() const
Return the nested name specifier that qualifies this name.
static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS, const IdentifierInfo *Identifier)
const IdentifierInfo * getIdentifier() const
Returns the identifier to which this template name refers.
const IdentifierInfo * Identifier
The identifier template name.
void Profile(llvm::FoldingSetNodeID &ID)
bool isOverloadedOperator() const
Determine whether this template name refers to an overloaded operator.
One of these records is kept for each identifier that is lexed.
This represents a decl that may have a name.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
A structure for storing the information associated with an overloaded template name.
llvm::ArrayRef< NamedDecl * > decls() const
NamedDecl *const * iterator
Represents a template name as written in source code.
static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS, bool TemplateKeyword, TemplateName TN)
void Profile(llvm::FoldingSetNodeID &ID)
TemplateName getUnderlyingTemplate() const
Return the underlying template name.
NestedNameSpecifier * getQualifier() const
Return the nested name specifier that qualifies this name.
bool hasTemplateKeyword() const
Whether the template name was prefixed by the "template" keyword.
A structure for storing an already-substituted template template parameter pack.
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
A structure for storing the information associated with a substituted template template parameter.
TemplateName getReplacement() const
std::optional< unsigned > getPackIndex() const
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
Represents a template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
Represents a C++ template name within the type system.
bool operator==(TemplateName Other) const
Structural equality.
static TemplateName getFromVoidPointer(void *Ptr)
Build a template name from a void pointer.
bool operator!=(TemplateName Other) const
void * getAsVoidPointer() const
Retrieve the template name as a void pointer.
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
void Profile(llvm::FoldingSetNodeID &ID)
TemplateName getUnderlying() const
void dump(raw_ostream &OS, const ASTContext &Context) const
Debugging aid that dumps the template name.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Implementation class used to describe either a set of overloaded template names or an already-substit...
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack()
UncommonTemplateNameStorage(Kind Kind, unsigned Index, unsigned Data)
@ SubstTemplateTemplateParm
@ SubstTemplateTemplateParmPack
SubstTemplateTemplateParmStorage * getAsSubstTemplateTemplateParm()
AssumedTemplateStorage * getAsAssumedTemplateName()
DeducedTemplateStorage * getAsDeducedTemplateName()
OverloadedTemplateStorage * getAsOverloadedStorage()
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
@ Other
Other implicit parameter.
Diagnostic wrappers for TextAPI types for error reporting.
ArrayRef< TemplateArgument > Args
Describes how types, statements, expressions, and declarations should be printed.
unsigned Data
The pack index, or the number of stored templates or template arguments, depending on which subclass ...
static void * getAsVoidPointer(clang::TemplateName TN)
static clang::TemplateName getFromVoidPointer(void *Ptr)