clang 23.0.0git
DeclarationName.h
Go to the documentation of this file.
1//===- DeclarationName.h - Representation of declaration names --*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file declares the DeclarationName and DeclarationNameTable classes.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_AST_DECLARATIONNAME_H
14#define LLVM_CLANG_AST_DECLARATIONNAME_H
15
16#include "clang/AST/TypeBase.h"
22#include "llvm/ADT/DenseMapInfo.h"
23#include "llvm/ADT/FoldingSet.h"
24#include "llvm/ADT/STLExtras.h"
25#include "llvm/Support/Compiler.h"
26#include "llvm/Support/type_traits.h"
27#include <cassert>
28#include <cstdint>
29#include <cstring>
30#include <string>
31
32namespace clang {
33
34class ASTContext;
35template <typename> class CanQual;
36class DeclarationName;
38struct PrintingPolicy;
39class TemplateDecl;
40class TypeSourceInfo;
41
43
44namespace detail {
45
46/// CXXSpecialNameExtra records the type associated with one of the "special"
47/// kinds of declaration names in C++, e.g., constructors, destructors, and
48/// conversion functions. Note that CXXSpecialName is used for C++ constructor,
49/// destructor and conversion functions, but the actual kind is not stored in
50/// CXXSpecialName. Instead we use three different FoldingSet<CXXSpecialName>
51/// in DeclarationNameTable.
52class alignas(IdentifierInfoAlignment) CXXSpecialNameExtra
53 : public llvm::FoldingSetNode {
56
57 /// The type associated with this declaration name.
58 QualType Type;
59
60 /// Extra information associated with this declaration name that
61 /// can be used by the front end. All bits are really needed
62 /// so it is not possible to stash something in the low order bits.
63 void *FETokenInfo;
64
65 CXXSpecialNameExtra(QualType QT) : Type(QT), FETokenInfo(nullptr) {}
66
67public:
68 void Profile(llvm::FoldingSetNodeID &ID) {
69 ID.AddPointer(Type.getAsOpaquePtr());
70 }
71};
72
73/// Contains extra information for the name of a C++ deduction guide.
74class alignas(IdentifierInfoAlignment) CXXDeductionGuideNameExtra
76 public llvm::FoldingSetNode {
79
80 /// The template named by the deduction guide.
81 TemplateDecl *Template;
82
83 /// Extra information associated with this operator name that
84 /// can be used by the front end. All bits are really needed
85 /// so it is not possible to stash something in the low order bits.
86 void *FETokenInfo;
87
88 CXXDeductionGuideNameExtra(TemplateDecl *TD)
90 FETokenInfo(nullptr) {}
91
92public:
93 void Profile(llvm::FoldingSetNodeID &ID) { ID.AddPointer(Template); }
94};
95
96/// Contains extra information for the name of an overloaded operator
97/// in C++, such as "operator+. This do not includes literal or conversion
98/// operators. For literal operators see CXXLiteralOperatorIdName and for
99/// conversion operators see CXXSpecialNameExtra.
100class alignas(IdentifierInfoAlignment) CXXOperatorIdName {
103
104 /// The kind of this operator.
106
107 /// Extra information associated with this operator name that
108 /// can be used by the front end. All bits are really needed
109 /// so it is not possible to stash something in the low order bits.
110 void *FETokenInfo = nullptr;
111};
112
113/// Contains the actual identifier that makes up the
114/// name of a C++ literal operator.
115class alignas(IdentifierInfoAlignment) CXXLiteralOperatorIdName
117 public llvm::FoldingSetNode {
120
121 const IdentifierInfo *ID;
122
123 /// Extra information associated with this operator name that
124 /// can be used by the front end. All bits are really needed
125 /// so it is not possible to stash something in the low order bits.
126 void *FETokenInfo;
127
128 CXXLiteralOperatorIdName(const IdentifierInfo *II)
130 FETokenInfo(nullptr) {}
131
132public:
133 void Profile(llvm::FoldingSetNodeID &FSID) { FSID.AddPointer(ID); }
134};
135
136} // namespace detail
137
138/// The name of a declaration. In the common case, this just stores
139/// an IdentifierInfo pointer to a normal name. However, it also provides
140/// encodings for Objective-C selectors (optimizing zero- and one-argument
141/// selectors, which make up 78% percent of all selectors in Cocoa.h),
142/// special C++ names for constructors, destructors, and conversion functions,
143/// and C++ overloaded operators.
144class DeclarationName {
146 friend class NamedDecl;
147
148 /// StoredNameKind represent the kind of name that is actually stored in the
149 /// upper bits of the Ptr field. This is only used internally.
150 ///
151 /// NameKind, StoredNameKind, and DeclarationNameExtra::ExtraKind
152 /// must satisfy the following properties. These properties enable
153 /// efficient conversion between the various kinds.
154 ///
155 /// * The first seven enumerators of StoredNameKind must have the same
156 /// numerical value as the first seven enumerators of NameKind.
157 /// This enable efficient conversion between the two enumerations
158 /// in the usual case.
159 ///
160 /// * The enumerations values of DeclarationNameExtra::ExtraKind must start
161 /// at zero, and correspond to the numerical value of the first non-inline
162 /// enumeration values of NameKind minus an offset. This makes conversion
163 /// between DeclarationNameExtra::ExtraKind and NameKind possible with
164 /// a single addition/substraction.
165 ///
166 /// * The enumeration values of Selector::IdentifierInfoFlag must correspond
167 /// to the relevant enumeration values of StoredNameKind.
168 /// More specifically:
169 /// * ZeroArg == StoredObjCZeroArgSelector,
170 /// * OneArg == StoredObjCOneArgSelector,
171 /// * MultiArg == StoredDeclarationNameExtra
172 ///
173 /// * PtrMask must mask the low 3 bits of Ptr.
174 enum StoredNameKind {
175 StoredIdentifier = 0,
176 StoredObjCZeroArgSelector = Selector::ZeroArg,
177 StoredObjCOneArgSelector = Selector::OneArg,
178 StoredCXXConstructorName = 3,
179 StoredCXXDestructorName = 4,
180 StoredCXXConversionFunctionName = 5,
181 StoredCXXOperatorName = 6,
182 StoredDeclarationNameExtra = Selector::MultiArg,
183 PtrMask = 7,
184 UncommonNameKindOffset = 8
185 };
186
187 static_assert(alignof(IdentifierInfo) >= 8 &&
188 alignof(detail::DeclarationNameExtra) >= 8 &&
189 alignof(detail::CXXSpecialNameExtra) >= 8 &&
190 alignof(detail::CXXOperatorIdName) >= 8 &&
193 "The various classes that DeclarationName::Ptr can point to"
194 " must be at least aligned to 8 bytes!");
195
196 static_assert(
197 std::is_same<std::underlying_type_t<StoredNameKind>,
198 std::underlying_type_t<
200 "The various enums used to compute values for NameKind should "
201 "all have the same underlying type");
202
203public:
204 /// The kind of the name stored in this DeclarationName.
205 /// The first 7 enumeration values are stored inline and correspond
206 /// to frequently used kinds. The rest is stored in DeclarationNameExtra
207 /// and correspond to infrequently used kinds.
208 enum NameKind {
209 Identifier = StoredIdentifier,
210 ObjCZeroArgSelector = StoredObjCZeroArgSelector,
211 ObjCOneArgSelector = StoredObjCOneArgSelector,
212 CXXConstructorName = StoredCXXConstructorName,
213 CXXDestructorName = StoredCXXDestructorName,
214 CXXConversionFunctionName = StoredCXXConversionFunctionName,
215 CXXOperatorName = StoredCXXOperatorName,
216 CXXDeductionGuideName = llvm::addEnumValues(
217 UncommonNameKindOffset,
219 CXXLiteralOperatorName = llvm::addEnumValues(
220 UncommonNameKindOffset,
223 llvm::addEnumValues(UncommonNameKindOffset,
226 llvm::addEnumValues(UncommonNameKindOffset,
228 };
229
230private:
231 /// The lowest three bits of Ptr are used to express what kind of name
232 /// we're actually storing, using the values of StoredNameKind. Depending
233 /// on the kind of name this is, the upper bits of Ptr may have one
234 /// of several different meanings:
235 ///
236 /// StoredIdentifier - The name is a normal identifier, and Ptr is
237 /// a normal IdentifierInfo pointer.
238 ///
239 /// StoredObjCZeroArgSelector - The name is an Objective-C
240 /// selector with zero arguments, and Ptr is an IdentifierInfo
241 /// pointer pointing to the selector name.
242 ///
243 /// StoredObjCOneArgSelector - The name is an Objective-C selector
244 /// with one argument, and Ptr is an IdentifierInfo pointer
245 /// pointing to the selector name.
246 ///
247 /// StoredCXXConstructorName - The name of a C++ constructor,
248 /// Ptr points to a CXXSpecialNameExtra.
249 ///
250 /// StoredCXXDestructorName - The name of a C++ destructor,
251 /// Ptr points to a CXXSpecialNameExtra.
252 ///
253 /// StoredCXXConversionFunctionName - The name of a C++ conversion function,
254 /// Ptr points to a CXXSpecialNameExtra.
255 ///
256 /// StoredCXXOperatorName - The name of an overloaded C++ operator,
257 /// Ptr points to a CXXOperatorIdName.
258 ///
259 /// StoredDeclarationNameExtra - Ptr is actually a pointer to a
260 /// DeclarationNameExtra structure, whose first value will tell us
261 /// whether this is an Objective-C selector, C++ deduction guide,
262 /// C++ literal operator, or C++ using directive.
263 uintptr_t Ptr = 0;
264
265 StoredNameKind getStoredNameKind() const {
266 return static_cast<StoredNameKind>(Ptr & PtrMask);
267 }
268
269 void *getPtr() const { return reinterpret_cast<void *>(Ptr & ~PtrMask); }
270
271 void setPtrAndKind(const void *P, StoredNameKind Kind) {
272 uintptr_t PAsInteger = reinterpret_cast<uintptr_t>(P);
273 assert((Kind & ~PtrMask) == 0 &&
274 "Invalid StoredNameKind in setPtrAndKind!");
275 assert((PAsInteger & PtrMask) == 0 &&
276 "Improperly aligned pointer in setPtrAndKind!");
277 Ptr = PAsInteger | Kind;
278 }
279
280 /// Construct a declaration name from a DeclarationNameExtra.
281 DeclarationName(detail::DeclarationNameExtra *Name) {
282 setPtrAndKind(Name, StoredDeclarationNameExtra);
283 }
284
285 /// Construct a declaration name from a CXXSpecialNameExtra.
286 DeclarationName(detail::CXXSpecialNameExtra *Name,
287 StoredNameKind StoredKind) {
288 assert((StoredKind == StoredCXXConstructorName ||
289 StoredKind == StoredCXXDestructorName ||
290 StoredKind == StoredCXXConversionFunctionName) &&
291 "Invalid StoredNameKind when constructing a DeclarationName"
292 " from a CXXSpecialNameExtra!");
293 setPtrAndKind(Name, StoredKind);
294 }
295
296 /// Construct a DeclarationName from a CXXOperatorIdName.
297 DeclarationName(detail::CXXOperatorIdName *Name) {
298 setPtrAndKind(Name, StoredCXXOperatorName);
299 }
300
301 /// Assert that the stored pointer points to an IdentifierInfo and return it.
302 IdentifierInfo *castAsIdentifierInfo() const {
303 assert((getStoredNameKind() == StoredIdentifier) &&
304 "DeclarationName does not store an IdentifierInfo!");
305 return static_cast<IdentifierInfo *>(getPtr());
306 }
307
308 /// Assert that the stored pointer points to a DeclarationNameExtra
309 /// and return it.
310 detail::DeclarationNameExtra *castAsExtra() const {
311 assert((getStoredNameKind() == StoredDeclarationNameExtra) &&
312 "DeclarationName does not store an Extra structure!");
313 return static_cast<detail::DeclarationNameExtra *>(getPtr());
314 }
315
316 /// Assert that the stored pointer points to a CXXSpecialNameExtra
317 /// and return it.
318 detail::CXXSpecialNameExtra *castAsCXXSpecialNameExtra() const {
319 assert((getStoredNameKind() == StoredCXXConstructorName ||
320 getStoredNameKind() == StoredCXXDestructorName ||
321 getStoredNameKind() == StoredCXXConversionFunctionName) &&
322 "DeclarationName does not store a CXXSpecialNameExtra!");
323 return static_cast<detail::CXXSpecialNameExtra *>(getPtr());
324 }
325
326 /// Assert that the stored pointer points to a CXXOperatorIdName
327 /// and return it.
328 detail::CXXOperatorIdName *castAsCXXOperatorIdName() const {
329 assert((getStoredNameKind() == StoredCXXOperatorName) &&
330 "DeclarationName does not store a CXXOperatorIdName!");
331 return static_cast<detail::CXXOperatorIdName *>(getPtr());
332 }
333
334 /// Assert that the stored pointer points to a CXXDeductionGuideNameExtra
335 /// and return it.
336 detail::CXXDeductionGuideNameExtra *castAsCXXDeductionGuideNameExtra() const {
337 assert(getNameKind() == CXXDeductionGuideName &&
338 "DeclarationName does not store a CXXDeductionGuideNameExtra!");
339 return static_cast<detail::CXXDeductionGuideNameExtra *>(getPtr());
340 }
341
342 /// Assert that the stored pointer points to a CXXLiteralOperatorIdName
343 /// and return it.
344 detail::CXXLiteralOperatorIdName *castAsCXXLiteralOperatorIdName() const {
345 assert(getNameKind() == CXXLiteralOperatorName &&
346 "DeclarationName does not store a CXXLiteralOperatorIdName!");
347 return static_cast<detail::CXXLiteralOperatorIdName *>(getPtr());
348 }
349
350 /// Get and set the FETokenInfo in the less common cases where the
351 /// declaration name do not point to an identifier.
352 void *getFETokenInfoSlow() const;
353 void setFETokenInfoSlow(void *T);
354
355public:
356 /// Construct an empty declaration name.
357 DeclarationName() { setPtrAndKind(nullptr, StoredIdentifier); }
358
359 /// Construct a declaration name from an IdentifierInfo *.
361 setPtrAndKind(II, StoredIdentifier);
362 }
363
364 /// Construct a declaration name from an Objective-C selector.
366 : Ptr(reinterpret_cast<uintptr_t>(Sel.InfoPtr.getOpaqueValue())) {}
367
368 /// Returns the name for all C++ using-directives.
369 static DeclarationName getUsingDirectiveName() {
370 // Single instance of DeclarationNameExtra for using-directive
371 static detail::DeclarationNameExtra UDirExtra(
373 return DeclarationName(&UDirExtra);
374 }
375
376 /// Evaluates true when this declaration name is non-empty.
377 explicit operator bool() const {
378 return getPtr() || (getStoredNameKind() != StoredIdentifier);
379 }
380
381 /// Evaluates true when this declaration name is empty.
382 bool isEmpty() const { return !*this; }
383
384 /// Predicate functions for querying what type of name this is.
385 bool isIdentifier() const { return getStoredNameKind() == StoredIdentifier; }
387 return getStoredNameKind() == StoredObjCZeroArgSelector;
388 }
389 bool isObjCOneArgSelector() const {
390 return getStoredNameKind() == StoredObjCOneArgSelector;
391 }
392
393 /// Determine what kind of name this is.
395 // We rely on the fact that the first 7 NameKind and StoredNameKind
396 // have the same numerical value. This makes the usual case efficient.
397 StoredNameKind StoredKind = getStoredNameKind();
398 if (StoredKind != StoredDeclarationNameExtra)
399 return static_cast<NameKind>(StoredKind);
400 // We have to consult DeclarationNameExtra. We rely on the fact that the
401 // enumeration values of ExtraKind correspond to the enumeration values of
402 // NameKind minus an offset of UncommonNameKindOffset.
403 unsigned ExtraKind = castAsExtra()->getKind();
404 return static_cast<NameKind>(UncommonNameKindOffset + ExtraKind);
405 }
406
407 /// Determines whether the name itself is dependent, e.g., because it
408 /// involves a C++ type that is itself dependent.
409 ///
410 /// Note that this does not capture all of the notions of "dependent name",
411 /// because an identifier can be a dependent name if it is used as the
412 /// callee in a call expression with dependent arguments.
413 bool isDependentName() const;
414
415 /// Retrieve the human-readable string for this name.
416 std::string getAsString() const;
417
418 /// Retrieve the IdentifierInfo * stored in this declaration name,
419 /// or null if this declaration name isn't a simple identifier.
421 if (isIdentifier())
422 return castAsIdentifierInfo();
423 return nullptr;
424 }
425
426 /// Get the representation of this declaration name as an opaque integer.
427 uintptr_t getAsOpaqueInteger() const { return Ptr; }
428
429 /// Get the representation of this declaration name as an opaque pointer.
430 void *getAsOpaquePtr() const { return reinterpret_cast<void *>(Ptr); }
431
432 /// Get a declaration name from an opaque pointer returned by getAsOpaquePtr.
433 static DeclarationName getFromOpaquePtr(void *P) {
434 DeclarationName N;
435 N.Ptr = reinterpret_cast<uintptr_t>(P);
436 return N;
437 }
438
439 /// Get a declaration name from an opaque integer
440 /// returned by getAsOpaqueInteger.
441 static DeclarationName getFromOpaqueInteger(uintptr_t P) {
442 DeclarationName N;
443 N.Ptr = P;
444 return N;
445 }
446
447 /// If this name is one of the C++ names (of a constructor, destructor,
448 /// or conversion function), return the type associated with that name.
450 if (getStoredNameKind() == StoredCXXConstructorName ||
451 getStoredNameKind() == StoredCXXDestructorName ||
452 getStoredNameKind() == StoredCXXConversionFunctionName) {
453 assert(getPtr() && "getCXXNameType on a null DeclarationName!");
454 return castAsCXXSpecialNameExtra()->Type;
455 }
456 return QualType();
457 }
458
459 /// If this name is the name of a C++ deduction guide, return the
460 /// template associated with that name.
463 assert(getPtr() &&
464 "getCXXDeductionGuideTemplate on a null DeclarationName!");
465 return castAsCXXDeductionGuideNameExtra()->Template;
466 }
467 return nullptr;
468 }
469
470 /// If this name is the name of an overloadable operator in C++
471 /// (e.g., @c operator+), retrieve the kind of overloaded operator.
473 if (getStoredNameKind() == StoredCXXOperatorName) {
474 assert(getPtr() && "getCXXOverloadedOperator on a null DeclarationName!");
475 return castAsCXXOperatorIdName()->Kind;
476 }
477 return OO_None;
478 }
479
480 bool isAnyOperatorNew() const {
482 return false;
483 switch (getCXXOverloadedOperator()) {
484 case OO_New:
485 case OO_Array_New:
486 return true;
487 default:
488 return false;
489 }
490 }
491
492 bool isAnyOperatorDelete() const {
494 return false;
495 switch (getCXXOverloadedOperator()) {
496 case OO_Delete:
497 case OO_Array_Delete:
498 return true;
499 default:
500 return false;
501 }
502 }
503
506 }
507
508 /// If this name is the name of a literal operator,
509 /// retrieve the identifier associated with it.
512 assert(getPtr() && "getCXXLiteralIdentifier on a null DeclarationName!");
513 return castAsCXXLiteralOperatorIdName()->ID;
514 }
515 return nullptr;
516 }
517
518 /// Get the Objective-C selector stored in this declaration name.
520 assert((getNameKind() == ObjCZeroArgSelector ||
522 getNameKind() == ObjCMultiArgSelector || !getPtr()) &&
523 "Not a selector!");
524 return Selector(Ptr);
525 }
526
527 /// Get and set FETokenInfo. The language front-end is allowed to associate
528 /// arbitrary metadata with some kinds of declaration names, including normal
529 /// identifiers and C++ constructors, destructors, and conversion functions.
530 void *getFETokenInfo() const {
531 assert(getPtr() && "getFETokenInfo on an empty DeclarationName!");
532 if (getStoredNameKind() == StoredIdentifier)
533 return castAsIdentifierInfo()->getFETokenInfo();
534 return getFETokenInfoSlow();
535 }
536
537 void setFETokenInfo(void *T) {
538 assert(getPtr() && "setFETokenInfo on an empty DeclarationName!");
539 if (getStoredNameKind() == StoredIdentifier)
540 castAsIdentifierInfo()->setFETokenInfo(T);
541 else
542 setFETokenInfoSlow(T);
543 }
544
545 /// Determine whether the specified names are identical.
546 friend bool operator==(DeclarationName LHS, DeclarationName RHS) {
547 return LHS.Ptr == RHS.Ptr;
548 }
549
550 /// Determine whether the specified names are different.
551 friend bool operator!=(DeclarationName LHS, DeclarationName RHS) {
552 return LHS.Ptr != RHS.Ptr;
553 }
554
555 static int compare(DeclarationName LHS, DeclarationName RHS);
556
557 void print(raw_ostream &OS, const PrintingPolicy &Policy) const;
558
559 void dump() const;
560};
561
562raw_ostream &operator<<(raw_ostream &OS, DeclarationName N);
563
564/// Ordering on two declaration names. If both names are identifiers,
565/// this provides a lexicographical ordering.
567 return DeclarationName::compare(LHS, RHS) < 0;
568}
569
570/// Ordering on two declaration names. If both names are identifiers,
571/// this provides a lexicographical ordering.
573 return DeclarationName::compare(LHS, RHS) > 0;
574}
575
576/// Ordering on two declaration names. If both names are identifiers,
577/// this provides a lexicographical ordering.
579 return DeclarationName::compare(LHS, RHS) <= 0;
580}
581
582/// Ordering on two declaration names. If both names are identifiers,
583/// this provides a lexicographical ordering.
585 return DeclarationName::compare(LHS, RHS) >= 0;
586}
587
588/// DeclarationNameTable is used to store and retrieve DeclarationName
589/// instances for the various kinds of declaration names, e.g., normal
590/// identifiers, C++ constructor names, etc. This class contains
591/// uniqued versions of each of the C++ special names, which can be
592/// retrieved using its member functions (e.g., getCXXConstructorName).
594 /// Used to allocate elements in the FoldingSets below.
595 const ASTContext &Ctx;
596
597 /// Manage the uniqued CXXSpecialNameExtra representing C++ constructors.
598 /// getCXXConstructorName and getCXXSpecialName can be used to obtain
599 /// a DeclarationName from the corresponding type of the constructor.
600 llvm::FoldingSet<detail::CXXSpecialNameExtra> CXXConstructorNames;
601
602 /// Manage the uniqued CXXSpecialNameExtra representing C++ destructors.
603 /// getCXXDestructorName and getCXXSpecialName can be used to obtain
604 /// a DeclarationName from the corresponding type of the destructor.
605 llvm::FoldingSet<detail::CXXSpecialNameExtra> CXXDestructorNames;
606
607 /// Manage the uniqued CXXSpecialNameExtra representing C++ conversion
608 /// functions. getCXXConversionFunctionName and getCXXSpecialName can be
609 /// used to obtain a DeclarationName from the corresponding type of the
610 /// conversion function.
611 llvm::FoldingSet<detail::CXXSpecialNameExtra> CXXConversionFunctionNames;
612
613 /// Manage the uniqued CXXOperatorIdName, which contain extra information
614 /// for the name of overloaded C++ operators. getCXXOperatorName
615 /// can be used to obtain a DeclarationName from the operator kind.
617
618 /// Manage the uniqued CXXLiteralOperatorIdName, which contain extra
619 /// information for the name of C++ literal operators.
620 /// getCXXLiteralOperatorName can be used to obtain a DeclarationName
621 /// from the corresponding IdentifierInfo.
622 llvm::FoldingSet<detail::CXXLiteralOperatorIdName> CXXLiteralOperatorNames;
623
624 /// Manage the uniqued CXXDeductionGuideNameExtra, which contain
625 /// extra information for the name of a C++ deduction guide.
626 /// getCXXDeductionGuideName can be used to obtain a DeclarationName
627 /// from the corresponding template declaration.
628 llvm::FoldingSet<detail::CXXDeductionGuideNameExtra> CXXDeductionGuideNames;
629
630public:
637
638 /// Create a declaration name that is a simple identifier.
642
643 /// Returns the name of a C++ constructor for the given Type.
644 DeclarationName getCXXConstructorName(CanQualType Ty);
645
646 /// Returns the name of a C++ destructor for the given Type.
647 DeclarationName getCXXDestructorName(CanQualType Ty);
648
649 /// Returns the name of a C++ deduction guide for the given template.
650 DeclarationName getCXXDeductionGuideName(TemplateDecl *TD);
651
652 /// Returns the name of a C++ conversion function for the given Type.
653 DeclarationName getCXXConversionFunctionName(CanQualType Ty);
654
655 /// Returns a declaration name for special kind of C++ name,
656 /// e.g., for a constructor, destructor, or conversion function.
657 /// Kind must be one of:
658 /// * DeclarationName::CXXConstructorName,
659 /// * DeclarationName::CXXDestructorName or
660 /// * DeclarationName::CXXConversionFunctionName
661 DeclarationName getCXXSpecialName(DeclarationName::NameKind Kind,
662 CanQualType Ty);
663
664 /// Get the name of the overloadable C++ operator corresponding to Op.
666 return DeclarationName(&CXXOperatorNames[Op]);
667 }
668
669 /// Get the name of the literal operator function with II as the identifier.
670 DeclarationName getCXXLiteralOperatorName(const IdentifierInfo *II);
671};
672
673/// DeclarationNameLoc - Additional source/type location info
674/// for a declaration name. Needs a DeclarationName in order
675/// to be interpreted correctly.
677 // The source location for identifier stored elsewhere.
678 // struct {} Identifier;
679
680 // Type info for constructors, destructors and conversion functions.
681 // Locations (if any) for the tilde (destructor) or operator keyword
682 // (conversion) are stored elsewhere.
683 struct NT {
684 TypeSourceInfo *TInfo;
685 };
686
687 // The location (if any) of the operator keyword is stored elsewhere.
688 struct CXXOpName {
689 SourceLocation BeginOpNameLoc;
690 SourceLocation EndOpNameLoc;
691 };
692
693 // The location (if any) of the operator keyword is stored elsewhere.
694 struct CXXLitOpName {
695 SourceLocation OpNameLoc;
696 };
697
698 // struct {} CXXUsingDirective;
699 // struct {} ObjCZeroArgSelector;
700 // struct {} ObjCOneArgSelector;
701 // struct {} ObjCMultiArgSelector;
702 union {
703 struct NT NamedType;
704 struct CXXOpName CXXOperatorName;
705 struct CXXLitOpName CXXLiteralOperatorName;
706 };
707
708 void setNamedTypeLoc(TypeSourceInfo *TInfo) { NamedType.TInfo = TInfo; }
709
710 void setCXXOperatorNameRange(SourceRange Range) {
711 CXXOperatorName.BeginOpNameLoc = Range.getBegin();
712 CXXOperatorName.EndOpNameLoc = Range.getEnd();
713 }
714
715 void setCXXLiteralOperatorNameLoc(SourceLocation Loc) {
716 CXXLiteralOperatorName.OpNameLoc = Loc;
717 }
718
719public:
720 DeclarationNameLoc(DeclarationName Name);
721 // FIXME: this should go away once all DNLocs are properly initialized.
722 DeclarationNameLoc() { memset((void*) this, 0, sizeof(*this)); }
723
724 /// Returns the source type info. Assumes that the object stores location
725 /// information of a constructor, destructor or conversion operator.
726 TypeSourceInfo *getNamedTypeInfo() const { return NamedType.TInfo; }
727
728 /// Return the beginning location of the getCXXOperatorNameRange() range.
730 return CXXOperatorName.BeginOpNameLoc;
731 }
732
733 /// Return the end location of the getCXXOperatorNameRange() range.
735 return CXXOperatorName.EndOpNameLoc;
736 }
737
738 /// Return the range of the operator name (without the operator keyword).
739 /// Assumes that the object stores location information of a (non-literal)
740 /// operator.
745
746 /// Return the location of the literal operator name (without the operator
747 /// keyword). Assumes that the object stores location information of a literal
748 /// operator.
752
753 /// Construct location information for a constructor, destructor or conversion
754 /// operator.
757 DNL.setNamedTypeLoc(TInfo);
758 return DNL;
759 }
760
761 /// Construct location information for a non-literal C++ operator.
763 SourceLocation EndLoc) {
764 return makeCXXOperatorNameLoc(SourceRange(BeginLoc, EndLoc));
765 }
766
767 /// Construct location information for a non-literal C++ operator.
770 DNL.setCXXOperatorNameRange(Range);
771 return DNL;
772 }
773
774 /// Construct location information for a literal C++ operator.
777 DNL.setCXXLiteralOperatorNameLoc(Loc);
778 return DNL;
779 }
780};
781
782/// DeclarationNameInfo - A collector data type for bundling together
783/// a DeclarationName and the corresponding source/type location info.
785private:
786 /// Name - The declaration name, also encoding name kind.
787 DeclarationName Name;
788
789 /// Loc - The main source location for the declaration name.
790 SourceLocation NameLoc;
791
792 /// Info - Further source/type location info for special kinds of names.
793 DeclarationNameLoc LocInfo;
794
795public:
796 // FIXME: remove it.
798
800 : Name(Name), NameLoc(NameLoc), LocInfo(Name) {}
801
803 DeclarationNameLoc LocInfo)
804 : Name(Name), NameLoc(NameLoc), LocInfo(LocInfo) {}
805
806 /// getName - Returns the embedded declaration name.
807 DeclarationName getName() const { return Name; }
808
809 /// setName - Sets the embedded declaration name.
810 void setName(DeclarationName N) { Name = N; }
811
812 /// getLoc - Returns the main location of the declaration name.
813 SourceLocation getLoc() const { return NameLoc; }
814
815 /// setLoc - Sets the main location of the declaration name.
816 void setLoc(SourceLocation L) { NameLoc = L; }
817
818 const DeclarationNameLoc &getInfo() const { return LocInfo; }
819 void setInfo(const DeclarationNameLoc &Info) { LocInfo = Info; }
820
821 /// @return The type source info associated to the name if it is a
822 /// constructor, destructor or conversion function, `nullptr` otherwise.
824 if (Name.getNameKind() != DeclarationName::CXXConstructorName &&
825 Name.getNameKind() != DeclarationName::CXXDestructorName &&
826 Name.getNameKind() != DeclarationName::CXXConversionFunctionName)
827 return nullptr;
828 return LocInfo.getNamedTypeInfo();
829 }
830
831 /// setNamedTypeInfo - Sets the source type info associated to
832 /// the name. Assumes it is a constructor, destructor or conversion.
834 assert(Name.getNameKind() == DeclarationName::CXXConstructorName ||
835 Name.getNameKind() == DeclarationName::CXXDestructorName ||
836 Name.getNameKind() == DeclarationName::CXXConversionFunctionName);
838 }
839
840 /// getCXXOperatorNameRange - Gets the range of the operator name
841 /// (without the operator keyword). Assumes it is a (non-literal) operator.
843 if (Name.getNameKind() != DeclarationName::CXXOperatorName)
844 return SourceRange();
845 return LocInfo.getCXXOperatorNameRange();
846 }
847
848 /// setCXXOperatorNameRange - Sets the range of the operator name
849 /// (without the operator keyword). Assumes it is a C++ operator.
854
855 /// getCXXLiteralOperatorNameLoc - Returns the location of the literal
856 /// operator name (not the operator keyword).
857 /// Assumes it is a literal operator.
859 if (Name.getNameKind() != DeclarationName::CXXLiteralOperatorName)
860 return SourceLocation();
861 return LocInfo.getCXXLiteralOperatorNameLoc();
862 }
863
864 /// setCXXLiteralOperatorNameLoc - Sets the location of the literal
865 /// operator name (not the operator keyword).
866 /// Assumes it is a literal operator.
871
872 /// Determine whether this name involves a template parameter.
873 bool isInstantiationDependent() const;
874
875 /// Determine whether this name contains an unexpanded
876 /// parameter pack.
877 bool containsUnexpandedParameterPack() const;
878
879 /// getAsString - Retrieve the human-readable string for this name.
880 std::string getAsString() const;
881
882 /// printName - Print the human-readable name to a stream.
883 void printName(raw_ostream &OS, PrintingPolicy Policy) const;
884
885 /// getBeginLoc - Retrieve the location of the first token.
886 SourceLocation getBeginLoc() const { return NameLoc; }
887
888 /// getSourceRange - The range of the declaration name.
889 SourceRange getSourceRange() const LLVM_READONLY {
890 return SourceRange(getBeginLoc(), getEndLoc());
891 }
892
893 SourceLocation getEndLoc() const LLVM_READONLY {
894 SourceLocation EndLoc = getEndLocPrivate();
895 return EndLoc.isValid() ? EndLoc : getBeginLoc();
896 }
897
898private:
899 SourceLocation getEndLocPrivate() const;
900};
901
902/// Insertion operator for partial diagnostics. This allows binding
903/// DeclarationName's into a partial diagnostic with <<.
910
911raw_ostream &operator<<(raw_ostream &OS, DeclarationNameInfo DNInfo);
912
913} // namespace clang
914
915namespace llvm {
916
917/// Define DenseMapInfo so that DeclarationNames can be used as keys
918/// in DenseMap and DenseSets.
919template<>
920struct DenseMapInfo<clang::DeclarationName> {
921 static unsigned getHashValue(clang::DeclarationName Name) {
922 return DenseMapInfo<void*>::getHashValue(Name.getAsOpaquePtr());
923 }
924
925 static inline bool
927 return LHS == RHS;
928 }
929};
930
931template <> struct PointerLikeTypeTraits<clang::DeclarationName> {
933 return P.getAsOpaquePtr();
934 }
938 static constexpr int NumLowBitsAvailable = 0;
939};
940
941} // namespace llvm
942
943// The definition of AssumedTemplateStorage is factored out of TemplateName to
944// resolve a cyclic dependency between it and DeclarationName (via Type).
945namespace clang {
946
947/// A structure for storing the information associated with a name that has
948/// been assumed to be a template name (despite finding no TemplateDecls).
949class AssumedTemplateStorage : public UncommonTemplateNameStorage {
950 friend class ASTContext;
951
952 AssumedTemplateStorage(DeclarationName Name)
953 : UncommonTemplateNameStorage(Assumed, 0, 0), Name(Name) {}
954 DeclarationName Name;
955
956public:
957 /// Get the name of the template.
958 DeclarationName getDeclName() const { return Name; }
959};
960
961} // namespace clang
962
963#endif // LLVM_CLANG_AST_DECLARATIONNAME_H
Defines the Diagnostic-related interfaces.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
static void print(llvm::raw_ostream &OS, const T &V, const Context &Ctx, QualType Ty)
llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, const OMPTraitInfo &TI)
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
static bool compare(const PathDiagnostic &X, const PathDiagnostic &Y)
Defines the clang::SourceLocation class and associated facilities.
C Language Family Type Representation.
__DEVICE__ void * memset(void *__a, int __b, size_t __c)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:223
DeclarationName getDeclName() const
Get the name of the template.
Represents a canonical, potentially-qualified type.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
static DeclarationNameLoc makeCXXLiteralOperatorNameLoc(SourceLocation Loc)
Construct location information for a literal C++ operator.
SourceLocation getCXXLiteralOperatorNameLoc() const
Return the location of the literal operator name (without the operator keyword).
struct CXXLitOpName CXXLiteralOperatorName
SourceLocation getCXXOperatorNameBeginLoc() const
Return the beginning location of the getCXXOperatorNameRange() range.
TypeSourceInfo * getNamedTypeInfo() const
Returns the source type info.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
DeclarationNameLoc(DeclarationName Name)
SourceLocation getCXXOperatorNameEndLoc() const
Return the end location of the getCXXOperatorNameRange() range.
SourceRange getCXXOperatorNameRange() const
Return the range of the operator name (without the operator keyword).
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceRange Range)
Construct location information for a non-literal C++ operator.
struct CXXOpName CXXOperatorName
DeclarationNameTable is used to store and retrieve DeclarationName instances for the various kinds of...
DeclarationName getIdentifier(const IdentifierInfo *ID)
Create a declaration name that is a simple identifier.
DeclarationNameTable(const ASTContext &C)
DeclarationNameTable(const DeclarationNameTable &)=delete
DeclarationNameTable & operator=(const DeclarationNameTable &)=delete
DeclarationNameTable(DeclarationNameTable &&)=delete
DeclarationName getCXXOperatorName(OverloadedOperatorKind Op)
Get the name of the overloadable C++ operator corresponding to Op.
DeclarationNameTable & operator=(DeclarationNameTable &&)=delete
The name of a declaration.
static DeclarationName getFromOpaqueInteger(uintptr_t P)
Get a declaration name from an opaque integer returned by getAsOpaqueInteger.
uintptr_t getAsOpaqueInteger() const
Get the representation of this declaration name as an opaque integer.
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 isAnyOperatorNewOrDelete() const
static DeclarationName getFromOpaquePtr(void *P)
Get a declaration name from an opaque pointer returned by getAsOpaquePtr.
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
DeclarationName(Selector Sel)
Construct a declaration name from an Objective-C selector.
void * getAsOpaquePtr() const
Get the representation of this declaration name as an opaque pointer.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
friend bool operator==(DeclarationName LHS, DeclarationName RHS)
Determine whether the specified names are identical.
static DeclarationName getUsingDirectiveName()
Returns the name for all C++ using-directives.
bool isAnyOperatorDelete() const
friend bool operator!=(DeclarationName LHS, DeclarationName RHS)
Determine whether the specified names are different.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
bool isObjCZeroArgSelector() const
NameKind
The kind of the name stored in this DeclarationName.
void * getFETokenInfo() const
Get and set FETokenInfo.
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.
bool isObjCOneArgSelector() const
DeclarationName()
Construct an empty declaration name.
friend class DeclarationNameTable
NameKind getNameKind() const
Determine what kind of name this is.
bool isEmpty() const
Evaluates true when this declaration name is empty.
DeclarationName(const IdentifierInfo *II)
Construct a declaration name from an IdentifierInfo *.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
@ ak_declarationname
DeclarationName.
Definition Diagnostic.h:276
One of these records is kept for each identifier that is lexed.
A (possibly-)qualified type.
Definition TypeBase.h:937
Smart pointer class that efficiently represents Objective-C method names.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
void AddTaggedVal(uint64_t V, DiagnosticsEngine::ArgumentKind Kind) const
The base class of all kinds of template declarations (e.g., class, function, etc.).
A container of type source information.
Definition TypeBase.h:8418
UncommonTemplateNameStorage(Kind Kind, unsigned Index, unsigned Data)
Contains extra information for the name of a C++ deduction guide.
void Profile(llvm::FoldingSetNodeID &ID)
Contains the actual identifier that makes up the name of a C++ literal operator.
void Profile(llvm::FoldingSetNodeID &FSID)
Contains extra information for the name of an overloaded operator in C++, such as "operator+.
CXXSpecialNameExtra records the type associated with one of the "special" kinds of declaration names ...
void Profile(llvm::FoldingSetNodeID &ID)
DeclarationNameExtra is used as a base of various uncommon special names.
ExtraKind
The kind of "extra" information stored in the DeclarationName.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool operator<(DeclarationName LHS, DeclarationName RHS)
Ordering on two declaration names.
bool operator<=(DeclarationName LHS, DeclarationName RHS)
Ordering on two declaration names.
bool operator>(DeclarationName LHS, DeclarationName RHS)
Ordering on two declaration names.
bool operator>=(DeclarationName LHS, DeclarationName RHS)
Ordering on two declaration names.
llvm::StringRef getAsString(SyncScope S)
Definition SyncScope.h:62
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setInfo(const DeclarationNameLoc &Info)
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
SourceRange getCXXOperatorNameRange() const
getCXXOperatorNameRange - Gets the range of the operator name (without the operator keyword).
DeclarationNameInfo(DeclarationName Name, SourceLocation NameLoc)
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
const DeclarationNameLoc & getInfo() const
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
TypeSourceInfo * getNamedTypeInfo() const
SourceRange getSourceRange() const LLVM_READONLY
getSourceRange - The range of the declaration name.
DeclarationNameInfo(DeclarationName Name, SourceLocation NameLoc, DeclarationNameLoc LocInfo)
SourceLocation getCXXLiteralOperatorNameLoc() const
getCXXLiteralOperatorNameLoc - Returns the location of the literal operator name (not the operator ke...
SourceLocation getEndLoc() const LLVM_READONLY
Describes how types, statements, expressions, and declarations should be printed.
static bool isEqual(clang::DeclarationName LHS, clang::DeclarationName RHS)
static unsigned getHashValue(clang::DeclarationName Name)
static void * getAsVoidPointer(clang::DeclarationName P)
static clang::DeclarationName getFromVoidPointer(void *P)