30#include "llvm/ADT/FoldingSet.h"
31#include "llvm/Support/Casting.h"
32#include "llvm/Support/Compiler.h"
33#include "llvm/Support/ErrorHandling.h"
34#include "llvm/Support/raw_ostream.h"
43 return (A < B ? -1 : (A > B ? 1 : 0));
70 return LHSSelector.getAsIdentifierInfo()->
getName().compare(
71 RHSSelector.getAsIdentifierInfo()->
getName());
74 for (
unsigned I = 0, N = std::min(LN, RN); I != N; ++I) {
110 llvm_unreachable(
"Invalid DeclarationName Kind!");
120 ClassRec->getDecl()->printName(OS, Policy);
125 InjTy->getDecl()->printName(OS, Policy);
129 ClassType.
print(OS, Policy);
137 StringRef Name = II->getName();
140 if (II->isMangledOpenMPVariantName()) {
141 std::pair<StringRef, StringRef> NameContextPair =
143 OS << NameContextPair.first <<
"["
165 OS <<
"<deduction guide for ";
172 assert(OpName &&
"not an overloaded operator");
175 if (OpName[0] >=
'a' && OpName[0] <=
'z')
189 OS << *Rec->getDecl();
195 Type.print(OS, CXXPolicy);
199 OS <<
"<using-directive>";
203 llvm_unreachable(
"Unexpected declaration name kind");
223 if (TD && TD->getDeclContext()->isDependentContext())
231 llvm::raw_string_ostream OS(
Result);
236void *DeclarationName::getFETokenInfoSlow()
const {
239 llvm_unreachable(
"case Identifier already handled by getFETokenInfo!");
243 return castAsCXXSpecialNameExtra()->FETokenInfo;
245 return castAsCXXOperatorIdName()->FETokenInfo;
247 return castAsCXXDeductionGuideNameExtra()->FETokenInfo;
249 return castAsCXXLiteralOperatorIdName()->FETokenInfo;
251 llvm_unreachable(
"DeclarationName has no FETokenInfo!");
255void DeclarationName::setFETokenInfoSlow(
void *
T) {
258 llvm_unreachable(
"case Identifier already handled by setFETokenInfo!");
262 castAsCXXSpecialNameExtra()->FETokenInfo =
T;
265 castAsCXXOperatorIdName()->FETokenInfo =
T;
268 castAsCXXDeductionGuideNameExtra()->FETokenInfo =
T;
271 castAsCXXLiteralOperatorIdName()->FETokenInfo =
T;
274 llvm_unreachable(
"DeclarationName has no FETokenInfo!");
279 llvm::errs() << *
this <<
'\n';
292 llvm::FoldingSetNodeID ID;
293 ID.AddPointer(Template);
295 void *InsertPos =
nullptr;
296 if (
auto *Name = CXXDeductionGuideNames.FindNodeOrInsertPos(ID, InsertPos))
300 CXXDeductionGuideNames.InsertNode(Name, InsertPos);
308 llvm::FoldingSetNodeID ID;
310 void *InsertPos =
nullptr;
311 if (
auto *Name = CXXConstructorNames.FindNodeOrInsertPos(ID, InsertPos))
312 return {Name, DeclarationName::StoredCXXConstructorName};
316 CXXConstructorNames.InsertNode(SpecialName, InsertPos);
317 return {SpecialName, DeclarationName::StoredCXXConstructorName};
324 llvm::FoldingSetNodeID ID;
326 void *InsertPos =
nullptr;
327 if (
auto *Name = CXXDestructorNames.FindNodeOrInsertPos(ID, InsertPos))
328 return {Name, DeclarationName::StoredCXXDestructorName};
332 CXXDestructorNames.InsertNode(SpecialName, InsertPos);
333 return {SpecialName, DeclarationName::StoredCXXDestructorName};
339 llvm::FoldingSetNodeID ID;
341 void *InsertPos =
nullptr;
343 CXXConversionFunctionNames.FindNodeOrInsertPos(ID, InsertPos))
344 return {Name, DeclarationName::StoredCXXConversionFunctionName};
348 CXXConversionFunctionNames.InsertNode(SpecialName, InsertPos);
349 return {SpecialName, DeclarationName::StoredCXXConversionFunctionName};
363 llvm_unreachable(
"Invalid kind in getCXXSpecialName!");
369 llvm::FoldingSetNodeID ID;
372 void *InsertPos =
nullptr;
373 if (
auto *Name = CXXLiteralOperatorNames.FindNodeOrInsertPos(ID, InsertPos))
377 CXXLiteralOperatorNames.InsertNode(LiteralName, InsertPos);
382 switch (Name.getNameKind()) {
389 setNamedTypeLoc(
nullptr);
423 return TInfo->getType()->containsUnexpandedParameterPack();
427 llvm_unreachable(
"All name kinds handled.");
446 return TInfo->getType()->isInstantiationDependentType();
450 llvm_unreachable(
"All name kinds handled.");
455 llvm::raw_string_ostream OS(
Result);
476 Name.
print(OS, Policy);
490 OS << TInfo->getType().getAsString(Policy);
492 Name.
print(OS, Policy);
495 llvm_unreachable(
"Unexpected declaration name kind");
514 return TInfo->getTypeLoc().getEndLoc();
525 llvm_unreachable(
"Unexpected declaration name kind");
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
static void printCXXConstructorDestructorName(QualType ClassType, raw_ostream &OS, PrintingPolicy Policy)
static int compareInt(unsigned A, unsigned B)
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
This file defines OpenMP AST classes for clauses.
Defines an enumeration for C++ overloaded operators.
Defines the clang::SourceLocation class and associated facilities.
Defines the clang::TypeLoc interface and its subclasses.
Allows QualTypes to be sorted and hence used in maps and sets.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
void * getAsOpaquePtr() const
Retrieve the internal representation of this canonical type.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
SourceLocation getCXXLiteralOperatorNameLoc() const
Return the location of the literal operator name (without the operator keyword).
TypeSourceInfo * getNamedTypeInfo() const
Returns the source type info.
SourceLocation getCXXOperatorNameEndLoc() const
Return the end location of the getCXXOperatorNameRange() range.
The name of a declaration.
static int compare(DeclarationName LHS, DeclarationName RHS)
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
bool isDependentName() const
Determines whether the name itself is dependent, e.g., because it involves a C++ type that is itself ...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
void print(raw_ostream &OS, const PrintingPolicy &Policy) const
std::string getAsString() const
Retrieve the human-readable string for this name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NameKind
The kind of the name stored in this DeclarationName.
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
The injected class name of a C++ class template or class template partial specialization.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
A (possibly-)qualified type.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Smart pointer class that efficiently represents Objective-C method names.
StringRef getNameForSlot(unsigned argIndex) const
Retrieve the name at a given position in the selector.
void print(llvm::raw_ostream &OS) const
Prints the full selector name (e.g. "foo:bar:").
unsigned getNumArgs() const
Encodes a location in the source.
A trivial tuple used to represent a source range.
The base class of all kinds of template declarations (e.g., class, function, etc.).
A container of type source information.
The base class of the type hierarchy.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
const T * getAs() const
Member-template getAs<specific type>'.
Contains the actual identifier that makes up the name of a C++ literal operator.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ NUM_OVERLOADED_OPERATORS
static constexpr StringRef getOpenMPVariantManglingSeparatorStr()
OpenMP variants are mangled early based on their OpenMP context selector.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
@ Result
The result type of a method or function.
const FunctionProtoType * T
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
bool isInstantiationDependent() const
Determine whether this name involves a template parameter.
void printName(raw_ostream &OS, PrintingPolicy Policy) const
printName - Print the human-readable name to a stream.
std::string getAsString() const
getAsString - Retrieve the human-readable string for this name.
bool containsUnexpandedParameterPack() const
Determine whether this name contains an unexpanded parameter pack.
Describes how types, statements, expressions, and declarations should be printed.
void adjustForCPlusPlus()
Adjust this printing policy for cases where it's known that we're printing C++ code (for instance,...
unsigned SuppressScope
Suppresses printing of scope specifiers.
unsigned SuppressTemplateArgsInCXXConstructors
When true, suppresses printing template arguments in names of C++ constructors.
Function object that provides a total ordering on QualType values.