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