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" 40 using namespace clang;
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) {
116 llvm_unreachable(
"Invalid DeclarationName Kind!");
126 OS << *ClassRec->getDecl();
131 OS << *InjTy->getDecl();
135 ClassType.
print(OS, Policy);
159 OS <<
"<deduction guide for ";
164 case DeclarationName::CXXOperatorName: { 165 static const char *const OperatorNames[NUM_OVERLOADED_OPERATORS] = { 167 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 169 #include "clang/Basic/OperatorKinds.def" 171 const char *OpName = OperatorNames[getCXXOverloadedOperator()]; 172 assert(OpName && "not an overloaded operator"); 175 if (OpName[0] >= 'a
' && OpName[0] <= 'z
') 181 case DeclarationName::CXXLiteralOperatorName: 182 OS << "operator\"\"" << getCXXLiteralIdentifier()->getName(); 185 case DeclarationName::CXXConversionFunctionName: { 187 QualType Type = getCXXNameType(); 188 if (const RecordType *Rec = Type->getAs<RecordType>()) { 189 OS << *Rec->getDecl(); 192 // We know we're printing
C++ here, ensure we
print 'bool' properly.
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);
236 void *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!");
255 void 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';
285 CXXOperatorNames[Op].
Kind = static_cast<OverloadedOperatorKind>(Op);
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);
389 NamedType.TInfo =
nullptr;
409 switch (Name.getNameKind()) {
424 return TInfo->getType()->containsUnexpandedParameterPack();
426 return Name.getCXXNameType()->containsUnexpandedParameterPack();
428 llvm_unreachable(
"All name kinds handled.");
432 switch (Name.getNameKind()) {
447 return TInfo->getType()->isInstantiationDependentType();
449 return Name.getCXXNameType()->isInstantiationDependentType();
451 llvm_unreachable(
"All name kinds handled.");
456 llvm::raw_string_ostream OS(Result);
462 switch (Name.getNameKind()) {
487 OS << TInfo->getType().getAsString(PP);
492 llvm_unreachable(
"Unexpected declaration name kind");
496 switch (Name.getNameKind()) {
502 unsigned raw = LocInfo.CXXOperatorName.EndOpNameLoc;
507 unsigned raw = LocInfo.CXXLiteralOperatorName.OpNameLoc;
515 return TInfo->getTypeLoc().getEndLoc();
526 llvm_unreachable(
"Unexpected declaration name kind");
Defines the clang::ASTContext interface.
Smart pointer class that efficiently represents Objective-C method names.
unsigned getRawEncoding() const
When a SourceLocation itself cannot be used, this returns an (opaque) 32-bit integer encoding for it...
A (possibly-)qualified type.
NameKind
The kind of the name stored in this DeclarationName.
C Language Family Type Representation.
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
Defines the C++ template declaration subclasses.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
const DiagnosticBuilder & operator<<(const DiagnosticBuilder &DB, const Attr *At)
The base class of the type hierarchy.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
A container of type source information.
bool isInstantiationDependent() const
Determine whether this name involves a template parameter.
const T * getAs() const
Member-template getAs<specific type>'.
Describes how types, statements, expressions, and declarations should be printed. ...
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
One of these records is kept for each identifier that is lexed.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
static SourceLocation getFromRawEncoding(unsigned Encoding)
Turn a raw encoding of a SourceLocation object into a real SourceLocation.
NameKind getNameKind() const
Determine what kind of name this is.
static int compareInt(unsigned A, unsigned B)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool isDependentName() const
Determines whether the name itself is dependent, e.g., because it involves a C++ type that is itself ...
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
bool containsUnexpandedParameterPack() const
Determine whether this name contains an unexpanded parameter pack.
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
unsigned SuppressTemplateArgsInCXXConstructors
When true, suppresses printing template arguments in names of C++ constructors.
Function object that provides a total ordering on QualType values.
Allows QualTypes to be sorted and hence used in maps and sets.
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function)...
Defines the clang::LangOptions interface.
static void printCXXConstructorDestructorName(QualType ClassType, raw_ostream &OS, PrintingPolicy Policy)
std::string getAsString() const
Retrieve the human-readable string for this name.
Defines an enumeration for C++ overloaded operators.
StringRef getNameForSlot(unsigned argIndex) const
Retrieve the name at a given position in the selector.
Defines the clang::TypeLoc interface and its subclasses.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
void print(llvm::raw_ostream &OS) const
Prints the full selector name (e.g. "foo:bar:").
unsigned getNumArgs() const
The result type of a method or function.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Encodes a location in the source.
unsigned SuppressScope
Suppresses printing of scope specifiers.
void printName(raw_ostream &OS) const
printName - Print the human-readable name to a stream.
The injected class name of a C++ class template or class template partial specialization.
StringRef getName() const
Return the actual identifier string.
Dataflow Directional Tag Classes.
std::string getAsString() const
getAsString - Retrieve the human-readable string for this name.
The base class of all kinds of template declarations (e.g., class, function, etc.).
The name of a declaration.
void adjustForCPlusPlus()
Adjust this printing policy for cases where it's known that we're printing C++ code (for instance...
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
void * getAsOpaquePtr() const
Retrieve the internal representation of this canonical type.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate.h) and friends (in DeclFriend.h).
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name...
Defines the clang::SourceLocation class and associated facilities.
static int compare(DeclarationName LHS, DeclarationName RHS)
void print(raw_ostream &OS, const PrintingPolicy &Policy)
Contains the actual identifier that makes up the name of a C++ literal operator.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
__DEVICE__ int min(int __a, int __b)
IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it...