DeclarationName.h revision ac9590effa90406767a544005ed1de52e258306b
12e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===-- DeclarationName.h - Representation of declaration names -*- C++ -*-===//
22e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//
32e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//                     The LLVM Compiler Infrastructure
42e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//
52e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// This file is distributed under the University of Illinois Open Source
62e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// License. See LICENSE.TXT for details.
72e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//
82e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===----------------------------------------------------------------------===//
92e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//
102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// This file declares the DeclarationName and DeclarationNameTable classes.
112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//
122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===----------------------------------------------------------------------===//
132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#ifndef LLVM_CLANG_AST_DECLARATIONNAME_H
142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#define LLVM_CLANG_AST_DECLARATIONNAME_H
152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/Basic/IdentifierTable.h"
172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "clang/AST/Type.h"
1850d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor#include "clang/AST/CanonicalType.h"
19d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor#include "clang/Basic/PartialDiagnostic.h"
202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace llvm {
222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  template <typename T> struct DenseMapInfo;
232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace clang {
26011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner  class CXXSpecialName;
27011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner  class CXXOperatorIdName;
283e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  class CXXLiteralOperatorIdName;
29011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner  class DeclarationNameExtra;
302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  class IdentifierInfo;
31011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner  class MultiKeywordSelector;
322a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  class UsingDirectiveDecl;
332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
342e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// DeclarationName - The name of a declaration. In the common case,
352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this just stores an IdentifierInfo pointer to a normal
362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// name. However, it also provides encodings for Objective-C
372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// selectors (optimizing zero- and one-argument selectors, which make
382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// up 78% percent of all selectors in Cocoa.h) and special C++ names
392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// for constructors, destructors, and conversion functions.
402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass DeclarationName {
412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic:
422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// NameKind - The kind of name this object contains.
432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  enum NameKind {
442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    Identifier,
452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    ObjCZeroArgSelector,
462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    ObjCOneArgSelector,
472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    ObjCMultiArgSelector,
482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    CXXConstructorName,
492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    CXXDestructorName,
50e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    CXXConversionFunctionName,
512a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    CXXOperatorName,
523e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt    CXXLiteralOperatorName,
532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    CXXUsingDirective
542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  };
552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorprivate:
572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// StoredNameKind - The kind of name that is actually stored in the
582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// upper bits of the Ptr field. This is only used internally.
592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  enum StoredNameKind {
602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    StoredIdentifier = 0,
612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    StoredObjCZeroArgSelector,
622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    StoredObjCOneArgSelector,
63e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    StoredDeclarationNameExtra,
642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    PtrMask = 0x03
652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  };
662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// Ptr - The lowest two bits are used to express what kind of name
682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// we're actually storing, using the values of NameKind. Depending
692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// on the kind of name this is, the upper bits of Ptr may have one
702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// of several different meanings:
712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ///
72e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   StoredIdentifier - The name is a normal identifier, and Ptr is
73e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   a normal IdentifierInfo pointer.
742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ///
75e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   StoredObjCZeroArgSelector - The name is an Objective-C
76e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   selector with zero arguments, and Ptr is an IdentifierInfo
77e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   pointer pointing to the selector name.
782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ///
79e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   StoredObjCOneArgSelector - The name is an Objective-C selector
80e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   with one argument, and Ptr is an IdentifierInfo pointer
81e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   pointing to the selector name.
822e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ///
83e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   StoredDeclarationNameExtra - Ptr is actually a pointer to a
84e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   DeclarationNameExtra structure, whose first value will tell us
85e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   whether this is an Objective-C selector, C++ operator-id name,
86e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  ///   or special C++ name.
872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  uintptr_t Ptr;
882e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
892e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getStoredNameKind - Return the kind of object that is stored in
902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// Ptr.
912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  StoredNameKind getStoredNameKind() const {
922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return static_cast<StoredNameKind>(Ptr & PtrMask);
932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getExtra - Get the "extra" information associated with this
962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// multi-argument selector or C++ special name.
972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DeclarationNameExtra *getExtra() const {
98e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    assert(getStoredNameKind() == StoredDeclarationNameExtra &&
992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor           "Declaration name does not store an Extra structure");
1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return reinterpret_cast<DeclarationNameExtra *>(Ptr & ~PtrMask);
1012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
1022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getAsCXXSpecialName - If the stored pointer is actually a
1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// CXXSpecialName, returns a pointer to it. Otherwise, returns
1052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// a NULL pointer.
1062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  CXXSpecialName *getAsCXXSpecialName() const {
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (getNameKind() >= CXXConstructorName &&
1082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor        getNameKind() <= CXXConversionFunctionName)
1092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return reinterpret_cast<CXXSpecialName *>(Ptr & ~PtrMask);
110ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner    return 0;
1112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
1122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
113e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// getAsCXXOperatorIdName
114e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  CXXOperatorIdName *getAsCXXOperatorIdName() const {
115e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    if (getNameKind() == CXXOperatorName)
116e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor      return reinterpret_cast<CXXOperatorIdName *>(Ptr & ~PtrMask);
117ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner    return 0;
118e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
119e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
1203e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  CXXLiteralOperatorIdName *getAsCXXLiteralOperatorIdName() const {
1213e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt    if (getNameKind() == CXXLiteralOperatorName)
1223e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt      return reinterpret_cast<CXXLiteralOperatorIdName *>(Ptr & ~PtrMask);
1233e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt    return 0;
1243e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  }
1253e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
1262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Construct a declaration name from the name of a C++ constructor,
1272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // destructor, or conversion function.
1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName(CXXSpecialName *Name)
1291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : Ptr(reinterpret_cast<uintptr_t>(Name)) {
1302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXSpecialName");
131e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    Ptr |= StoredDeclarationNameExtra;
132e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
133e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
134e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  // Construct a declaration name from the name of a C++ overloaded
135e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  // operator.
1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName(CXXOperatorIdName *Name)
1371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : Ptr(reinterpret_cast<uintptr_t>(Name)) {
138e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXOperatorId");
139e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    Ptr |= StoredDeclarationNameExtra;
1402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
1412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1423e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  DeclarationName(CXXLiteralOperatorIdName *Name)
1433e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt    : Ptr(reinterpret_cast<uintptr_t>(Name)) {
1443e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt    assert((Ptr & PtrMask) == 0 && "Improperly aligned CXXLiteralOperatorId");
1453e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt    Ptr |= StoredDeclarationNameExtra;
1463e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  }
1473e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
1482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// Construct a declaration name from a raw pointer.
1492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DeclarationName(uintptr_t Ptr) : Ptr(Ptr) { }
1502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  friend class DeclarationNameTable;
1522a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  friend class NamedDecl;
1532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1542def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// getFETokenInfoAsVoid - Retrieves the front end-specified pointer
1552def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// for this name as a void pointer.
1562def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *getFETokenInfoAsVoid() const;
1572def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
1582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic:
1592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// DeclarationName - Used to create an empty selector.
1602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DeclarationName() : Ptr(0) { }
1612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Construct a declaration name from an IdentifierInfo *.
1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName(const IdentifierInfo *II)
1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : Ptr(reinterpret_cast<uintptr_t>(II)) {
1652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo");
1662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
1672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  // Construct a declaration name from an Objective-C selector.
1692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DeclarationName(Selector Sel);
1702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1716ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  /// getUsingDirectiveName - Return name for all using-directives.
1726ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor  static DeclarationName getUsingDirectiveName();
1736ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor
1742def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  // operator bool() - Evaluates true when this declaration name is
1752def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  // non-empty.
1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  operator bool() const {
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return ((Ptr & PtrMask) != 0) ||
1782def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor           (reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask));
1792def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  }
1802def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
18191058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner  /// Predicate functions for querying what type of name this is.
18291058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner  bool isIdentifier() const { return getStoredNameKind() == StoredIdentifier; }
18391058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner  bool isObjCZeroArgSelector() const {
18491058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner    return getStoredNameKind() == StoredObjCZeroArgSelector;
18591058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner  }
18691058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner  bool isObjCOneArgSelector() const {
18791058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner    return getStoredNameKind() == StoredObjCOneArgSelector;
18891058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner  }
1891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1902e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getNameKind - Determine what kind of name this is.
1912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  NameKind getNameKind() const;
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19348026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor  /// \brief Determines whether the name itself is dependent, e.g., because it
19448026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor  /// involves a C++ type that is itself dependent.
19548026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor  ///
19648026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor  /// Note that this does not capture all of the notions of "dependent name",
19748026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor  /// because an identifier can be a dependent name if it is used as the
19848026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor  /// callee in a call expression with dependent arguments.
19948026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor  bool isDependentName() const;
20048026d26fb58e413544874eead5491b1452e2ebfDouglas Gregor
201f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer  /// getNameAsString - Retrieve the human-readable string for this name.
20210bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  std::string getAsString() const;
20310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor
204f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer  /// printName - Print the human-readable name to a stream.
205f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer  void printName(llvm::raw_ostream &OS) const;
206f6cde77d7bc34bbee26b086ff192637af8e9da59Benjamin Kramer
2072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getAsIdentifierInfo - Retrieve the IdentifierInfo * stored in
2082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// this declaration name, or NULL if this declaration name isn't a
2092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// simple identifier.
2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  IdentifierInfo *getAsIdentifierInfo() const {
21191058ff73fd3b00275348dd4d49f83501dfc0542Chris Lattner    if (isIdentifier())
2122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      return reinterpret_cast<IdentifierInfo *>(Ptr);
213ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner    return 0;
2142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
2152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getAsOpaqueInteger - Get the representation of this declaration
2172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// name as an opaque integer.
2182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  uintptr_t getAsOpaqueInteger() const { return Ptr; }
2192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
22044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  /// getAsOpaquePtr - Get the representation of this declaration name as
22144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  /// an opaque pointer.
22244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  void *getAsOpaquePtr() const { return reinterpret_cast<void*>(Ptr); }
22344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
224a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor  static DeclarationName getFromOpaquePtr(void *P) {
225a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor    DeclarationName N;
226a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor    N.Ptr = reinterpret_cast<uintptr_t> (P);
227a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor    return N;
228a8f32e0965ee19ecc53cd796e34268377a20357cDouglas Gregor  }
2293e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
230011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner  static DeclarationName getFromOpaqueInteger(uintptr_t P) {
231011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner    DeclarationName N;
232011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner    N.Ptr = P;
233011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner    return N;
234011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner  }
2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getCXXNameType - If this name is one of the C++ names (of a
2372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// constructor, destructor, or conversion function), return the
2382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// type associated with that name.
2392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  QualType getCXXNameType() const;
2402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
241e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// getCXXOverloadedOperator - If this name is the name of an
242e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// overloadable operator in C++ (e.g., @c operator+), retrieve the
243e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// kind of overloaded operator.
244e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  OverloadedOperatorKind getCXXOverloadedOperator() const;
245e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
2463e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  /// getCXXLiteralIdentifier - If this name is the name of a literal
2473e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  /// operator, retrieve the identifier associated with it.
2483e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  IdentifierInfo *getCXXLiteralIdentifier() const;
2493e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
2502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getObjCSelector - Get the Objective-C selector stored in this
2512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// declaration name.
2522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  Selector getObjCSelector() const;
2532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2542def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// getFETokenInfo/setFETokenInfo - The language front-end is
2552def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// allowed to associate arbitrary metadata with some kinds of
2562def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// declaration names, including normal identifiers and C++
2572def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// constructors, destructors, and conversion functions.
2582def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  template<typename T>
2592def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  T *getFETokenInfo() const { return static_cast<T*>(getFETokenInfoAsVoid()); }
2602def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2612def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void setFETokenInfo(void *T);
2622def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor
2632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// operator== - Determine whether the specified names are identical..
2642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  friend bool operator==(DeclarationName LHS, DeclarationName RHS) {
2652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return LHS.Ptr == RHS.Ptr;
2662e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
2672e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2682e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// operator!= - Determine whether the specified names are different.
2692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  friend bool operator!=(DeclarationName LHS, DeclarationName RHS) {
2702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return LHS.Ptr != RHS.Ptr;
2712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
2722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  static DeclarationName getEmptyMarker() {
2742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName(uintptr_t(-1));
2752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
2762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2772e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  static DeclarationName getTombstoneMarker() {
2782e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName(uintptr_t(-2));
2792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
2807fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall
2817fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall  static int compare(DeclarationName LHS, DeclarationName RHS);
28270f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson
28370f5bc77dbe4172bde860e15d8b3c29e0d5005cbAnders Carlsson  void dump() const;
2842e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor};
2852e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2862e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers,
2872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering.
2887fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCallinline bool operator<(DeclarationName LHS, DeclarationName RHS) {
2897fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall  return DeclarationName::compare(LHS, RHS) < 0;
2907fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall}
2912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers,
2932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering.
2942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator>(DeclarationName LHS, DeclarationName RHS) {
2957fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall  return DeclarationName::compare(LHS, RHS) > 0;
2962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
2972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
2982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers,
2992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering.
3002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator<=(DeclarationName LHS, DeclarationName RHS) {
3017fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall  return DeclarationName::compare(LHS, RHS) <= 0;
3022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
3032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Ordering on two declaration names. If both names are identifiers,
3052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// this provides a lexicographical ordering.
3062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorinline bool operator>=(DeclarationName LHS, DeclarationName RHS) {
3077fe0b9ea2c8137c035402e6ea01dfdfbc93214cbJohn McCall  return DeclarationName::compare(LHS, RHS) >= 0;
3082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
3092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// DeclarationNameTable - Used to store and retrieve DeclarationName
3112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// instances for the various kinds of declaration names, e.g., normal
3122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// identifiers, C++ constructor names, etc. This class contains
3132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// uniqued versions of each of the C++ special names, which can be
3142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// retrieved using its member functions (e.g.,
3152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// getCXXConstructorName).
3162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorclass DeclarationNameTable {
3172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  void *CXXSpecialNamesImpl; // Actually a FoldingSet<CXXSpecialName> *
318e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  CXXOperatorIdName *CXXOperatorNames; // Operator names
319ac9590effa90406767a544005ed1de52e258306bTed Kremenek  void *CXXLiteralOperatorNames; // Actually a CXXOperatorIdName*
3202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DeclarationNameTable(const DeclarationNameTable&);            // NONCOPYABLE
3222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DeclarationNameTable& operator=(const DeclarationNameTable&); // NONCOPYABLE
3232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorpublic:
325ac9590effa90406767a544005ed1de52e258306bTed Kremenek  DeclarationNameTable(ASTContext &C);
3262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  ~DeclarationNameTable();
3272e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
328ac9590effa90406767a544005ed1de52e258306bTed Kremenek  /// Free all memory allocated associated with this DeclarationTable that
329ac9590effa90406767a544005ed1de52e258306bTed Kremenek  //  is used allocated using the specified ASTContext object.
330ac9590effa90406767a544005ed1de52e258306bTed Kremenek  void DoDestroy(ASTContext &C);
331ac9590effa90406767a544005ed1de52e258306bTed Kremenek
3322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getIdentifier - Create a declaration name that is a simple
3332e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// identifier.
334909e58988b3a3bb2ad36bec03aafa1302544fd73John McCall  DeclarationName getIdentifier(const IdentifierInfo *ID) {
3352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return DeclarationName(ID);
3362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
3372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getCXXConstructorName - Returns the name of a C++ constructor
3392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// for the given Type.
34050d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor  DeclarationName getCXXConstructorName(CanQualType Ty) {
34120b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor    return getCXXSpecialName(DeclarationName::CXXConstructorName,
34220b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor                             Ty.getUnqualifiedType());
3432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
3442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getCXXDestructorName - Returns the name of a C++ destructor
3462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// for the given Type.
34750d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor  DeclarationName getCXXDestructorName(CanQualType Ty) {
34820b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor    return getCXXSpecialName(DeclarationName::CXXDestructorName,
34920b3c9dda95e6808865110a21bfec25f95ebcaa7Douglas Gregor                             Ty.getUnqualifiedType());
3502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
3512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getCXXConversionFunctionName - Returns the name of a C++
3532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// conversion function for the given Type.
35450d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor  DeclarationName getCXXConversionFunctionName(CanQualType Ty) {
3552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return getCXXSpecialName(DeclarationName::CXXConversionFunctionName, Ty);
3562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
3572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// getCXXSpecialName - Returns a declaration name for special kind
3592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// of C++ name, e.g., for a constructor, destructor, or conversion
3602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  /// function.
3611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName getCXXSpecialName(DeclarationName::NameKind Kind,
36250d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor                                    CanQualType Ty);
363e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
364e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// getCXXOperatorName - Get the name of the overloadable C++
365e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  /// operator corresponding to Op.
366e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  DeclarationName getCXXOperatorName(OverloadedOperatorKind Op);
3673e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
3683e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  /// getCXXLiteralOperatorName - Get the name of the literal operator function
3693e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  /// with II as the identifier.
3703e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  DeclarationName getCXXLiteralOperatorName(IdentifierInfo *II);
3711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump};
3722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
373011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner/// Insertion operator for diagnostics.  This allows sending DeclarationName's
374011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner/// into a diagnostic with <<.
375011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattnerinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
376011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner                                           DeclarationName N) {
377011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner  DB.AddTaggedVal(N.getAsOpaqueInteger(),
378011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner                  Diagnostic::ak_declarationname);
379011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner  return DB;
380011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner}
3811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor/// Insertion operator for partial diagnostics.  This allows binding
383d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor/// DeclarationName's into a partial diagnostic with <<.
384d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregorinline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD,
385d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor                                           DeclarationName N) {
386d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor  PD.AddTaggedVal(N.getAsOpaqueInteger(),
387d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor                  Diagnostic::ak_declarationname);
388d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor  return PD;
389d5a423b279e787e9fdd8309fe52cb515388c54eaDouglas Gregor}
39047c24b1d94f446c43e3a64732867eabed7d9c961Chandler Carruth
3912e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}  // end namespace clang
3922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
3932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace llvm {
3942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// Define DenseMapInfo so that DeclarationNames can be used as keys
3952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor/// in DenseMap and DenseSets.
3962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregortemplate<>
3972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorstruct DenseMapInfo<clang::DeclarationName> {
3982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  static inline clang::DeclarationName getEmptyKey() {
3992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return clang::DeclarationName::getEmptyMarker();
4002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
4012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
4022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  static inline clang::DeclarationName getTombstoneKey() {
4032e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return clang::DeclarationName::getTombstoneMarker();
4042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
4052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
4062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  static unsigned getHashValue(clang::DeclarationName);
4072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
4081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static inline bool
4092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  isEqual(clang::DeclarationName LHS, clang::DeclarationName RHS) {
4102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    return LHS == RHS;
4112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  }
4122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor};
4132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
41406159e878569e5f39bf0e8f11b84ac3ad0970597Chris Lattnertemplate <>
41506159e878569e5f39bf0e8f11b84ac3ad0970597Chris Lattnerstruct isPodLike<clang::DeclarationName> { static const bool value = true; };
41606159e878569e5f39bf0e8f11b84ac3ad0970597Chris Lattner
4172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}  // end namespace llvm
4182e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
4192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#endif
420