• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- DeclarationName.h - Representation of declaration names -*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file declares the DeclarationName and DeclarationNameTable classes.
11 //
12 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_CLANG_AST_DECLARATIONNAME_H
14 #define LLVM_CLANG_AST_DECLARATIONNAME_H
15 
16 #include "clang/Basic/IdentifierTable.h"
17 #include "clang/Basic/PartialDiagnostic.h"
18 #include "llvm/Support/Compiler.h"
19 
20 namespace llvm {
21   template <typename T> struct DenseMapInfo;
22 }
23 
24 namespace clang {
25   class ASTContext;
26   class CXXLiteralOperatorIdName;
27   class CXXOperatorIdName;
28   class CXXSpecialName;
29   class DeclarationNameExtra;
30   class IdentifierInfo;
31   class MultiKeywordSelector;
32   enum OverloadedOperatorKind : int;
33   class QualType;
34   class Type;
35   class TypeSourceInfo;
36   class UsingDirectiveDecl;
37 
38   template <typename> class CanQual;
39   typedef CanQual<Type> CanQualType;
40 
41 /// DeclarationName - The name of a declaration. In the common case,
42 /// this just stores an IdentifierInfo pointer to a normal
43 /// name. However, it also provides encodings for Objective-C
44 /// selectors (optimizing zero- and one-argument selectors, which make
45 /// up 78% percent of all selectors in Cocoa.h) and special C++ names
46 /// for constructors, destructors, and conversion functions.
47 class DeclarationName {
48 public:
49   /// NameKind - The kind of name this object contains.
50   enum NameKind {
51     Identifier,
52     ObjCZeroArgSelector,
53     ObjCOneArgSelector,
54     ObjCMultiArgSelector,
55     CXXConstructorName,
56     CXXDestructorName,
57     CXXConversionFunctionName,
58     CXXOperatorName,
59     CXXLiteralOperatorName,
60     CXXUsingDirective
61   };
62 
63 private:
64   /// StoredNameKind - The kind of name that is actually stored in the
65   /// upper bits of the Ptr field. This is only used internally.
66   ///
67   /// Note: The entries here are synchronized with the entries in Selector,
68   /// for efficient translation between the two.
69   enum StoredNameKind {
70     StoredIdentifier = 0,
71     StoredObjCZeroArgSelector = 0x01,
72     StoredObjCOneArgSelector = 0x02,
73     StoredDeclarationNameExtra = 0x03,
74     PtrMask = 0x03
75   };
76 
77   /// Ptr - The lowest two bits are used to express what kind of name
78   /// we're actually storing, using the values of NameKind. Depending
79   /// on the kind of name this is, the upper bits of Ptr may have one
80   /// of several different meanings:
81   ///
82   ///   StoredIdentifier - The name is a normal identifier, and Ptr is
83   ///   a normal IdentifierInfo pointer.
84   ///
85   ///   StoredObjCZeroArgSelector - The name is an Objective-C
86   ///   selector with zero arguments, and Ptr is an IdentifierInfo
87   ///   pointer pointing to the selector name.
88   ///
89   ///   StoredObjCOneArgSelector - The name is an Objective-C selector
90   ///   with one argument, and Ptr is an IdentifierInfo pointer
91   ///   pointing to the selector name.
92   ///
93   ///   StoredDeclarationNameExtra - Ptr is actually a pointer to a
94   ///   DeclarationNameExtra structure, whose first value will tell us
95   ///   whether this is an Objective-C selector, C++ operator-id name,
96   ///   or special C++ name.
97   uintptr_t Ptr;
98 
99   /// getStoredNameKind - Return the kind of object that is stored in
100   /// Ptr.
getStoredNameKind()101   StoredNameKind getStoredNameKind() const {
102     return static_cast<StoredNameKind>(Ptr & PtrMask);
103   }
104 
105   /// getExtra - Get the "extra" information associated with this
106   /// multi-argument selector or C++ special name.
getExtra()107   DeclarationNameExtra *getExtra() const {
108     assert(getStoredNameKind() == StoredDeclarationNameExtra &&
109            "Declaration name does not store an Extra structure");
110     return reinterpret_cast<DeclarationNameExtra *>(Ptr & ~PtrMask);
111   }
112 
113   /// getAsCXXSpecialName - If the stored pointer is actually a
114   /// CXXSpecialName, returns a pointer to it. Otherwise, returns
115   /// a NULL pointer.
getAsCXXSpecialName()116   CXXSpecialName *getAsCXXSpecialName() const {
117     NameKind Kind = getNameKind();
118     if (Kind >= CXXConstructorName && Kind <= CXXConversionFunctionName)
119       return reinterpret_cast<CXXSpecialName *>(Ptr & ~PtrMask);
120     return nullptr;
121   }
122 
123   /// getAsCXXOperatorIdName
getAsCXXOperatorIdName()124   CXXOperatorIdName *getAsCXXOperatorIdName() const {
125     if (getNameKind() == CXXOperatorName)
126       return reinterpret_cast<CXXOperatorIdName *>(Ptr & ~PtrMask);
127     return nullptr;
128   }
129 
getAsCXXLiteralOperatorIdName()130   CXXLiteralOperatorIdName *getAsCXXLiteralOperatorIdName() const {
131     if (getNameKind() == CXXLiteralOperatorName)
132       return reinterpret_cast<CXXLiteralOperatorIdName *>(Ptr & ~PtrMask);
133     return nullptr;
134   }
135 
136   // Construct a declaration name from the name of a C++ constructor,
137   // destructor, or conversion function.
DeclarationName(CXXSpecialName * Name)138   DeclarationName(CXXSpecialName *Name)
139     : Ptr(reinterpret_cast<uintptr_t>(Name)) {
140     assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXSpecialName");
141     Ptr |= StoredDeclarationNameExtra;
142   }
143 
144   // Construct a declaration name from the name of a C++ overloaded
145   // operator.
DeclarationName(CXXOperatorIdName * Name)146   DeclarationName(CXXOperatorIdName *Name)
147     : Ptr(reinterpret_cast<uintptr_t>(Name)) {
148     assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXOperatorId");
149     Ptr |= StoredDeclarationNameExtra;
150   }
151 
DeclarationName(CXXLiteralOperatorIdName * Name)152   DeclarationName(CXXLiteralOperatorIdName *Name)
153     : Ptr(reinterpret_cast<uintptr_t>(Name)) {
154     assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXLiteralOperatorId");
155     Ptr |= StoredDeclarationNameExtra;
156   }
157 
158   /// Construct a declaration name from a raw pointer.
DeclarationName(uintptr_t Ptr)159   DeclarationName(uintptr_t Ptr) : Ptr(Ptr) { }
160 
161   friend class DeclarationNameTable;
162   friend class NamedDecl;
163 
164   /// getFETokenInfoAsVoidSlow - Retrieves the front end-specified pointer
165   /// for this name as a void pointer if it's not an identifier.
166   void *getFETokenInfoAsVoidSlow() const;
167 
168 public:
169   /// DeclarationName - Used to create an empty selector.
DeclarationName()170   DeclarationName() : Ptr(0) { }
171 
172   // Construct a declaration name from an IdentifierInfo *.
DeclarationName(const IdentifierInfo * II)173   DeclarationName(const IdentifierInfo *II)
174     : Ptr(reinterpret_cast<uintptr_t>(II)) {
175     assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo");
176   }
177 
178   // Construct a declaration name from an Objective-C selector.
DeclarationName(Selector Sel)179   DeclarationName(Selector Sel) : Ptr(Sel.InfoPtr) { }
180 
181   /// getUsingDirectiveName - Return name for all using-directives.
182   static DeclarationName getUsingDirectiveName();
183 
184   // operator bool() - Evaluates true when this declaration name is
185   // non-empty.
186   LLVM_EXPLICIT operator bool() const {
187     return ((Ptr & PtrMask) != 0) ||
188            (reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask));
189   }
190 
191   /// \brief Evaluates true when this declaration name is empty.
isEmpty()192   bool isEmpty() const {
193     return !*this;
194   }
195 
196   /// Predicate functions for querying what type of name this is.
isIdentifier()197   bool isIdentifier() const { return getStoredNameKind() == StoredIdentifier; }
isObjCZeroArgSelector()198   bool isObjCZeroArgSelector() const {
199     return getStoredNameKind() == StoredObjCZeroArgSelector;
200   }
isObjCOneArgSelector()201   bool isObjCOneArgSelector() const {
202     return getStoredNameKind() == StoredObjCOneArgSelector;
203   }
204 
205   /// getNameKind - Determine what kind of name this is.
206   NameKind getNameKind() const;
207 
208   /// \brief Determines whether the name itself is dependent, e.g., because it
209   /// involves a C++ type that is itself dependent.
210   ///
211   /// Note that this does not capture all of the notions of "dependent name",
212   /// because an identifier can be a dependent name if it is used as the
213   /// callee in a call expression with dependent arguments.
214   bool isDependentName() const;
215 
216   /// getNameAsString - Retrieve the human-readable string for this name.
217   std::string getAsString() const;
218 
219   /// getAsIdentifierInfo - Retrieve the IdentifierInfo * stored in
220   /// this declaration name, or NULL if this declaration name isn't a
221   /// simple identifier.
getAsIdentifierInfo()222   IdentifierInfo *getAsIdentifierInfo() const {
223     if (isIdentifier())
224       return reinterpret_cast<IdentifierInfo *>(Ptr);
225     return nullptr;
226   }
227 
228   /// getAsOpaqueInteger - Get the representation of this declaration
229   /// name as an opaque integer.
getAsOpaqueInteger()230   uintptr_t getAsOpaqueInteger() const { return Ptr; }
231 
232   /// getAsOpaquePtr - Get the representation of this declaration name as
233   /// an opaque pointer.
getAsOpaquePtr()234   void *getAsOpaquePtr() const { return reinterpret_cast<void*>(Ptr); }
235 
getFromOpaquePtr(void * P)236   static DeclarationName getFromOpaquePtr(void *P) {
237     DeclarationName N;
238     N.Ptr = reinterpret_cast<uintptr_t> (P);
239     return N;
240   }
241 
getFromOpaqueInteger(uintptr_t P)242   static DeclarationName getFromOpaqueInteger(uintptr_t P) {
243     DeclarationName N;
244     N.Ptr = P;
245     return N;
246   }
247 
248   /// getCXXNameType - If this name is one of the C++ names (of a
249   /// constructor, destructor, or conversion function), return the
250   /// type associated with that name.
251   QualType getCXXNameType() const;
252 
253   /// getCXXOverloadedOperator - If this name is the name of an
254   /// overloadable operator in C++ (e.g., @c operator+), retrieve the
255   /// kind of overloaded operator.
256   OverloadedOperatorKind getCXXOverloadedOperator() const;
257 
258   /// getCXXLiteralIdentifier - If this name is the name of a literal
259   /// operator, retrieve the identifier associated with it.
260   IdentifierInfo *getCXXLiteralIdentifier() const;
261 
262   /// getObjCSelector - Get the Objective-C selector stored in this
263   /// declaration name.
getObjCSelector()264   Selector getObjCSelector() const {
265     assert((getNameKind() == ObjCZeroArgSelector ||
266             getNameKind() == ObjCOneArgSelector ||
267             getNameKind() == ObjCMultiArgSelector ||
268             Ptr == 0) && "Not a selector!");
269     return Selector(Ptr);
270   }
271 
272   /// getFETokenInfo/setFETokenInfo - The language front-end is
273   /// allowed to associate arbitrary metadata with some kinds of
274   /// declaration names, including normal identifiers and C++
275   /// constructors, destructors, and conversion functions.
276   template<typename T>
getFETokenInfo()277   T *getFETokenInfo() const {
278     if (const IdentifierInfo *Info = getAsIdentifierInfo())
279       return Info->getFETokenInfo<T>();
280     return static_cast<T*>(getFETokenInfoAsVoidSlow());
281   }
282 
283   void setFETokenInfo(void *T);
284 
285   /// operator== - Determine whether the specified names are identical..
286   friend bool operator==(DeclarationName LHS, DeclarationName RHS) {
287     return LHS.Ptr == RHS.Ptr;
288   }
289 
290   /// operator!= - Determine whether the specified names are different.
291   friend bool operator!=(DeclarationName LHS, DeclarationName RHS) {
292     return LHS.Ptr != RHS.Ptr;
293   }
294 
getEmptyMarker()295   static DeclarationName getEmptyMarker() {
296     return DeclarationName(uintptr_t(-1));
297   }
298 
getTombstoneMarker()299   static DeclarationName getTombstoneMarker() {
300     return DeclarationName(uintptr_t(-2));
301   }
302 
303   static int compare(DeclarationName LHS, DeclarationName RHS);
304 
305   void dump() const;
306 };
307 
308 raw_ostream &operator<<(raw_ostream &OS, DeclarationName N);
309 
310 /// Ordering on two declaration names. If both names are identifiers,
311 /// this provides a lexicographical ordering.
312 inline bool operator<(DeclarationName LHS, DeclarationName RHS) {
313   return DeclarationName::compare(LHS, RHS) < 0;
314 }
315 
316 /// Ordering on two declaration names. If both names are identifiers,
317 /// this provides a lexicographical ordering.
318 inline bool operator>(DeclarationName LHS, DeclarationName RHS) {
319   return DeclarationName::compare(LHS, RHS) > 0;
320 }
321 
322 /// Ordering on two declaration names. If both names are identifiers,
323 /// this provides a lexicographical ordering.
324 inline bool operator<=(DeclarationName LHS, DeclarationName RHS) {
325   return DeclarationName::compare(LHS, RHS) <= 0;
326 }
327 
328 /// Ordering on two declaration names. If both names are identifiers,
329 /// this provides a lexicographical ordering.
330 inline bool operator>=(DeclarationName LHS, DeclarationName RHS) {
331   return DeclarationName::compare(LHS, RHS) >= 0;
332 }
333 
334 /// DeclarationNameTable - Used to store and retrieve DeclarationName
335 /// instances for the various kinds of declaration names, e.g., normal
336 /// identifiers, C++ constructor names, etc. This class contains
337 /// uniqued versions of each of the C++ special names, which can be
338 /// retrieved using its member functions (e.g.,
339 /// getCXXConstructorName).
340 class DeclarationNameTable {
341   const ASTContext &Ctx;
342   void *CXXSpecialNamesImpl; // Actually a FoldingSet<CXXSpecialName> *
343   CXXOperatorIdName *CXXOperatorNames; // Operator names
344   void *CXXLiteralOperatorNames; // Actually a CXXOperatorIdName*
345 
346   DeclarationNameTable(const DeclarationNameTable&) LLVM_DELETED_FUNCTION;
347   void operator=(const DeclarationNameTable&) LLVM_DELETED_FUNCTION;
348 
349 public:
350   DeclarationNameTable(const ASTContext &C);
351   ~DeclarationNameTable();
352 
353   /// getIdentifier - Create a declaration name that is a simple
354   /// identifier.
getIdentifier(const IdentifierInfo * ID)355   DeclarationName getIdentifier(const IdentifierInfo *ID) {
356     return DeclarationName(ID);
357   }
358 
359   /// getCXXConstructorName - Returns the name of a C++ constructor
360   /// for the given Type.
361   DeclarationName getCXXConstructorName(CanQualType Ty);
362 
363   /// getCXXDestructorName - Returns the name of a C++ destructor
364   /// for the given Type.
365   DeclarationName getCXXDestructorName(CanQualType Ty);
366 
367   /// getCXXConversionFunctionName - Returns the name of a C++
368   /// conversion function for the given Type.
369   DeclarationName getCXXConversionFunctionName(CanQualType Ty);
370 
371   /// getCXXSpecialName - Returns a declaration name for special kind
372   /// of C++ name, e.g., for a constructor, destructor, or conversion
373   /// function.
374   DeclarationName getCXXSpecialName(DeclarationName::NameKind Kind,
375                                     CanQualType Ty);
376 
377   /// getCXXOperatorName - Get the name of the overloadable C++
378   /// operator corresponding to Op.
379   DeclarationName getCXXOperatorName(OverloadedOperatorKind Op);
380 
381   /// getCXXLiteralOperatorName - Get the name of the literal operator function
382   /// with II as the identifier.
383   DeclarationName getCXXLiteralOperatorName(IdentifierInfo *II);
384 };
385 
386 /// DeclarationNameLoc - Additional source/type location info
387 /// for a declaration name. Needs a DeclarationName in order
388 /// to be interpreted correctly.
389 struct DeclarationNameLoc {
390   // The source location for identifier stored elsewhere.
391   // struct {} Identifier;
392 
393   // Type info for constructors, destructors and conversion functions.
394   // Locations (if any) for the tilde (destructor) or operator keyword
395   // (conversion) are stored elsewhere.
396   struct NT {
397     TypeSourceInfo* TInfo;
398   };
399 
400   // The location (if any) of the operator keyword is stored elsewhere.
401   struct CXXOpName {
402     unsigned BeginOpNameLoc;
403     unsigned EndOpNameLoc;
404   };
405 
406   // The location (if any) of the operator keyword is stored elsewhere.
407   struct CXXLitOpName {
408     unsigned OpNameLoc;
409   };
410 
411   // struct {} CXXUsingDirective;
412   // struct {} ObjCZeroArgSelector;
413   // struct {} ObjCOneArgSelector;
414   // struct {} ObjCMultiArgSelector;
415   union {
416     struct NT NamedType;
417     struct CXXOpName CXXOperatorName;
418     struct CXXLitOpName CXXLiteralOperatorName;
419   };
420 
421   DeclarationNameLoc(DeclarationName Name);
422   // FIXME: this should go away once all DNLocs are properly initialized.
DeclarationNameLocDeclarationNameLoc423   DeclarationNameLoc() { memset((void*) this, 0, sizeof(*this)); }
424 }; // struct DeclarationNameLoc
425 
426 
427 /// DeclarationNameInfo - A collector data type for bundling together
428 /// a DeclarationName and the correspnding source/type location info.
429 struct DeclarationNameInfo {
430 private:
431   /// Name - The declaration name, also encoding name kind.
432   DeclarationName Name;
433   /// Loc - The main source location for the declaration name.
434   SourceLocation NameLoc;
435   /// Info - Further source/type location info for special kinds of names.
436   DeclarationNameLoc LocInfo;
437 
438 public:
439   // FIXME: remove it.
DeclarationNameInfoDeclarationNameInfo440   DeclarationNameInfo() {}
441 
DeclarationNameInfoDeclarationNameInfo442   DeclarationNameInfo(DeclarationName Name, SourceLocation NameLoc)
443     : Name(Name), NameLoc(NameLoc), LocInfo(Name) {}
444 
DeclarationNameInfoDeclarationNameInfo445   DeclarationNameInfo(DeclarationName Name, SourceLocation NameLoc,
446                       DeclarationNameLoc LocInfo)
447     : Name(Name), NameLoc(NameLoc), LocInfo(LocInfo) {}
448 
449   /// getName - Returns the embedded declaration name.
getNameDeclarationNameInfo450   DeclarationName getName() const { return Name; }
451   /// setName - Sets the embedded declaration name.
setNameDeclarationNameInfo452   void setName(DeclarationName N) { Name = N; }
453 
454   /// getLoc - Returns the main location of the declaration name.
getLocDeclarationNameInfo455   SourceLocation getLoc() const { return NameLoc; }
456   /// setLoc - Sets the main location of the declaration name.
setLocDeclarationNameInfo457   void setLoc(SourceLocation L) { NameLoc = L; }
458 
getInfoDeclarationNameInfo459   const DeclarationNameLoc &getInfo() const { return LocInfo; }
getInfoDeclarationNameInfo460   DeclarationNameLoc &getInfo() { return LocInfo; }
setInfoDeclarationNameInfo461   void setInfo(const DeclarationNameLoc &Info) { LocInfo = Info; }
462 
463   /// getNamedTypeInfo - Returns the source type info associated to
464   /// the name. Assumes it is a constructor, destructor or conversion.
getNamedTypeInfoDeclarationNameInfo465   TypeSourceInfo *getNamedTypeInfo() const {
466     assert(Name.getNameKind() == DeclarationName::CXXConstructorName ||
467            Name.getNameKind() == DeclarationName::CXXDestructorName ||
468            Name.getNameKind() == DeclarationName::CXXConversionFunctionName);
469     return LocInfo.NamedType.TInfo;
470   }
471   /// setNamedTypeInfo - Sets the source type info associated to
472   /// the name. Assumes it is a constructor, destructor or conversion.
setNamedTypeInfoDeclarationNameInfo473   void setNamedTypeInfo(TypeSourceInfo *TInfo) {
474     assert(Name.getNameKind() == DeclarationName::CXXConstructorName ||
475            Name.getNameKind() == DeclarationName::CXXDestructorName ||
476            Name.getNameKind() == DeclarationName::CXXConversionFunctionName);
477     LocInfo.NamedType.TInfo = TInfo;
478   }
479 
480   /// getCXXOperatorNameRange - Gets the range of the operator name
481   /// (without the operator keyword). Assumes it is a (non-literal) operator.
getCXXOperatorNameRangeDeclarationNameInfo482   SourceRange getCXXOperatorNameRange() const {
483     assert(Name.getNameKind() == DeclarationName::CXXOperatorName);
484     return SourceRange(
485      SourceLocation::getFromRawEncoding(LocInfo.CXXOperatorName.BeginOpNameLoc),
486      SourceLocation::getFromRawEncoding(LocInfo.CXXOperatorName.EndOpNameLoc)
487                        );
488   }
489   /// setCXXOperatorNameRange - Sets the range of the operator name
490   /// (without the operator keyword). Assumes it is a C++ operator.
setCXXOperatorNameRangeDeclarationNameInfo491   void setCXXOperatorNameRange(SourceRange R) {
492     assert(Name.getNameKind() == DeclarationName::CXXOperatorName);
493     LocInfo.CXXOperatorName.BeginOpNameLoc = R.getBegin().getRawEncoding();
494     LocInfo.CXXOperatorName.EndOpNameLoc = R.getEnd().getRawEncoding();
495   }
496 
497   /// getCXXLiteralOperatorNameLoc - Returns the location of the literal
498   /// operator name (not the operator keyword).
499   /// Assumes it is a literal operator.
getCXXLiteralOperatorNameLocDeclarationNameInfo500   SourceLocation getCXXLiteralOperatorNameLoc() const {
501     assert(Name.getNameKind() == DeclarationName::CXXLiteralOperatorName);
502     return SourceLocation::
503       getFromRawEncoding(LocInfo.CXXLiteralOperatorName.OpNameLoc);
504   }
505   /// setCXXLiteralOperatorNameLoc - Sets the location of the literal
506   /// operator name (not the operator keyword).
507   /// Assumes it is a literal operator.
setCXXLiteralOperatorNameLocDeclarationNameInfo508   void setCXXLiteralOperatorNameLoc(SourceLocation Loc) {
509     assert(Name.getNameKind() == DeclarationName::CXXLiteralOperatorName);
510     LocInfo.CXXLiteralOperatorName.OpNameLoc = Loc.getRawEncoding();
511   }
512 
513   /// \brief Determine whether this name involves a template parameter.
514   bool isInstantiationDependent() const;
515 
516   /// \brief Determine whether this name contains an unexpanded
517   /// parameter pack.
518   bool containsUnexpandedParameterPack() const;
519 
520   /// getAsString - Retrieve the human-readable string for this name.
521   std::string getAsString() const;
522 
523   /// printName - Print the human-readable name to a stream.
524   void printName(raw_ostream &OS) const;
525 
526   /// getBeginLoc - Retrieve the location of the first token.
getBeginLocDeclarationNameInfo527   SourceLocation getBeginLoc() const { return NameLoc; }
528   /// getEndLoc - Retrieve the location of the last token.
529   SourceLocation getEndLoc() const;
530   /// getSourceRange - The range of the declaration name.
getSourceRangeDeclarationNameInfo531   SourceRange getSourceRange() const LLVM_READONLY {
532     return SourceRange(getLocStart(), getLocEnd());
533   }
getLocStartDeclarationNameInfo534   SourceLocation getLocStart() const LLVM_READONLY {
535     return getBeginLoc();
536   }
getLocEndDeclarationNameInfo537   SourceLocation getLocEnd() const LLVM_READONLY {
538     SourceLocation EndLoc = getEndLoc();
539     return EndLoc.isValid() ? EndLoc : getLocStart();
540   }
541 };
542 
543 /// Insertion operator for diagnostics.  This allows sending DeclarationName's
544 /// into a diagnostic with <<.
545 inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
546                                            DeclarationName N) {
547   DB.AddTaggedVal(N.getAsOpaqueInteger(),
548                   DiagnosticsEngine::ak_declarationname);
549   return DB;
550 }
551 
552 /// Insertion operator for partial diagnostics.  This allows binding
553 /// DeclarationName's into a partial diagnostic with <<.
554 inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD,
555                                            DeclarationName N) {
556   PD.AddTaggedVal(N.getAsOpaqueInteger(),
557                   DiagnosticsEngine::ak_declarationname);
558   return PD;
559 }
560 
561 inline raw_ostream &operator<<(raw_ostream &OS,
562                                      DeclarationNameInfo DNInfo) {
563   DNInfo.printName(OS);
564   return OS;
565 }
566 
567 }  // end namespace clang
568 
569 namespace llvm {
570 /// Define DenseMapInfo so that DeclarationNames can be used as keys
571 /// in DenseMap and DenseSets.
572 template<>
573 struct DenseMapInfo<clang::DeclarationName> {
574   static inline clang::DeclarationName getEmptyKey() {
575     return clang::DeclarationName::getEmptyMarker();
576   }
577 
578   static inline clang::DeclarationName getTombstoneKey() {
579     return clang::DeclarationName::getTombstoneMarker();
580   }
581 
582   static unsigned getHashValue(clang::DeclarationName Name) {
583     return DenseMapInfo<void*>::getHashValue(Name.getAsOpaquePtr());
584   }
585 
586   static inline bool
587   isEqual(clang::DeclarationName LHS, clang::DeclarationName RHS) {
588     return LHS == RHS;
589   }
590 };
591 
592 template <>
593 struct isPodLike<clang::DeclarationName> { static const bool value = true; };
594 
595 }  // end namespace llvm
596 
597 #endif
598