TemplateBase.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. //===--- TemplateBase.cpp - Common template AST class implementation ------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file implements common classes used throughout C++ template
  11. // representations.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "clang/AST/TemplateBase.h"
  15. #include "clang/AST/ASTContext.h"
  16. #include "clang/AST/DeclBase.h"
  17. #include "clang/AST/DeclTemplate.h"
  18. #include "clang/AST/Expr.h"
  19. #include "clang/AST/ExprCXX.h"
  20. #include "clang/AST/Type.h"
  21. #include "clang/AST/TypeLoc.h"
  22. #include "clang/Basic/Diagnostic.h"
  23. #include "llvm/ADT/FoldingSet.h"
  24. #include "llvm/ADT/SmallString.h"
  25. #include <algorithm>
  26. #include <cctype>
  27. using namespace clang;
  28. /// \brief Print a template integral argument value.
  29. ///
  30. /// \param TemplArg the TemplateArgument instance to print.
  31. ///
  32. /// \param Out the raw_ostream instance to use for printing.
  33. static void printIntegral(const TemplateArgument &TemplArg,
  34. raw_ostream &Out) {
  35. const ::clang::Type *T = TemplArg.getIntegralType().getTypePtr();
  36. const llvm::APSInt *Val = TemplArg.getAsIntegral();
  37. if (T->isBooleanType()) {
  38. Out << (Val->getBoolValue() ? "true" : "false");
  39. } else if (T->isCharType()) {
  40. const char Ch = Val->getZExtValue();
  41. Out << ((Ch == '\'') ? "'\\" : "'");
  42. Out.write_escaped(StringRef(&Ch, 1), /*UseHexEscapes=*/ true);
  43. Out << "'";
  44. } else {
  45. Out << Val->toString(10);
  46. }
  47. }
  48. //===----------------------------------------------------------------------===//
  49. // TemplateArgument Implementation
  50. //===----------------------------------------------------------------------===//
  51. TemplateArgument TemplateArgument::CreatePackCopy(ASTContext &Context,
  52. const TemplateArgument *Args,
  53. unsigned NumArgs) {
  54. if (NumArgs == 0)
  55. return TemplateArgument(0, 0);
  56. TemplateArgument *Storage = new (Context) TemplateArgument [NumArgs];
  57. std::copy(Args, Args + NumArgs, Storage);
  58. return TemplateArgument(Storage, NumArgs);
  59. }
  60. bool TemplateArgument::isDependent() const {
  61. switch (getKind()) {
  62. case Null:
  63. llvm_unreachable("Should not have a NULL template argument");
  64. case Type:
  65. return getAsType()->isDependentType();
  66. case Template:
  67. return getAsTemplate().isDependent();
  68. case TemplateExpansion:
  69. return true;
  70. case Declaration:
  71. if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl()))
  72. return DC->isDependentContext();
  73. return getAsDecl()->getDeclContext()->isDependentContext();
  74. case Integral:
  75. // Never dependent
  76. return false;
  77. case Expression:
  78. return (getAsExpr()->isTypeDependent() || getAsExpr()->isValueDependent());
  79. case Pack:
  80. for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P) {
  81. if (P->isDependent())
  82. return true;
  83. }
  84. return false;
  85. }
  86. llvm_unreachable("Invalid TemplateArgument Kind!");
  87. }
  88. bool TemplateArgument::isInstantiationDependent() const {
  89. switch (getKind()) {
  90. case Null:
  91. llvm_unreachable("Should not have a NULL template argument");
  92. case Type:
  93. return getAsType()->isInstantiationDependentType();
  94. case Template:
  95. return getAsTemplate().isInstantiationDependent();
  96. case TemplateExpansion:
  97. return true;
  98. case Declaration:
  99. if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl()))
  100. return DC->isDependentContext();
  101. return getAsDecl()->getDeclContext()->isDependentContext();
  102. case Integral:
  103. // Never dependent
  104. return false;
  105. case Expression:
  106. return getAsExpr()->isInstantiationDependent();
  107. case Pack:
  108. for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P) {
  109. if (P->isInstantiationDependent())
  110. return true;
  111. }
  112. return false;
  113. }
  114. llvm_unreachable("Invalid TemplateArgument Kind!");
  115. }
  116. bool TemplateArgument::isPackExpansion() const {
  117. switch (getKind()) {
  118. case Null:
  119. case Declaration:
  120. case Integral:
  121. case Pack:
  122. case Template:
  123. return false;
  124. case TemplateExpansion:
  125. return true;
  126. case Type:
  127. return isa<PackExpansionType>(getAsType());
  128. case Expression:
  129. return isa<PackExpansionExpr>(getAsExpr());
  130. }
  131. llvm_unreachable("Invalid TemplateArgument Kind!");
  132. }
  133. bool TemplateArgument::containsUnexpandedParameterPack() const {
  134. switch (getKind()) {
  135. case Null:
  136. case Declaration:
  137. case Integral:
  138. case TemplateExpansion:
  139. break;
  140. case Type:
  141. if (getAsType()->containsUnexpandedParameterPack())
  142. return true;
  143. break;
  144. case Template:
  145. if (getAsTemplate().containsUnexpandedParameterPack())
  146. return true;
  147. break;
  148. case Expression:
  149. if (getAsExpr()->containsUnexpandedParameterPack())
  150. return true;
  151. break;
  152. case Pack:
  153. for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P)
  154. if (P->containsUnexpandedParameterPack())
  155. return true;
  156. break;
  157. }
  158. return false;
  159. }
  160. llvm::Optional<unsigned> TemplateArgument::getNumTemplateExpansions() const {
  161. assert(Kind == TemplateExpansion);
  162. if (TemplateArg.NumExpansions)
  163. return TemplateArg.NumExpansions - 1;
  164. return llvm::Optional<unsigned>();
  165. }
  166. void TemplateArgument::Profile(llvm::FoldingSetNodeID &ID,
  167. const ASTContext &Context) const {
  168. ID.AddInteger(Kind);
  169. switch (Kind) {
  170. case Null:
  171. break;
  172. case Type:
  173. getAsType().Profile(ID);
  174. break;
  175. case Declaration:
  176. ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : 0);
  177. break;
  178. case Template:
  179. case TemplateExpansion: {
  180. TemplateName Template = getAsTemplateOrTemplatePattern();
  181. if (TemplateTemplateParmDecl *TTP
  182. = dyn_cast_or_null<TemplateTemplateParmDecl>(
  183. Template.getAsTemplateDecl())) {
  184. ID.AddBoolean(true);
  185. ID.AddInteger(TTP->getDepth());
  186. ID.AddInteger(TTP->getPosition());
  187. ID.AddBoolean(TTP->isParameterPack());
  188. } else {
  189. ID.AddBoolean(false);
  190. ID.AddPointer(Context.getCanonicalTemplateName(Template)
  191. .getAsVoidPointer());
  192. }
  193. break;
  194. }
  195. case Integral:
  196. getAsIntegral()->Profile(ID);
  197. getIntegralType().Profile(ID);
  198. break;
  199. case Expression:
  200. getAsExpr()->Profile(ID, Context, true);
  201. break;
  202. case Pack:
  203. ID.AddInteger(Args.NumArgs);
  204. for (unsigned I = 0; I != Args.NumArgs; ++I)
  205. Args.Args[I].Profile(ID, Context);
  206. }
  207. }
  208. bool TemplateArgument::structurallyEquals(const TemplateArgument &Other) const {
  209. if (getKind() != Other.getKind()) return false;
  210. switch (getKind()) {
  211. case Null:
  212. case Type:
  213. case Declaration:
  214. case Expression:
  215. case Template:
  216. case TemplateExpansion:
  217. return TypeOrValue == Other.TypeOrValue;
  218. case Integral:
  219. return getIntegralType() == Other.getIntegralType() &&
  220. *getAsIntegral() == *Other.getAsIntegral();
  221. case Pack:
  222. if (Args.NumArgs != Other.Args.NumArgs) return false;
  223. for (unsigned I = 0, E = Args.NumArgs; I != E; ++I)
  224. if (!Args.Args[I].structurallyEquals(Other.Args.Args[I]))
  225. return false;
  226. return true;
  227. }
  228. llvm_unreachable("Invalid TemplateArgument Kind!");
  229. }
  230. TemplateArgument TemplateArgument::getPackExpansionPattern() const {
  231. assert(isPackExpansion());
  232. switch (getKind()) {
  233. case Type:
  234. return getAsType()->getAs<PackExpansionType>()->getPattern();
  235. case Expression:
  236. return cast<PackExpansionExpr>(getAsExpr())->getPattern();
  237. case TemplateExpansion:
  238. return TemplateArgument(getAsTemplateOrTemplatePattern());
  239. case Declaration:
  240. case Integral:
  241. case Pack:
  242. case Null:
  243. case Template:
  244. return TemplateArgument();
  245. }
  246. llvm_unreachable("Invalid TemplateArgument Kind!");
  247. }
  248. void TemplateArgument::print(const PrintingPolicy &Policy,
  249. raw_ostream &Out) const {
  250. switch (getKind()) {
  251. case Null:
  252. Out << "<no value>";
  253. break;
  254. case Type: {
  255. PrintingPolicy SubPolicy(Policy);
  256. SubPolicy.SuppressStrongLifetime = true;
  257. std::string TypeStr;
  258. getAsType().getAsStringInternal(TypeStr, SubPolicy);
  259. Out << TypeStr;
  260. break;
  261. }
  262. case Declaration: {
  263. bool Unnamed = true;
  264. if (NamedDecl *ND = dyn_cast_or_null<NamedDecl>(getAsDecl())) {
  265. if (ND->getDeclName()) {
  266. Unnamed = false;
  267. Out << ND->getNameAsString();
  268. }
  269. }
  270. if (Unnamed) {
  271. Out << "<anonymous>";
  272. }
  273. break;
  274. }
  275. case Template:
  276. getAsTemplate().print(Out, Policy);
  277. break;
  278. case TemplateExpansion:
  279. getAsTemplateOrTemplatePattern().print(Out, Policy);
  280. Out << "...";
  281. break;
  282. case Integral: {
  283. printIntegral(*this, Out);
  284. break;
  285. }
  286. case Expression:
  287. getAsExpr()->printPretty(Out, 0, Policy);
  288. break;
  289. case Pack:
  290. Out << "<";
  291. bool First = true;
  292. for (TemplateArgument::pack_iterator P = pack_begin(), PEnd = pack_end();
  293. P != PEnd; ++P) {
  294. if (First)
  295. First = false;
  296. else
  297. Out << ", ";
  298. P->print(Policy, Out);
  299. }
  300. Out << ">";
  301. break;
  302. }
  303. }
  304. //===----------------------------------------------------------------------===//
  305. // TemplateArgumentLoc Implementation
  306. //===----------------------------------------------------------------------===//
  307. TemplateArgumentLocInfo::TemplateArgumentLocInfo() {
  308. memset((void*)this, 0, sizeof(TemplateArgumentLocInfo));
  309. }
  310. SourceRange TemplateArgumentLoc::getSourceRange() const {
  311. switch (Argument.getKind()) {
  312. case TemplateArgument::Expression:
  313. return getSourceExpression()->getSourceRange();
  314. case TemplateArgument::Declaration:
  315. return getSourceDeclExpression()->getSourceRange();
  316. case TemplateArgument::Type:
  317. if (TypeSourceInfo *TSI = getTypeSourceInfo())
  318. return TSI->getTypeLoc().getSourceRange();
  319. else
  320. return SourceRange();
  321. case TemplateArgument::Template:
  322. if (getTemplateQualifierLoc())
  323. return SourceRange(getTemplateQualifierLoc().getBeginLoc(),
  324. getTemplateNameLoc());
  325. return SourceRange(getTemplateNameLoc());
  326. case TemplateArgument::TemplateExpansion:
  327. if (getTemplateQualifierLoc())
  328. return SourceRange(getTemplateQualifierLoc().getBeginLoc(),
  329. getTemplateEllipsisLoc());
  330. return SourceRange(getTemplateNameLoc(), getTemplateEllipsisLoc());
  331. case TemplateArgument::Integral:
  332. case TemplateArgument::Pack:
  333. case TemplateArgument::Null:
  334. return SourceRange();
  335. }
  336. llvm_unreachable("Invalid TemplateArgument Kind!");
  337. }
  338. TemplateArgumentLoc
  339. TemplateArgumentLoc::getPackExpansionPattern(SourceLocation &Ellipsis,
  340. llvm::Optional<unsigned> &NumExpansions,
  341. ASTContext &Context) const {
  342. assert(Argument.isPackExpansion());
  343. switch (Argument.getKind()) {
  344. case TemplateArgument::Type: {
  345. // FIXME: We shouldn't ever have to worry about missing
  346. // type-source info!
  347. TypeSourceInfo *ExpansionTSInfo = getTypeSourceInfo();
  348. if (!ExpansionTSInfo)
  349. ExpansionTSInfo = Context.getTrivialTypeSourceInfo(
  350. getArgument().getAsType(),
  351. Ellipsis);
  352. PackExpansionTypeLoc Expansion
  353. = cast<PackExpansionTypeLoc>(ExpansionTSInfo->getTypeLoc());
  354. Ellipsis = Expansion.getEllipsisLoc();
  355. TypeLoc Pattern = Expansion.getPatternLoc();
  356. NumExpansions = Expansion.getTypePtr()->getNumExpansions();
  357. // FIXME: This is horrible. We know where the source location data is for
  358. // the pattern, and we have the pattern's type, but we are forced to copy
  359. // them into an ASTContext because TypeSourceInfo bundles them together
  360. // and TemplateArgumentLoc traffics in TypeSourceInfo pointers.
  361. TypeSourceInfo *PatternTSInfo
  362. = Context.CreateTypeSourceInfo(Pattern.getType(),
  363. Pattern.getFullDataSize());
  364. memcpy(PatternTSInfo->getTypeLoc().getOpaqueData(),
  365. Pattern.getOpaqueData(), Pattern.getFullDataSize());
  366. return TemplateArgumentLoc(TemplateArgument(Pattern.getType()),
  367. PatternTSInfo);
  368. }
  369. case TemplateArgument::Expression: {
  370. PackExpansionExpr *Expansion
  371. = cast<PackExpansionExpr>(Argument.getAsExpr());
  372. Expr *Pattern = Expansion->getPattern();
  373. Ellipsis = Expansion->getEllipsisLoc();
  374. NumExpansions = Expansion->getNumExpansions();
  375. return TemplateArgumentLoc(Pattern, Pattern);
  376. }
  377. case TemplateArgument::TemplateExpansion:
  378. Ellipsis = getTemplateEllipsisLoc();
  379. NumExpansions = Argument.getNumTemplateExpansions();
  380. return TemplateArgumentLoc(Argument.getPackExpansionPattern(),
  381. getTemplateQualifierLoc(),
  382. getTemplateNameLoc());
  383. case TemplateArgument::Declaration:
  384. case TemplateArgument::Template:
  385. case TemplateArgument::Integral:
  386. case TemplateArgument::Pack:
  387. case TemplateArgument::Null:
  388. return TemplateArgumentLoc();
  389. }
  390. llvm_unreachable("Invalid TemplateArgument Kind!");
  391. }
  392. const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
  393. const TemplateArgument &Arg) {
  394. switch (Arg.getKind()) {
  395. case TemplateArgument::Null:
  396. // This is bad, but not as bad as crashing because of argument
  397. // count mismatches.
  398. return DB << "(null template argument)";
  399. case TemplateArgument::Type:
  400. return DB << Arg.getAsType();
  401. case TemplateArgument::Declaration:
  402. return DB << Arg.getAsDecl();
  403. case TemplateArgument::Integral:
  404. return DB << Arg.getAsIntegral()->toString(10);
  405. case TemplateArgument::Template:
  406. return DB << Arg.getAsTemplate();
  407. case TemplateArgument::TemplateExpansion:
  408. return DB << Arg.getAsTemplateOrTemplatePattern() << "...";
  409. case TemplateArgument::Expression: {
  410. // This shouldn't actually ever happen, so it's okay that we're
  411. // regurgitating an expression here.
  412. // FIXME: We're guessing at LangOptions!
  413. SmallString<32> Str;
  414. llvm::raw_svector_ostream OS(Str);
  415. LangOptions LangOpts;
  416. LangOpts.CPlusPlus = true;
  417. PrintingPolicy Policy(LangOpts);
  418. Arg.getAsExpr()->printPretty(OS, 0, Policy);
  419. return DB << OS.str();
  420. }
  421. case TemplateArgument::Pack: {
  422. // FIXME: We're guessing at LangOptions!
  423. SmallString<32> Str;
  424. llvm::raw_svector_ostream OS(Str);
  425. LangOptions LangOpts;
  426. LangOpts.CPlusPlus = true;
  427. PrintingPolicy Policy(LangOpts);
  428. Arg.print(Policy, OS);
  429. return DB << OS.str();
  430. }
  431. }
  432. llvm_unreachable("Invalid TemplateArgument Kind!");
  433. }
  434. const ASTTemplateArgumentListInfo *
  435. ASTTemplateArgumentListInfo::Create(ASTContext &C,
  436. const TemplateArgumentListInfo &List) {
  437. std::size_t size = sizeof(CXXDependentScopeMemberExpr) +
  438. ASTTemplateArgumentListInfo::sizeFor(List.size());
  439. void *Mem = C.Allocate(size, llvm::alignOf<ASTTemplateArgumentListInfo>());
  440. ASTTemplateArgumentListInfo *TAI = new (Mem) ASTTemplateArgumentListInfo();
  441. TAI->initializeFrom(List);
  442. return TAI;
  443. }
  444. void ASTTemplateArgumentListInfo::initializeFrom(
  445. const TemplateArgumentListInfo &Info) {
  446. LAngleLoc = Info.getLAngleLoc();
  447. RAngleLoc = Info.getRAngleLoc();
  448. NumTemplateArgs = Info.size();
  449. TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
  450. for (unsigned i = 0; i != NumTemplateArgs; ++i)
  451. new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
  452. }
  453. void ASTTemplateArgumentListInfo::initializeFrom(
  454. const TemplateArgumentListInfo &Info,
  455. bool &Dependent,
  456. bool &InstantiationDependent,
  457. bool &ContainsUnexpandedParameterPack) {
  458. LAngleLoc = Info.getLAngleLoc();
  459. RAngleLoc = Info.getRAngleLoc();
  460. NumTemplateArgs = Info.size();
  461. TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
  462. for (unsigned i = 0; i != NumTemplateArgs; ++i) {
  463. Dependent = Dependent || Info[i].getArgument().isDependent();
  464. InstantiationDependent = InstantiationDependent ||
  465. Info[i].getArgument().isInstantiationDependent();
  466. ContainsUnexpandedParameterPack
  467. = ContainsUnexpandedParameterPack ||
  468. Info[i].getArgument().containsUnexpandedParameterPack();
  469. new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
  470. }
  471. }
  472. void ASTTemplateArgumentListInfo::copyInto(
  473. TemplateArgumentListInfo &Info) const {
  474. Info.setLAngleLoc(LAngleLoc);
  475. Info.setRAngleLoc(RAngleLoc);
  476. for (unsigned I = 0; I != NumTemplateArgs; ++I)
  477. Info.addArgument(getTemplateArgs()[I]);
  478. }
  479. std::size_t ASTTemplateArgumentListInfo::sizeFor(unsigned NumTemplateArgs) {
  480. return sizeof(ASTTemplateArgumentListInfo) +
  481. sizeof(TemplateArgumentLoc) * NumTemplateArgs;
  482. }
  483. void
  484. ASTTemplateKWAndArgsInfo::initializeFrom(SourceLocation TemplateKWLoc,
  485. const TemplateArgumentListInfo &Info) {
  486. Base::initializeFrom(Info);
  487. setTemplateKeywordLoc(TemplateKWLoc);
  488. }
  489. void
  490. ASTTemplateKWAndArgsInfo
  491. ::initializeFrom(SourceLocation TemplateKWLoc,
  492. const TemplateArgumentListInfo &Info,
  493. bool &Dependent,
  494. bool &InstantiationDependent,
  495. bool &ContainsUnexpandedParameterPack) {
  496. Base::initializeFrom(Info, Dependent, InstantiationDependent,
  497. ContainsUnexpandedParameterPack);
  498. setTemplateKeywordLoc(TemplateKWLoc);
  499. }
  500. void
  501. ASTTemplateKWAndArgsInfo::initializeFrom(SourceLocation TemplateKWLoc) {
  502. // No explicit template arguments, but template keyword loc is valid.
  503. assert(TemplateKWLoc.isValid());
  504. LAngleLoc = SourceLocation();
  505. RAngleLoc = SourceLocation();
  506. NumTemplateArgs = 0;
  507. setTemplateKeywordLoc(TemplateKWLoc);
  508. }
  509. std::size_t
  510. ASTTemplateKWAndArgsInfo::sizeFor(unsigned NumTemplateArgs) {
  511. // Add space for the template keyword location.
  512. return Base::sizeFor(NumTemplateArgs) + sizeof(SourceLocation);
  513. }