155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth//===--- TemplateName.cpp - C++ Template Name Representation---------------===//
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//===----------------------------------------------------------------------===//
13c960ee31c7e22a157a8cd31c92d9a9aa945e1e96Chris Lattner
147532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "clang/AST/TemplateName.h"
157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "clang/AST/DeclTemplate.h"
167532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "clang/AST/NestedNameSpecifier.h"
17d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor#include "clang/AST/PrettyPrinter.h"
1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/TemplateBase.h"
19db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin#include "clang/Basic/Diagnostic.h"
20e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner#include "clang/Basic/LangOptions.h"
217532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor#include "llvm/Support/raw_ostream.h"
227532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorusing namespace clang;
23db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskinusing namespace llvm;
247532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
251aee05d08b2184acadeb36de300e216390780d6cDouglas GregorTemplateArgument
261aee05d08b2184acadeb36de300e216390780d6cDouglas GregorSubstTemplateTemplateParmPackStorage::getArgumentPack() const {
271aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  return TemplateArgument(Arguments, size());
281aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor}
291aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
30146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallvoid SubstTemplateTemplateParmStorage::Profile(llvm::FoldingSetNodeID &ID) {
31146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  Profile(ID, Parameter, Replacement);
32146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall}
33146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
34146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallvoid SubstTemplateTemplateParmStorage::Profile(llvm::FoldingSetNodeID &ID,
35146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                           TemplateTemplateParmDecl *parameter,
36146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                               TemplateName replacement) {
37146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  ID.AddPointer(parameter);
38146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  ID.AddPointer(replacement.getAsVoidPointer());
39146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall}
40146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
41146060435c3efce95c95a092c7a1eb651cfb9ae0John McCallvoid SubstTemplateTemplateParmPackStorage::Profile(llvm::FoldingSetNodeID &ID,
42146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall                                                   ASTContext &Context) {
431aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  Profile(ID, Context, Parameter, TemplateArgument(Arguments, size()));
441aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor}
451aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
461aee05d08b2184acadeb36de300e216390780d6cDouglas Gregorvoid SubstTemplateTemplateParmPackStorage::Profile(llvm::FoldingSetNodeID &ID,
471aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                                   ASTContext &Context,
481aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                           TemplateTemplateParmDecl *Parameter,
491aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                             const TemplateArgument &ArgPack) {
501aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  ID.AddPointer(Parameter);
511aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  ArgPack.Profile(ID, Context);
521aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor}
531aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
5490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios KyrtzidisTemplateName::NameKind TemplateName::getKind() const {
5590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  if (Storage.is<TemplateDecl *>())
5690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    return Template;
571aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  if (Storage.is<DependentTemplateName *>())
581aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    return DependentTemplate;
5990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  if (Storage.is<QualifiedTemplateName *>())
6090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    return QualifiedTemplate;
61146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
62146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  UncommonTemplateNameStorage *uncommon
63146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    = Storage.get<UncommonTemplateNameStorage*>();
64146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  if (uncommon->getAsOverloadedStorage())
65146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return OverloadedTemplate;
66146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  if (uncommon->getAsSubstTemplateTemplateParm())
67146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return SubstTemplateTemplateParm;
68146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  return SubstTemplateTemplateParmPack;
6990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
7090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateDecl *TemplateName::getAsTemplateDecl() const {
727532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
737532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return Template;
741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
757532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
767532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    return QTN->getTemplateDecl();
777532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
78146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  if (SubstTemplateTemplateParmStorage *sub = getAsSubstTemplateTemplateParm())
79146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    return sub->getReplacement().getAsTemplateDecl();
80146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall
816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
827532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
837532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
847532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorbool TemplateName::isDependent() const {
857532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (TemplateDecl *Template = getAsTemplateDecl()) {
866b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    if (isa<TemplateTemplateParmDecl>(Template))
876b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis      return true;
886b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    // FIXME: Hack, getDeclContext() can be null if Template is still
896b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    // initializing due to PCH reading, so we check it before using it.
906b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    // Should probably modify TemplateSpecializationType to allow constructing
916b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    // it without the isDependent() checking.
926b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    return Template->getDeclContext() &&
936b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis           Template->getDeclContext()->isDependentContext();
947532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
957532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
960bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall  assert(!getAsOverloadedTemplate() &&
970bd6feb9e9d40fc889fd47e899985125a43dfed8John McCall         "overloaded templates shouldn't survive to here");
981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
997532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  return true;
1007532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
1017532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
102561f81243f665cf2001caadc45df505f826b72d6Douglas Gregorbool TemplateName::isInstantiationDependent() const {
103561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
104561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    if (QTN->getQualifier()->isInstantiationDependent())
105561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor      return true;
106561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  }
107561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
108561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  return isDependent();
109561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor}
110561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
111d0937224f383c7cc72c947119380f9713a070c73Douglas Gregorbool TemplateName::containsUnexpandedParameterPack() const {
112d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  if (TemplateDecl *Template = getAsTemplateDecl()) {
113d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    if (TemplateTemplateParmDecl *TTP
114d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor                                  = dyn_cast<TemplateTemplateParmDecl>(Template))
115d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor      return TTP->isParameterPack();
116d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
117d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    return false;
118d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  }
119d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
120d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  if (DependentTemplateName *DTN = getAsDependentTemplateName())
121d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    return DTN->getQualifier() &&
122d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor      DTN->getQualifier()->containsUnexpandedParameterPack();
123d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return getAsSubstTemplateTemplateParmPack() != nullptr;
125d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor}
126d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
1285f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerTemplateName::print(raw_ostream &OS, const PrintingPolicy &Policy,
129d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                    bool SuppressNNS) const {
1307532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (TemplateDecl *Template = Storage.dyn_cast<TemplateDecl *>())
131b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer    OS << *Template;
1327532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  else if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) {
1331734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor    if (!SuppressNNS)
134d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      QTN->getQualifier()->print(OS, Policy);
1357532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    if (QTN->hasTemplateKeyword())
1367532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor      OS << "template ";
137b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer    OS << *QTN->getDecl();
1387532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  } else if (DependentTemplateName *DTN = getAsDependentTemplateName()) {
1393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!SuppressNNS && DTN->getQualifier())
140d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      DTN->getQualifier()->print(OS, Policy);
1417532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    OS << "template ";
142ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
143ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
144ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      OS << DTN->getIdentifier()->getName();
145ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    else
146ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      OS << "operator " << getOperatorSpelling(DTN->getOperator());
147146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall  } else if (SubstTemplateTemplateParmStorage *subst
148146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall               = getAsSubstTemplateTemplateParm()) {
149146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    subst->getReplacement().print(OS, Policy, SuppressNNS);
1501aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  } else if (SubstTemplateTemplateParmPackStorage *SubstPack
1511aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                        = getAsSubstTemplateTemplateParmPack())
152a59d20b135bfde058a5a69045bab5ec4e2553f74Benjamin Kramer    OS << *SubstPack->getParameterPack();
1536cd9d4aa13c2145c8b4398453974515b734bfe42Douglas Gregor  else {
1546cd9d4aa13c2145c8b4398453974515b734bfe42Douglas Gregor    OverloadedTemplateStorage *OTS = getAsOverloadedTemplate();
1556cd9d4aa13c2145c8b4398453974515b734bfe42Douglas Gregor    (*OTS->begin())->printName(OS);
1566cd9d4aa13c2145c8b4398453974515b734bfe42Douglas Gregor  }
1577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor}
158de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor
159db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskinconst DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
160db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin                                           TemplateName N) {
161db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin  std::string NameStr;
162db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin  raw_string_ostream OS(NameStr);
163db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin  LangOptions LO;
164db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin  LO.CPlusPlus = true;
165db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin  LO.Bool = true;
1664b02dff7aebb98d2d60b2ff4d3fc86109213128cDavid Blaikie  OS << '\'';
167db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin  N.print(OS, PrintingPolicy(LO));
1684b02dff7aebb98d2d60b2ff4d3fc86109213128cDavid Blaikie  OS << '\'';
169db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin  OS.flush();
170db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin  return DB << NameStr;
171db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin}
172db88d8ad74097e2601d81ee863ce46a8a48a7034Jeffrey Yasskin
173d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid TemplateName::dump(raw_ostream &OS) const {
174e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  LangOptions LO;  // FIXME!
175e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  LO.CPlusPlus = true;
176e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  LO.Bool = true;
177d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  print(OS, PrintingPolicy(LO));
178d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko}
179d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko
180d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienkovoid TemplateName::dump() const {
181d538ed9b2a617239d5bd56357663de62f6f9224cAlexander Kornienko  dump(llvm::errs());
182de650ae96b53eb6109f29fdb5ee51c514259e6e4Douglas Gregor}
183