17532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//===--- TemplateName.h - C++ Template Name Representation-------*- C++ -*-===//
27532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
37532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//                     The LLVM Compiler Infrastructure
47532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
57532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor// This file is distributed under the University of Illinois Open Source
67532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor// License. See LICENSE.TXT for details.
77532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
87532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//===----------------------------------------------------------------------===//
97532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//  This file defines the TemplateName interface and subclasses.
117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//
127532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor//===----------------------------------------------------------------------===//
137532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
147532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#ifndef LLVM_CLANG_AST_TEMPLATENAME_H
157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#define LLVM_CLANG_AST_TEMPLATENAME_H
167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
178cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner#include "clang/Basic/LLVM.h"
187532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "llvm/ADT/FoldingSet.h"
197532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "llvm/ADT/PointerUnion.h"
207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregornamespace clang {
221aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
231aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass ASTContext;
247532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass DependentTemplateName;
25db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskinclass DiagnosticBuilder;
267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass IdentifierInfo;
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass NamedDecl;
287532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass NestedNameSpecifier;
296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesenum OverloadedOperatorKind : int;
301aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass OverloadedTemplateStorage;
313b4ea54acf01f72f6eb74d96689dda86d950228fDaniel Dunbarstruct PrintingPolicy;
327532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass QualifiedTemplateName;
331aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass SubstTemplateTemplateParmPackStorage;
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass SubstTemplateTemplateParmStorage;
351aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass TemplateArgument;
367532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass TemplateDecl;
371aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass TemplateTemplateParmDecl;
381aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
391aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// \brief Implementation class used to describe either a set of overloaded
401aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// template names or an already-substituted template template parameter pack.
411aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass UncommonTemplateNameStorage {
421aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorprotected:
43146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  enum Kind {
44146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    Overloaded,
45146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParm,
46146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParmPack
47146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  };
48146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
49e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher  struct BitsTag {
50e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    /// \brief A Kind.
51e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    unsigned Kind : 2;
521aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
53e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    /// \brief The number of stored templates or template arguments,
54e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    /// depending on which subclass we have.
55e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    unsigned Size : 30;
56e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher  };
57e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher
58e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher  union {
59e462c60ac3365d3302b7d0a566c5cb7dbe0e5ae3Eric Christopher    struct BitsTag Bits;
609c34ee65a61bbfb60ae76d4df674f49df1842e70Douglas Gregor    void *PointerAlignment;
610bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  };
629c34ee65a61bbfb60ae76d4df674f49df1842e70Douglas Gregor
63146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  UncommonTemplateNameStorage(Kind kind, unsigned size) {
64146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    Bits.Kind = kind;
65146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    Bits.Size = size;
661aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
671aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
681aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorpublic:
691aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  unsigned size() const { return Bits.Size; }
701aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
711aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  OverloadedTemplateStorage *getAsOverloadedStorage()  {
72146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return Bits.Kind == Overloaded
731aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor             ? reinterpret_cast<OverloadedTemplateStorage *>(this)
746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             : nullptr;
751aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
761aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
77146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage *getAsSubstTemplateTemplateParm() {
78146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return Bits.Kind == SubstTemplateTemplateParm
79146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall             ? reinterpret_cast<SubstTemplateTemplateParmStorage *>(this)
806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             : nullptr;
81146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
82146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
831aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  SubstTemplateTemplateParmPackStorage *getAsSubstTemplateTemplateParmPack() {
84146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return Bits.Kind == SubstTemplateTemplateParmPack
85146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall             ? reinterpret_cast<SubstTemplateTemplateParmPackStorage *>(this)
866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             : nullptr;
871aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
881aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor};
891aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
901aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// \brief A structure for storing the information associated with an
911aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// overloaded template name.
921aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass OverloadedTemplateStorage : public UncommonTemplateNameStorage {
930bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  friend class ASTContext;
940bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
95146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  OverloadedTemplateStorage(unsigned size)
96146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    : UncommonTemplateNameStorage(Overloaded, size) { }
970bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
980bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  NamedDecl **getStorage() {
999c34ee65a61bbfb60ae76d4df674f49df1842e70Douglas Gregor    return reinterpret_cast<NamedDecl **>(this + 1);
1000bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  }
1010bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  NamedDecl * const *getStorage() const {
1029c34ee65a61bbfb60ae76d4df674f49df1842e70Douglas Gregor    return reinterpret_cast<NamedDecl *const *>(this + 1);
1030bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  }
1040bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
1050bd6feb9e9d40fc889fd47e899985125a43dfed8John McCallpublic:
1060bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  typedef NamedDecl *const *iterator;
1070bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall
1080bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  iterator begin() const { return getStorage(); }
1090bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  iterator end() const { return getStorage() + size(); }
1100bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall};
111146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
1121aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// \brief A structure for storing an already-substituted template template
1131aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// parameter pack.
1141aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor///
1151aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// This kind of template names occurs when the parameter pack has been
1161aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// provided with a template template argument pack in a context where its
1171aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor/// enclosing pack expansion could not be fully expanded.
1181aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorclass SubstTemplateTemplateParmPackStorage
1191aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  : public UncommonTemplateNameStorage, public llvm::FoldingSetNode
1201aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor{
1211aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  TemplateTemplateParmDecl *Parameter;
1221aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  const TemplateArgument *Arguments;
1231aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
1241aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorpublic:
125146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmPackStorage(TemplateTemplateParmDecl *Parameter,
1261aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                       unsigned Size,
1271aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                       const TemplateArgument *Arguments)
128146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    : UncommonTemplateNameStorage(SubstTemplateTemplateParmPack, Size),
1291aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      Parameter(Parameter), Arguments(Arguments) { }
1301aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
1311aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Retrieve the template template parameter pack being substituted.
1321aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  TemplateTemplateParmDecl *getParameterPack() const {
1331aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    return Parameter;
1341aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
1351aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
1361aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Retrieve the template template argument pack with which this
1371aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// parameter was substituted.
1381aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  TemplateArgument getArgumentPack() const;
1391aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
140146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context);
1411aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
142146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  static void Profile(llvm::FoldingSetNodeID &ID,
143146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                      ASTContext &Context,
1441aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                      TemplateTemplateParmDecl *Parameter,
1451aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                      const TemplateArgument &ArgPack);
1461aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor};
1477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Represents a C++ template name within the type system.
1497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// A C++ template name refers to a template within the C++ type
1517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// system. In most cases, a template name is simply a reference to a
1527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// class template, e.g.
1537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \code
1557532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template<typename T> class X { };
1567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// X<int> xi;
1587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \endcode
1597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1607532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// Here, the 'X' in \c X<int> is a template name that refers to the
1617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// declaration of the class template X, above. Template names can
1627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// also refer to function templates, C++0x template aliases, etc.
1637532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1647532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// Some template names are dependent. For example, consider:
1657532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1667532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \code
1677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template<typename MetaFun, typename T1, typename T2> struct apply2 {
1687532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///   typedef typename MetaFun::template apply<T1, T2>::type type;
1697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// };
1707532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \endcode
1717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
1727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// Here, "apply" is treated as a template name within the typename
1737532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// specifier in the typedef. "apply" is a nested template, and can
1747532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// only be understood in the context of
1757532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass TemplateName {
1760bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  typedef llvm::PointerUnion4<TemplateDecl *,
1771aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                              UncommonTemplateNameStorage *,
1781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              QualifiedTemplateName *,
1797532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                              DependentTemplateName *> StorageType;
1807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1817532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  StorageType Storage;
1827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  explicit TemplateName(void *Ptr) {
1847532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    Storage = StorageType::getFromOpaqueValue(Ptr);
1857532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
1867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1877532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
18890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  // \brief Kind of name that is actually stored.
18990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  enum NameKind {
1901aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// \brief A single template declaration.
19190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    Template,
1921aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// \brief A set of overloaded template declarations.
19390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    OverloadedTemplate,
1941aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// \brief A qualified template name, where the qualification is kept
1951aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// to describe the source code as written.
19690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    QualifiedTemplate,
1971aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// \brief A dependent template name that has not been resolved to a
1981aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// template (or set of templates).
1991aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    DependentTemplate,
200146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    /// \brief A template template parameter that has been substituted
201146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    /// for some other template name.
202146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    SubstTemplateTemplateParm,
2031aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// \brief A template template parameter pack that has been substituted for
2041aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// a template template argument pack, but has not yet been expanded into
2051aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    /// individual arguments.
2061aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    SubstTemplateTemplateParmPack
20790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  };
20890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
2097532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  TemplateName() : Storage() { }
2107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  explicit TemplateName(TemplateDecl *Template) : Storage(Template) { }
2110bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  explicit TemplateName(OverloadedTemplateStorage *Storage)
2120bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    : Storage(Storage) { }
213146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  explicit TemplateName(SubstTemplateTemplateParmStorage *Storage);
2141aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  explicit TemplateName(SubstTemplateTemplateParmPackStorage *Storage)
2151aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    : Storage(Storage) { }
2167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  explicit TemplateName(QualifiedTemplateName *Qual) : Storage(Qual) { }
2177532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  explicit TemplateName(DependentTemplateName *Dep) : Storage(Dep) { }
2187532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Determine whether this template name is NULL.
220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool isNull() const { return Storage.isNull(); }
22190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
22290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  // \brief Get the kind of name that is actually stored.
22390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  NameKind getKind() const;
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2251aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Retrieve the underlying template declaration that
2267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// this template name refers to, if known.
2277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  ///
2287532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \returns The template declaration that this template name refers
2297532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// to, if any. If the template name does not refer to a specific
2301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration because it is a dependent name, or if it refers to a
231d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// set of function templates, returns NULL.
2327532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  TemplateDecl *getAsTemplateDecl() const;
2337532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2341aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Retrieve the underlying, overloaded function template
235d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  // declarations that this template name refers to, if known.
236d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  ///
2371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \returns The set of overloaded function templates that this template
2381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// name refers to, if known. If the template name does not refer to a
239d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// specific set of function templates because it is a dependent name or
240d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// refers to a single template, returns NULL.
2410bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  OverloadedTemplateStorage *getAsOverloadedTemplate() const {
2421aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    if (UncommonTemplateNameStorage *Uncommon =
2431aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                              Storage.dyn_cast<UncommonTemplateNameStorage *>())
2441aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      return Uncommon->getAsOverloadedStorage();
2451aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
2466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
2471aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
2481aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
249146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  /// \brief Retrieve the substituted template template parameter, if
250146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  /// known.
251146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  ///
252146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  /// \returns The storage for the substituted template template parameter,
253146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  /// if known. Otherwise, returns NULL.
254146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage *getAsSubstTemplateTemplateParm() const {
255146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    if (UncommonTemplateNameStorage *uncommon =
256146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall          Storage.dyn_cast<UncommonTemplateNameStorage *>())
257146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      return uncommon->getAsSubstTemplateTemplateParm();
258146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
2596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
260146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  }
261146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
2621aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Retrieve the substituted template template parameter pack, if
2631aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// known.
2641aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  ///
2651aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \returns The storage for the substituted template template parameter pack,
2661aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// if known. Otherwise, returns NULL.
2671aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  SubstTemplateTemplateParmPackStorage *
2681aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  getAsSubstTemplateTemplateParmPack() const {
2691aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    if (UncommonTemplateNameStorage *Uncommon =
2701aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor        Storage.dyn_cast<UncommonTemplateNameStorage *>())
2711aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      return Uncommon->getAsSubstTemplateTemplateParmPack();
2721aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
2736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
2740bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  }
2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Retrieve the underlying qualified template name
2777532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// structure, if any.
2787532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  QualifiedTemplateName *getAsQualifiedTemplateName() const {
2797532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return Storage.dyn_cast<QualifiedTemplateName *>();
2807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
2817532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
2827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Retrieve the underlying dependent template name
2837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// structure, if any.
2847532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  DependentTemplateName *getAsDependentTemplateName() const {
2857532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return Storage.dyn_cast<DependentTemplateName *>();
2867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
2877532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
288146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  TemplateName getUnderlying() const;
289146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
2907532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Determines whether this is a dependent template name.
2917532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  bool isDependent() const;
2927532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
293561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  /// \brief Determines whether this is a template name that somehow
294561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  /// depends on a template parameter.
295561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  bool isInstantiationDependent() const;
296561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
297d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// \brief Determines whether this template name contains an
298d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  /// unexpanded parameter pack (for C++0x variadic templates).
299d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  bool containsUnexpandedParameterPack() const;
300d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
3017532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Print the template name.
3021734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  ///
3031734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// \param OS the output stream to which the template name will be
3041734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// printed.
3051734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  ///
3061734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// \param SuppressNNS if true, don't print the
3071734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// nested-name-specifier that precedes the template name (if it has
3081734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  /// one).
3098cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void print(raw_ostream &OS, const PrintingPolicy &Policy,
310d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor             bool SuppressNNS = false) const;
3117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
312d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  /// \brief Debugging aid that dumps the template name.
313d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  void dump(raw_ostream &OS) const;
314d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
315de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor  /// \brief Debugging aid that dumps the template name to standard
316de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor  /// error.
3179bde77309fd2f9f7a53446e374472c48c81f5182Douglas Gregor  void dump() const;
318de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor
3197532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
3207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(Storage.getOpaqueValue());
3217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
3227532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
3237532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Retrieve the template name as a void pointer.
3247532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void *getAsVoidPointer() const { return Storage.getOpaqueValue(); }
3257532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
3267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Build a template name from a void pointer.
3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static TemplateName getFromVoidPointer(void *Ptr) {
3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return TemplateName(Ptr);
3297532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
3307532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
3317532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
332db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin/// Insertion operator for diagnostics.  This allows sending TemplateName's
333db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin/// into a diagnostic with <<.
334db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskinconst DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
335db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin                                    TemplateName N);
336db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin
337146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall/// \brief A structure for storing the information associated with a
338146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall/// substituted template template parameter.
339146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallclass SubstTemplateTemplateParmStorage
340146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  : public UncommonTemplateNameStorage, public llvm::FoldingSetNode {
341146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  friend class ASTContext;
342146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
343146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  TemplateTemplateParmDecl *Parameter;
344146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  TemplateName Replacement;
345146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
346146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  SubstTemplateTemplateParmStorage(TemplateTemplateParmDecl *parameter,
347146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                   TemplateName replacement)
348146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    : UncommonTemplateNameStorage(SubstTemplateTemplateParm, 0),
349146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall      Parameter(parameter), Replacement(replacement) {}
350146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
351146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallpublic:
352146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  TemplateTemplateParmDecl *getParameter() const { return Parameter; }
353146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  TemplateName getReplacement() const { return Replacement; }
354146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
355146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  void Profile(llvm::FoldingSetNodeID &ID);
356146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
357146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  static void Profile(llvm::FoldingSetNodeID &ID,
358146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                      TemplateTemplateParmDecl *parameter,
359146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                      TemplateName replacement);
360146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall};
361146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
362146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallinline TemplateName::TemplateName(SubstTemplateTemplateParmStorage *Storage)
363146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  : Storage(Storage) { }
364146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
365146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallinline TemplateName TemplateName::getUnderlying() const {
366146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  if (SubstTemplateTemplateParmStorage *subst
367146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall        = getAsSubstTemplateTemplateParm())
368146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return subst->getReplacement().getUnderlying();
369146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  return *this;
370146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall}
371146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
3727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Represents a template name that was expressed as a
3737532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// qualified name.
3747532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
3757532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// This kind of template name refers to a template name that was
3767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// preceded by a nested name specifier, e.g., \c std::vector. Here,
3777532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// the nested name specifier is "std::" and the template name is the
3787532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// declaration for "vector". The QualifiedTemplateName class is only
3797532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// used to provide "sugar" for template names that were expressed
3807532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// with a qualified name, and has no semantic meaning. In this
381465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara/// manner, it is to TemplateName what ElaboratedType is to Type,
3827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// providing extra syntactic sugar for downstream clients.
3837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass QualifiedTemplateName : public llvm::FoldingSetNode {
3847532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The nested name specifier that qualifies the template name.
3857532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  ///
3867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// The bit is used to indicate whether the "template" keyword was
3877532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// present before the template name itself. Note that the
3887532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// "template" keyword is always redundant in this case (otherwise,
3897532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// the template name would be a dependent name and we would express
3907532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// this name with DependentTemplateName).
3917532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  llvm::PointerIntPair<NestedNameSpecifier *, 1> Qualifier;
3927532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
393d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// \brief The template declaration or set of overloaded function templates
394d99cbe66403ee39c2ee58024b9582b95649a4fc5Douglas Gregor  /// that this qualified name refers to.
3950bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  TemplateDecl *Template;
3967532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
3977532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  friend class ASTContext;
3987532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
3997532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  QualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword,
4007532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                        TemplateDecl *Template)
4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    : Qualifier(NNS, TemplateKeyword? 1 : 0),
4020bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall      Template(Template) { }
4031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4047532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
4057532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Return the nested name specifier that qualifies this name.
4067532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  NestedNameSpecifier *getQualifier() const { return Qualifier.getPointer(); }
4077532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4087532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Whether the template name was prefixed by the "template"
4097532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// keyword.
4107532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  bool hasTemplateKeyword() const { return Qualifier.getInt(); }
4117532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4120bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  /// \brief The template declaration that this qualified name refers
4130bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  /// to.
4140bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  TemplateDecl *getDecl() const { return Template; }
4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The template declaration to which this qualified name
4170bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  /// refers.
4180bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  TemplateDecl *getTemplateDecl() const { return Template; }
4191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
4210bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall    Profile(ID, getQualifier(), hasTemplateKeyword(), getTemplateDecl());
4227532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
4237532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
4250bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall                      bool TemplateKeyword, TemplateDecl *Template) {
4267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(NNS);
4277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddBoolean(TemplateKeyword);
4287532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(Template);
4297532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
4307532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
4317532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4327532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief Represents a dependent template name that cannot be
4337532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// resolved prior to template instantiation.
4347532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor///
4357532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// This kind of template name refers to a dependent template name,
4363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor/// including its nested name specifier (if any). For example,
4377532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// DependentTemplateName can refer to "MetaFun::template apply",
4387532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// where "MetaFun::" is the nested name specifier and "apply" is the
4397532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// template name referenced. The "template" keyword is implied.
4407532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass DependentTemplateName : public llvm::FoldingSetNode {
4417532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The nested name specifier that qualifies the template
4427532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// name.
443ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
444ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// The bit stored in this qualifier describes whether the \c Name field
445ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// is interpreted as an IdentifierInfo pointer (when clear) or as an
446ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator kind (when set).
447ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  llvm::PointerIntPair<NestedNameSpecifier *, 1, bool> Qualifier;
4487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The dependent template name.
450ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  union {
451ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    /// \brief The identifier template name.
452ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ///
453ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    /// Only valid when the bit on \c Qualifier is clear.
454ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    const IdentifierInfo *Identifier;
455ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
456ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    /// \brief The overloaded operator name.
457ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ///
458ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    /// Only valid when the bit on \c Qualifier is set.
459ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    OverloadedOperatorKind Operator;
460ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  };
4617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief The canonical template name to which this dependent
4637532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// template name refers.
4647532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  ///
4657532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// The canonical template name for a dependent template name is
4667532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// another dependent template name whose nested name specifier is
4677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// canonical.
4687532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  TemplateName CanonicalTemplateName;
4697532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4707532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  friend class ASTContext;
4717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DependentTemplateName(NestedNameSpecifier *Qualifier,
473ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                        const IdentifierInfo *Identifier)
474ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    : Qualifier(Qualifier, false), Identifier(Identifier),
475ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      CanonicalTemplateName(this) { }
4767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
4771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DependentTemplateName(NestedNameSpecifier *Qualifier,
478ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                        const IdentifierInfo *Identifier,
4797532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                        TemplateName Canon)
480ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    : Qualifier(Qualifier, false), Identifier(Identifier),
481ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      CanonicalTemplateName(Canon) { }
4827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
483ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  DependentTemplateName(NestedNameSpecifier *Qualifier,
484ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                        OverloadedOperatorKind Operator)
485ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  : Qualifier(Qualifier, true), Operator(Operator),
486ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    CanonicalTemplateName(this) { }
487ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
488ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  DependentTemplateName(NestedNameSpecifier *Qualifier,
489ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                        OverloadedOperatorKind Operator,
490ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                        TemplateName Canon)
491ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  : Qualifier(Qualifier, true), Operator(Operator),
492ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    CanonicalTemplateName(Canon) { }
493ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
4947532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
4957532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  /// \brief Return the nested name specifier that qualifies this name.
496ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  NestedNameSpecifier *getQualifier() const { return Qualifier.getPointer(); }
4977532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
498ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Determine whether this template name refers to an identifier.
499ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  bool isIdentifier() const { return !Qualifier.getInt(); }
5007532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
501ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Returns the identifier to which this template name refers.
502ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  const IdentifierInfo *getIdentifier() const {
503ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    assert(isIdentifier() && "Template name isn't an identifier?");
504ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return Identifier;
505ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  }
506ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
507ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Determine whether this template name refers to an overloaded
508ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// operator.
509ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  bool isOverloadedOperator() const { return Qualifier.getInt(); }
510ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
511ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Return the overloaded operator to which this template name refers.
512ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  OverloadedOperatorKind getOperator() const {
513ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    assert(isOverloadedOperator() &&
514ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor           "Template name isn't an overloaded operator?");
515ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return Operator;
516ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  }
517ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5187532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  void Profile(llvm::FoldingSetNodeID &ID) {
519ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (isIdentifier())
520ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      Profile(ID, getQualifier(), getIdentifier());
521ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    else
522ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      Profile(ID, getQualifier(), getOperator());
523ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  }
524ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
525ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
526ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                      const IdentifierInfo *Identifier) {
527ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ID.AddPointer(NNS);
528ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ID.AddBoolean(false);
529ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ID.AddPointer(Identifier);
5307532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
5317532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS,
533ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                      OverloadedOperatorKind Operator) {
5347532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    ID.AddPointer(NNS);
535ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ID.AddBoolean(true);
536ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    ID.AddInteger(Operator);
5377532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
5387532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
5397532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
540c960ee31c7e22a157a8cd31c92d9a9aa945e1e96Chris Lattner} // end namespace clang.
5417532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5427532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregornamespace llvm {
5437532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5447532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor/// \brief The clang::TemplateName class is effectively a pointer.
5457532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregortemplate<>
5467532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorclass PointerLikeTypeTraits<clang::TemplateName> {
5477532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorpublic:
5487532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  static inline void *getAsVoidPointer(clang::TemplateName TN) {
5497532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return TN.getAsVoidPointer();
5507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
5517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  static inline clang::TemplateName getFromVoidPointer(void *Ptr) {
5537532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return clang::TemplateName::getFromVoidPointer(Ptr);
5547532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
5557532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5567532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  // No bits are available!
5577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  enum { NumLowBitsAvailable = 0 };
5587532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor};
5597532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
560c960ee31c7e22a157a8cd31c92d9a9aa945e1e96Chris Lattner} // end namespace llvm.
5617532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
5627532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#endif
563