Reikriam

gsoc-patch

Sep 21st, 2020
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.89 KB | None | 0 0
  1. diff --git a/clang/include/clang/AST/StmtDataCollectors.td b/clang/include/clang/AST/StmtDataCollectors.td
  2. index 7cb9f16fbce..592d87631a6 100644
  3. --- a/clang/include/clang/AST/StmtDataCollectors.td
  4. +++ b/clang/include/clang/AST/StmtDataCollectors.td
  5. @@ -51,7 +51,7 @@ class CallExpr {
  6. // Print all template arguments into ArgString
  7. llvm::raw_string_ostream OS(ArgString);
  8. for (unsigned i = 0; i < Args->size(); ++i) {
  9. - Args->get(i).print(Context.getLangOpts(), OS);
  10. + Args->get(i).print(Context.getLangOpts(), OS, true);
  11. // Add a padding character so that 'foo<X, XX>()' != 'foo<XX, X>()'.
  12. OS << '\n';
  13. }
  14. diff --git a/clang/include/clang/AST/TemplateBase.h b/clang/include/clang/AST/TemplateBase.h
  15. index 51fd8ba5103..438254e28a3 100644
  16. --- a/clang/include/clang/AST/TemplateBase.h
  17. +++ b/clang/include/clang/AST/TemplateBase.h
  18. @@ -378,7 +378,8 @@ public:
  19. TemplateArgument getPackExpansionPattern() const;
  20.  
  21. /// Print this template argument to the given output stream.
  22. - void print(const PrintingPolicy &Policy, raw_ostream &Out) const;
  23. + void print(const PrintingPolicy &Policy, raw_ostream &Out,
  24. + bool knownType) const;
  25.  
  26. /// Debugging aid that dumps the template argument.
  27. void dump(raw_ostream &Out) const;
  28. diff --git a/clang/lib/AST/ASTTypeTraits.cpp b/clang/lib/AST/ASTTypeTraits.cpp
  29. index ce8a321a691..5af7054504e 100644
  30. --- a/clang/lib/AST/ASTTypeTraits.cpp
  31. +++ b/clang/lib/AST/ASTTypeTraits.cpp
  32. @@ -128,11 +128,15 @@ ASTNodeKind ASTNodeKind::getFromNode(const OMPClause &C) {
  33.  
  34. void DynTypedNode::print(llvm::raw_ostream &OS,
  35. const PrintingPolicy &PP) const {
  36. - if (const TemplateArgument *TA = get<TemplateArgument>())
  37. - TA->print(PP, OS);
  38. - else if (const TemplateArgumentLoc *TAL = get<TemplateArgumentLoc>())
  39. - TAL->getArgument().print(PP, OS);
  40. - else if (const TemplateName *TN = get<TemplateName>())
  41. + if (const TemplateArgument *TA = get<TemplateArgument>()) {
  42. + bool knownType = true;
  43. + if (auto *DRE = dyn_cast<DeclRefExpr>(TA->getAsExpr()))
  44. + if (DRE->hadMultipleCandidates())
  45. + knownType = false;
  46. + TA->print(PP, OS, knownType);
  47. + } else if (const TemplateArgumentLoc *TAL = get<TemplateArgumentLoc>()) {
  48. + TAL->getArgument().print(PP, OS, true);
  49. + } else if (const TemplateName *TN = get<TemplateName>())
  50. TN->print(OS, PP);
  51. else if (const NestedNameSpecifier *NNS = get<NestedNameSpecifier>())
  52. NNS->print(OS, PP);
  53. diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp
  54. index ca64f8f6cfb..f6f52c01b82 100644
  55. --- a/clang/lib/AST/DeclPrinter.cpp
  56. +++ b/clang/lib/AST/DeclPrinter.cpp
  57. @@ -1077,7 +1077,7 @@ void DeclPrinter::printTemplateArguments(ArrayRef<TemplateArgument> Args) {
  58. for (size_t I = 0, E = Args.size(); I < E; ++I) {
  59. if (I)
  60. Out << ", ";
  61. - Args[I].print(Policy, Out);
  62. + Args[I].print(Policy, Out, true);
  63. }
  64. Out << ">";
  65. }
  66. @@ -1087,7 +1087,11 @@ void DeclPrinter::printTemplateArguments(ArrayRef<TemplateArgumentLoc> Args) {
  67. for (size_t I = 0, E = Args.size(); I < E; ++I) {
  68. if (I)
  69. Out << ", ";
  70. - Args[I].getArgument().print(Policy, Out);
  71. + bool knownType = true;
  72. + if (auto *DRE = dyn_cast<DeclRefExpr>(Args[I].getArgument().getAsExpr()))
  73. + if (DRE->hadMultipleCandidates())
  74. + knownType = false;
  75. + Args[I].getArgument().print(Policy, Out, knownType);
  76. }
  77. Out << ">";
  78. }
  79. diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp
  80. index 7857e75f57a..ce2ee08d6b1 100644
  81. --- a/clang/lib/AST/DeclTemplate.cpp
  82. +++ b/clang/lib/AST/DeclTemplate.cpp
  83. @@ -1426,8 +1426,13 @@ void TypeConstraint::print(llvm::raw_ostream &OS, PrintingPolicy Policy) const {
  84. ConceptName.printName(OS, Policy);
  85. if (hasExplicitTemplateArgs()) {
  86. OS << "<";
  87. - for (auto &ArgLoc : ArgsAsWritten->arguments())
  88. - ArgLoc.getArgument().print(Policy, OS);
  89. + for (auto &ArgLoc : ArgsAsWritten->arguments()) {
  90. + bool knownType = true;
  91. + if (auto *DRE = dyn_cast<DeclRefExpr>(ArgLoc.getArgument().getAsExpr()))
  92. + if (DRE->hadMultipleCandidates())
  93. + knownType = false;
  94. + ArgLoc.getArgument().print(Policy, OS, knownType);
  95. + }
  96. OS << ">";
  97. }
  98. }
  99. diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
  100. index b664224aa73..429f2ce7fd0 100644
  101. --- a/clang/lib/AST/Expr.cpp
  102. +++ b/clang/lib/AST/Expr.cpp
  103. @@ -771,7 +771,7 @@ std::string PredefinedExpr::ComputeName(IdentKind IK, const Decl *CurrentDecl) {
  104. StringRef Param = Params->getParam(i)->getName();
  105. if (Param.empty()) continue;
  106. TOut << Param << " = ";
  107. - Args.get(i).print(Policy, TOut);
  108. + Args.get(i).print(Policy, TOut, true);
  109. TOut << ", ";
  110. }
  111. }
  112. @@ -787,7 +787,7 @@ std::string PredefinedExpr::ComputeName(IdentKind IK, const Decl *CurrentDecl) {
  113. StringRef Param = Params->getParam(i)->getName();
  114. if (Param.empty()) continue;
  115. TOut << Param << " = ";
  116. - Args->get(i).print(Policy, TOut);
  117. + Args->get(i).print(Policy, TOut, true);
  118. TOut << ", ";
  119. }
  120. }
  121. diff --git a/clang/lib/AST/TemplateBase.cpp b/clang/lib/AST/TemplateBase.cpp
  122. index 6a3d2b30e46..931aa6215e1 100644
  123. --- a/clang/lib/AST/TemplateBase.cpp
  124. +++ b/clang/lib/AST/TemplateBase.cpp
  125. @@ -50,8 +50,10 @@ using namespace clang;
  126. /// \param Out the raw_ostream instance to use for printing.
  127. ///
  128. /// \param Policy the printing policy for EnumConstantDecl printing.
  129. -static void printIntegral(const TemplateArgument &TemplArg,
  130. - raw_ostream &Out, const PrintingPolicy& Policy) {
  131. +///
  132. +/// \param knownType the flag to determine printing suffix/prefix type.
  133. +static void printIntegral(const TemplateArgument &TemplArg, raw_ostream &Out,
  134. + const PrintingPolicy &Policy, bool knownType) {
  135. const Type *T = TemplArg.getIntegralType().getTypePtr();
  136. const llvm::APSInt &Val = TemplArg.getAsIntegral();
  137.  
  138. @@ -70,13 +72,52 @@ static void printIntegral(const TemplateArgument &TemplArg,
  139.  
  140. if (T->isBooleanType() && !Policy.MSVCFormatting) {
  141. Out << (Val.getBoolValue() ? "true" : "false");
  142. + } else if (T->isBooleanType()) {
  143. + Out << Val;
  144. } else if (T->isCharType()) {
  145. const char Ch = Val.getZExtValue();
  146. Out << ((Ch == '\'') ? "'\\" : "'");
  147. Out.write_escaped(StringRef(&Ch, 1), /*UseHexEscapes=*/ true);
  148. Out << "'";
  149. } else {
  150. - Out << Val;
  151. + if (knownType) {
  152. + if (auto *autoT = T->getAs<AutoType>()) {
  153. + if (autoT->getAs<DeducedType>()) {
  154. + knownType = false;
  155. + }
  156. + } else if (T->getAs<DeducedType>()) {
  157. + knownType = false;
  158. + }
  159. + }
  160. + if (!knownType) {
  161. + if (auto *BT = T->getAs<BuiltinType>()) {
  162. + switch (BT->getKind()) {
  163. + case BuiltinType::ULongLong:
  164. + Out << Val << "ULL";
  165. + break;
  166. + case BuiltinType::LongLong:
  167. + Out << Val << "LL";
  168. + break;
  169. + case BuiltinType::ULong:
  170. + Out << Val << "UL";
  171. + break;
  172. + case BuiltinType::Long:
  173. + Out << Val << "L";
  174. + break;
  175. + case BuiltinType::UInt:
  176. + Out << Val << "U";
  177. + break;
  178. + case BuiltinType::Int:
  179. + Out << Val;
  180. + break;
  181. + default:
  182. + Out << "(" << T->getCanonicalTypeInternal().getAsString(Policy) << ")"
  183. + << Val;
  184. + break;
  185. + }
  186. + }
  187. + } else
  188. + Out << Val;
  189. }
  190. }
  191.  
  192. @@ -336,8 +377,9 @@ TemplateArgument TemplateArgument::getPackExpansionPattern() const {
  193. llvm_unreachable("Invalid TemplateArgument Kind!");
  194. }
  195.  
  196. -void TemplateArgument::print(const PrintingPolicy &Policy,
  197. - raw_ostream &Out) const {
  198. +void TemplateArgument::print(const PrintingPolicy &Policy, raw_ostream &Out,
  199. + bool knownType) const {
  200. +
  201. switch (getKind()) {
  202. case Null:
  203. Out << "(no value)";
  204. @@ -372,7 +414,7 @@ void TemplateArgument::print(const PrintingPolicy &Policy,
  205. break;
  206.  
  207. case Integral:
  208. - printIntegral(*this, Out, Policy);
  209. + printIntegral(*this, Out, Policy, knownType);
  210. break;
  211.  
  212. case Expression:
  213. @@ -388,7 +430,7 @@ void TemplateArgument::print(const PrintingPolicy &Policy,
  214. else
  215. Out << ", ";
  216.  
  217. - P.print(Policy, Out);
  218. + P.print(Policy, Out, knownType);
  219. }
  220. Out << ">";
  221. break;
  222. @@ -399,7 +441,7 @@ void TemplateArgument::dump(raw_ostream &Out) const {
  223. LangOptions LO; // FIXME! see also TemplateName::dump().
  224. LO.CPlusPlus = true;
  225. LO.Bool = true;
  226. - print(PrintingPolicy(LO), Out);
  227. + print(PrintingPolicy(LO), Out, false);
  228. }
  229.  
  230. LLVM_DUMP_METHOD void TemplateArgument::dump() const { dump(llvm::errs()); }
  231. @@ -494,7 +536,7 @@ const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
  232. LangOptions LangOpts;
  233. LangOpts.CPlusPlus = true;
  234. PrintingPolicy Policy(LangOpts);
  235. - Arg.print(Policy, OS);
  236. + Arg.print(Policy, OS, true);
  237. return DB << OS.str();
  238. }
  239. }
  240. diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp
  241. index 5e9b2266418..a9537d75468 100644
  242. --- a/clang/lib/AST/TypePrinter.cpp
  243. +++ b/clang/lib/AST/TypePrinter.cpp
  244. @@ -1778,7 +1778,7 @@ static const TemplateArgument &getArgument(const TemplateArgumentLoc &A) {
  245.  
  246. static void printArgument(const TemplateArgument &A, const PrintingPolicy &PP,
  247. llvm::raw_ostream &OS) {
  248. - A.print(PP, OS);
  249. + A.print(PP, OS, true);
  250. }
  251.  
  252. static void printArgument(const TemplateArgumentLoc &A,
  253. @@ -1786,7 +1786,11 @@ static void printArgument(const TemplateArgumentLoc &A,
  254. const TemplateArgument::ArgKind &Kind = A.getArgument().getKind();
  255. if (Kind == TemplateArgument::ArgKind::Type)
  256. return A.getTypeSourceInfo()->getType().print(OS, PP);
  257. - return A.getArgument().print(PP, OS);
  258. + bool knownType = true;
  259. + if (auto *DRE = dyn_cast<DeclRefExpr>(A.getArgument().getAsExpr()))
  260. + if (DRE->hadMultipleCandidates())
  261. + knownType = false;
  262. + return A.getArgument().print(PP, OS, knownType);
  263. }
  264.  
  265. template<typename TA>
  266. diff --git a/clang/lib/Analysis/PathDiagnostic.cpp b/clang/lib/Analysis/PathDiagnostic.cpp
  267. index f80b99b9980..4e244b1baf7 100644
  268. --- a/clang/lib/Analysis/PathDiagnostic.cpp
  269. +++ b/clang/lib/Analysis/PathDiagnostic.cpp
  270. @@ -898,7 +898,7 @@ static void describeTemplateParameter(raw_ostream &Out,
  271. if (TArg.getKind() == TemplateArgument::ArgKind::Pack) {
  272. describeTemplateParameters(Out, TArg.getPackAsArray(), LO);
  273. } else {
  274. - TArg.print(PrintingPolicy(LO), Out);
  275. + TArg.print(PrintingPolicy(LO), Out, true);
  276. }
  277. }
  278.  
  279. diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
  280. index 6558a4f6d8b..64580788f11 100644
  281. --- a/clang/lib/Sema/SemaDeclCXX.cpp
  282. +++ b/clang/lib/Sema/SemaDeclCXX.cpp
  283. @@ -963,7 +963,11 @@ static std::string printTemplateArgs(const PrintingPolicy &PrintingPolicy,
  284. for (auto &Arg : Args.arguments()) {
  285. if (!First)
  286. OS << ", ";
  287. - Arg.getArgument().print(PrintingPolicy, OS);
  288. + bool knownType = true;
  289. + if (auto *DRE = dyn_cast<DeclRefExpr>(Arg.getArgument().getAsExpr()))
  290. + if (DRE->hadMultipleCandidates())
  291. + knownType = false;
  292. + Arg.getArgument().print(PrintingPolicy, OS, knownType);
  293. First = false;
  294. }
  295. return std::string(OS.str());
  296. diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
  297. index e1a56385097..8efe4c9741b 100644
  298. --- a/clang/lib/Sema/SemaTemplate.cpp
  299. +++ b/clang/lib/Sema/SemaTemplate.cpp
  300. @@ -10769,7 +10769,7 @@ Sema::getTemplateArgumentBindingsText(const TemplateParameterList *Params,
  301. }
  302.  
  303. Out << " = ";
  304. - Args[I].print(getPrintingPolicy(), Out);
  305. + Args[I].print(getPrintingPolicy(), Out, true);
  306. }
  307.  
  308. Out << ']';
  309. diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
  310. index 7aa94502fa8..1adddd75901 100644
  311. --- a/clang/lib/Sema/SemaTemplateDeduction.cpp
  312. +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
  313. @@ -4694,8 +4694,14 @@ CheckDeducedPlaceholderConstraints(Sema &S, const AutoType &Type,
  314. OS << "'" << Concept->getName();
  315. if (TypeLoc.hasExplicitTemplateArgs()) {
  316. OS << "<";
  317. - for (const auto &Arg : Type.getTypeConstraintArguments())
  318. - Arg.print(S.getPrintingPolicy(), OS);
  319. + for (const auto &Arg : Type.getTypeConstraintArguments()) {
  320. + bool knownType = true;
  321. + if (auto *DRE = dyn_cast<DeclRefExpr>(Arg.getAsExpr())) {
  322. + if (DRE->hadMultipleCandidates())
  323. + knownType = false;
  324. + }
  325. + Arg.print(S.getPrintingPolicy(), OS, knownType);
  326. + }
  327. OS << ">";
  328. }
  329. OS << "'";
  330. diff --git a/clang/test/SemaTemplate/temp_arg_nontype.cpp b/clang/test/SemaTemplate/temp_arg_nontype.cpp
  331. index dd086dbb25b..56e1905f251 100644
  332. --- a/clang/test/SemaTemplate/temp_arg_nontype.cpp
  333. +++ b/clang/test/SemaTemplate/temp_arg_nontype.cpp
  334. @@ -270,6 +270,22 @@ namespace PR9227 {
  335. void test_char_possibly_negative() { enable_if_char<'\x02'>::type i; } // expected-error{{enable_if_char<'\x02'>'; did you mean 'enable_if_char<'a'>::type'?}}
  336. void test_char_single_quote() { enable_if_char<'\''>::type i; } // expected-error{{enable_if_char<'\''>'; did you mean 'enable_if_char<'a'>::type'?}}
  337. void test_char_backslash() { enable_if_char<'\\'>::type i; } // expected-error{{enable_if_char<'\\'>'; did you mean 'enable_if_char<'a'>::type'?}}
  338. +
  339. + template <int N> struct enable_if_int {};
  340. + template <> struct enable_if_int<1> { typedef int type; }; // expected-note{{'enable_if_int<1>::type' declared here}}
  341. + void test_int() { enable_if_int<2>::type i; } // expected-error{{enable_if_int<2>'; did you mean 'enable_if_int<1>::type'?}}
  342. +
  343. + template <unsigned int N> struct enable_if_unsigned_int {};
  344. + template <> struct enable_if_unsigned_int<1> { typedef int type; }; // expected-note{{'enable_if_unsigned_int<1>::type' declared here}}
  345. + void test_unsigned_int() { enable_if_unsigned_int<2>::type i; } // expected-error{{enable_if_unsigned_int<2>'; did you mean 'enable_if_unsigned_int<1>::type'?}}
  346. +
  347. + template <unsigned long long N> struct enable_if_unsigned_long_long {};
  348. + template <> struct enable_if_unsigned_long_long<1> { typedef int type; }; // expected-note{{'enable_if_unsigned_long_long<1>::type' declared here}}
  349. + void test_unsigned_long_long() { enable_if_unsigned_long_long<2>::type i; } // expected-error{{enable_if_unsigned_long_long<2>'; did you mean 'enable_if_unsigned_long_long<1>::type'?}}
  350. +
  351. + template <long long N> struct enable_if_long_long {};
  352. + template <> struct enable_if_long_long<1> { typedef int type; }; // expected-note{{'enable_if_long_long<1>::type' declared here}}
  353. + void test_long_long() { enable_if_long_long<2>::type i; } // expected-error{{enable_if_long_long<2>'; did you mean 'enable_if_long_long<1>::type'?}}
  354. }
  355.  
  356. namespace PR10579 {
  357. diff --git a/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp b/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
  358. index 7538de33090..c86dda663d8 100644
  359. --- a/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
  360. +++ b/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
  361. @@ -459,3 +459,13 @@ namespace PR46637 {
  362. X<f> y;
  363. int n = y.call(); // expected-error {{cannot initialize a variable of type 'int' with an rvalue of type 'void *'}}
  364. }
  365. +
  366. +namespace PR9227 {
  367. +template <auto N> struct S {};
  368. +template <> struct S<1> { using type = int; }; // expected-note {{'S<1>::type' declared here}}
  369. +S<1L>::type t; // expected-error {{no type named 'type' in 'PR9227::S<1L>'; did you mean 'S<1>::type'?}}
  370. +
  371. +template <auto N> struct A {};
  372. +template <> struct A<1> { using type = int; }; // expected-note {{'A<1>::type' declared here}}
  373. +A<2>::type x; // expected-error {{no type named 'type' in 'PR9227::A<2>'; did you mean 'A<1>::type'?}}
  374. +} // namespace PR9227
  375. diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp
  376. index ae427a02bc2..7504356e716 100644
  377. --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp
  378. +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp
  379. @@ -20,7 +20,11 @@ public:
  380. llvm::raw_string_ostream Stream(ArgStr);
  381. const TemplateArgument &Arg = ArgLoc.getArgument();
  382.  
  383. - Arg.print(Context->getPrintingPolicy(), Stream);
  384. + bool knownType = true;
  385. + if (auto *DRE = dyn_cast<DeclRefExpr>(Arg.getAsExpr()))
  386. + if (DRE->hadMultipleCandidates())
  387. + knownType = false;
  388. + Arg.print(Context->getPrintingPolicy(), Stream, knownType);
  389. Match(Stream.str(), ArgLoc.getLocation());
  390. return ExpectedLocationVisitor<TemplateArgumentLocTraverser>::
  391. TraverseTemplateArgumentLoc(ArgLoc);
Advertisement
Add Comment
Please, Sign In to add comment