Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/clang/include/clang/AST/StmtDataCollectors.td b/clang/include/clang/AST/StmtDataCollectors.td
- index 7cb9f16fbce..592d87631a6 100644
- --- a/clang/include/clang/AST/StmtDataCollectors.td
- +++ b/clang/include/clang/AST/StmtDataCollectors.td
- @@ -51,7 +51,7 @@ class CallExpr {
- // Print all template arguments into ArgString
- llvm::raw_string_ostream OS(ArgString);
- for (unsigned i = 0; i < Args->size(); ++i) {
- - Args->get(i).print(Context.getLangOpts(), OS);
- + Args->get(i).print(Context.getLangOpts(), OS, true);
- // Add a padding character so that 'foo<X, XX>()' != 'foo<XX, X>()'.
- OS << '\n';
- }
- diff --git a/clang/include/clang/AST/TemplateBase.h b/clang/include/clang/AST/TemplateBase.h
- index 51fd8ba5103..438254e28a3 100644
- --- a/clang/include/clang/AST/TemplateBase.h
- +++ b/clang/include/clang/AST/TemplateBase.h
- @@ -378,7 +378,8 @@ public:
- TemplateArgument getPackExpansionPattern() const;
- /// Print this template argument to the given output stream.
- - void print(const PrintingPolicy &Policy, raw_ostream &Out) const;
- + void print(const PrintingPolicy &Policy, raw_ostream &Out,
- + bool knownType) const;
- /// Debugging aid that dumps the template argument.
- void dump(raw_ostream &Out) const;
- diff --git a/clang/lib/AST/ASTTypeTraits.cpp b/clang/lib/AST/ASTTypeTraits.cpp
- index ce8a321a691..5af7054504e 100644
- --- a/clang/lib/AST/ASTTypeTraits.cpp
- +++ b/clang/lib/AST/ASTTypeTraits.cpp
- @@ -128,11 +128,15 @@ ASTNodeKind ASTNodeKind::getFromNode(const OMPClause &C) {
- void DynTypedNode::print(llvm::raw_ostream &OS,
- const PrintingPolicy &PP) const {
- - if (const TemplateArgument *TA = get<TemplateArgument>())
- - TA->print(PP, OS);
- - else if (const TemplateArgumentLoc *TAL = get<TemplateArgumentLoc>())
- - TAL->getArgument().print(PP, OS);
- - else if (const TemplateName *TN = get<TemplateName>())
- + if (const TemplateArgument *TA = get<TemplateArgument>()) {
- + bool knownType = true;
- + if (auto *DRE = dyn_cast<DeclRefExpr>(TA->getAsExpr()))
- + if (DRE->hadMultipleCandidates())
- + knownType = false;
- + TA->print(PP, OS, knownType);
- + } else if (const TemplateArgumentLoc *TAL = get<TemplateArgumentLoc>()) {
- + TAL->getArgument().print(PP, OS, true);
- + } else if (const TemplateName *TN = get<TemplateName>())
- TN->print(OS, PP);
- else if (const NestedNameSpecifier *NNS = get<NestedNameSpecifier>())
- NNS->print(OS, PP);
- diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp
- index ca64f8f6cfb..f6f52c01b82 100644
- --- a/clang/lib/AST/DeclPrinter.cpp
- +++ b/clang/lib/AST/DeclPrinter.cpp
- @@ -1077,7 +1077,7 @@ void DeclPrinter::printTemplateArguments(ArrayRef<TemplateArgument> Args) {
- for (size_t I = 0, E = Args.size(); I < E; ++I) {
- if (I)
- Out << ", ";
- - Args[I].print(Policy, Out);
- + Args[I].print(Policy, Out, true);
- }
- Out << ">";
- }
- @@ -1087,7 +1087,11 @@ void DeclPrinter::printTemplateArguments(ArrayRef<TemplateArgumentLoc> Args) {
- for (size_t I = 0, E = Args.size(); I < E; ++I) {
- if (I)
- Out << ", ";
- - Args[I].getArgument().print(Policy, Out);
- + bool knownType = true;
- + if (auto *DRE = dyn_cast<DeclRefExpr>(Args[I].getArgument().getAsExpr()))
- + if (DRE->hadMultipleCandidates())
- + knownType = false;
- + Args[I].getArgument().print(Policy, Out, knownType);
- }
- Out << ">";
- }
- diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp
- index 7857e75f57a..ce2ee08d6b1 100644
- --- a/clang/lib/AST/DeclTemplate.cpp
- +++ b/clang/lib/AST/DeclTemplate.cpp
- @@ -1426,8 +1426,13 @@ void TypeConstraint::print(llvm::raw_ostream &OS, PrintingPolicy Policy) const {
- ConceptName.printName(OS, Policy);
- if (hasExplicitTemplateArgs()) {
- OS << "<";
- - for (auto &ArgLoc : ArgsAsWritten->arguments())
- - ArgLoc.getArgument().print(Policy, OS);
- + for (auto &ArgLoc : ArgsAsWritten->arguments()) {
- + bool knownType = true;
- + if (auto *DRE = dyn_cast<DeclRefExpr>(ArgLoc.getArgument().getAsExpr()))
- + if (DRE->hadMultipleCandidates())
- + knownType = false;
- + ArgLoc.getArgument().print(Policy, OS, knownType);
- + }
- OS << ">";
- }
- }
- diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
- index b664224aa73..429f2ce7fd0 100644
- --- a/clang/lib/AST/Expr.cpp
- +++ b/clang/lib/AST/Expr.cpp
- @@ -771,7 +771,7 @@ std::string PredefinedExpr::ComputeName(IdentKind IK, const Decl *CurrentDecl) {
- StringRef Param = Params->getParam(i)->getName();
- if (Param.empty()) continue;
- TOut << Param << " = ";
- - Args.get(i).print(Policy, TOut);
- + Args.get(i).print(Policy, TOut, true);
- TOut << ", ";
- }
- }
- @@ -787,7 +787,7 @@ std::string PredefinedExpr::ComputeName(IdentKind IK, const Decl *CurrentDecl) {
- StringRef Param = Params->getParam(i)->getName();
- if (Param.empty()) continue;
- TOut << Param << " = ";
- - Args->get(i).print(Policy, TOut);
- + Args->get(i).print(Policy, TOut, true);
- TOut << ", ";
- }
- }
- diff --git a/clang/lib/AST/TemplateBase.cpp b/clang/lib/AST/TemplateBase.cpp
- index 6a3d2b30e46..931aa6215e1 100644
- --- a/clang/lib/AST/TemplateBase.cpp
- +++ b/clang/lib/AST/TemplateBase.cpp
- @@ -50,8 +50,10 @@ using namespace clang;
- /// \param Out the raw_ostream instance to use for printing.
- ///
- /// \param Policy the printing policy for EnumConstantDecl printing.
- -static void printIntegral(const TemplateArgument &TemplArg,
- - raw_ostream &Out, const PrintingPolicy& Policy) {
- +///
- +/// \param knownType the flag to determine printing suffix/prefix type.
- +static void printIntegral(const TemplateArgument &TemplArg, raw_ostream &Out,
- + const PrintingPolicy &Policy, bool knownType) {
- const Type *T = TemplArg.getIntegralType().getTypePtr();
- const llvm::APSInt &Val = TemplArg.getAsIntegral();
- @@ -70,13 +72,52 @@ static void printIntegral(const TemplateArgument &TemplArg,
- if (T->isBooleanType() && !Policy.MSVCFormatting) {
- Out << (Val.getBoolValue() ? "true" : "false");
- + } else if (T->isBooleanType()) {
- + Out << Val;
- } else if (T->isCharType()) {
- const char Ch = Val.getZExtValue();
- Out << ((Ch == '\'') ? "'\\" : "'");
- Out.write_escaped(StringRef(&Ch, 1), /*UseHexEscapes=*/ true);
- Out << "'";
- } else {
- - Out << Val;
- + if (knownType) {
- + if (auto *autoT = T->getAs<AutoType>()) {
- + if (autoT->getAs<DeducedType>()) {
- + knownType = false;
- + }
- + } else if (T->getAs<DeducedType>()) {
- + knownType = false;
- + }
- + }
- + if (!knownType) {
- + if (auto *BT = T->getAs<BuiltinType>()) {
- + switch (BT->getKind()) {
- + case BuiltinType::ULongLong:
- + Out << Val << "ULL";
- + break;
- + case BuiltinType::LongLong:
- + Out << Val << "LL";
- + break;
- + case BuiltinType::ULong:
- + Out << Val << "UL";
- + break;
- + case BuiltinType::Long:
- + Out << Val << "L";
- + break;
- + case BuiltinType::UInt:
- + Out << Val << "U";
- + break;
- + case BuiltinType::Int:
- + Out << Val;
- + break;
- + default:
- + Out << "(" << T->getCanonicalTypeInternal().getAsString(Policy) << ")"
- + << Val;
- + break;
- + }
- + }
- + } else
- + Out << Val;
- }
- }
- @@ -336,8 +377,9 @@ TemplateArgument TemplateArgument::getPackExpansionPattern() const {
- llvm_unreachable("Invalid TemplateArgument Kind!");
- }
- -void TemplateArgument::print(const PrintingPolicy &Policy,
- - raw_ostream &Out) const {
- +void TemplateArgument::print(const PrintingPolicy &Policy, raw_ostream &Out,
- + bool knownType) const {
- +
- switch (getKind()) {
- case Null:
- Out << "(no value)";
- @@ -372,7 +414,7 @@ void TemplateArgument::print(const PrintingPolicy &Policy,
- break;
- case Integral:
- - printIntegral(*this, Out, Policy);
- + printIntegral(*this, Out, Policy, knownType);
- break;
- case Expression:
- @@ -388,7 +430,7 @@ void TemplateArgument::print(const PrintingPolicy &Policy,
- else
- Out << ", ";
- - P.print(Policy, Out);
- + P.print(Policy, Out, knownType);
- }
- Out << ">";
- break;
- @@ -399,7 +441,7 @@ void TemplateArgument::dump(raw_ostream &Out) const {
- LangOptions LO; // FIXME! see also TemplateName::dump().
- LO.CPlusPlus = true;
- LO.Bool = true;
- - print(PrintingPolicy(LO), Out);
- + print(PrintingPolicy(LO), Out, false);
- }
- LLVM_DUMP_METHOD void TemplateArgument::dump() const { dump(llvm::errs()); }
- @@ -494,7 +536,7 @@ const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
- LangOptions LangOpts;
- LangOpts.CPlusPlus = true;
- PrintingPolicy Policy(LangOpts);
- - Arg.print(Policy, OS);
- + Arg.print(Policy, OS, true);
- return DB << OS.str();
- }
- }
- diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp
- index 5e9b2266418..a9537d75468 100644
- --- a/clang/lib/AST/TypePrinter.cpp
- +++ b/clang/lib/AST/TypePrinter.cpp
- @@ -1778,7 +1778,7 @@ static const TemplateArgument &getArgument(const TemplateArgumentLoc &A) {
- static void printArgument(const TemplateArgument &A, const PrintingPolicy &PP,
- llvm::raw_ostream &OS) {
- - A.print(PP, OS);
- + A.print(PP, OS, true);
- }
- static void printArgument(const TemplateArgumentLoc &A,
- @@ -1786,7 +1786,11 @@ static void printArgument(const TemplateArgumentLoc &A,
- const TemplateArgument::ArgKind &Kind = A.getArgument().getKind();
- if (Kind == TemplateArgument::ArgKind::Type)
- return A.getTypeSourceInfo()->getType().print(OS, PP);
- - return A.getArgument().print(PP, OS);
- + bool knownType = true;
- + if (auto *DRE = dyn_cast<DeclRefExpr>(A.getArgument().getAsExpr()))
- + if (DRE->hadMultipleCandidates())
- + knownType = false;
- + return A.getArgument().print(PP, OS, knownType);
- }
- template<typename TA>
- diff --git a/clang/lib/Analysis/PathDiagnostic.cpp b/clang/lib/Analysis/PathDiagnostic.cpp
- index f80b99b9980..4e244b1baf7 100644
- --- a/clang/lib/Analysis/PathDiagnostic.cpp
- +++ b/clang/lib/Analysis/PathDiagnostic.cpp
- @@ -898,7 +898,7 @@ static void describeTemplateParameter(raw_ostream &Out,
- if (TArg.getKind() == TemplateArgument::ArgKind::Pack) {
- describeTemplateParameters(Out, TArg.getPackAsArray(), LO);
- } else {
- - TArg.print(PrintingPolicy(LO), Out);
- + TArg.print(PrintingPolicy(LO), Out, true);
- }
- }
- diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
- index 6558a4f6d8b..64580788f11 100644
- --- a/clang/lib/Sema/SemaDeclCXX.cpp
- +++ b/clang/lib/Sema/SemaDeclCXX.cpp
- @@ -963,7 +963,11 @@ static std::string printTemplateArgs(const PrintingPolicy &PrintingPolicy,
- for (auto &Arg : Args.arguments()) {
- if (!First)
- OS << ", ";
- - Arg.getArgument().print(PrintingPolicy, OS);
- + bool knownType = true;
- + if (auto *DRE = dyn_cast<DeclRefExpr>(Arg.getArgument().getAsExpr()))
- + if (DRE->hadMultipleCandidates())
- + knownType = false;
- + Arg.getArgument().print(PrintingPolicy, OS, knownType);
- First = false;
- }
- return std::string(OS.str());
- diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
- index e1a56385097..8efe4c9741b 100644
- --- a/clang/lib/Sema/SemaTemplate.cpp
- +++ b/clang/lib/Sema/SemaTemplate.cpp
- @@ -10769,7 +10769,7 @@ Sema::getTemplateArgumentBindingsText(const TemplateParameterList *Params,
- }
- Out << " = ";
- - Args[I].print(getPrintingPolicy(), Out);
- + Args[I].print(getPrintingPolicy(), Out, true);
- }
- Out << ']';
- diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
- index 7aa94502fa8..1adddd75901 100644
- --- a/clang/lib/Sema/SemaTemplateDeduction.cpp
- +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
- @@ -4694,8 +4694,14 @@ CheckDeducedPlaceholderConstraints(Sema &S, const AutoType &Type,
- OS << "'" << Concept->getName();
- if (TypeLoc.hasExplicitTemplateArgs()) {
- OS << "<";
- - for (const auto &Arg : Type.getTypeConstraintArguments())
- - Arg.print(S.getPrintingPolicy(), OS);
- + for (const auto &Arg : Type.getTypeConstraintArguments()) {
- + bool knownType = true;
- + if (auto *DRE = dyn_cast<DeclRefExpr>(Arg.getAsExpr())) {
- + if (DRE->hadMultipleCandidates())
- + knownType = false;
- + }
- + Arg.print(S.getPrintingPolicy(), OS, knownType);
- + }
- OS << ">";
- }
- OS << "'";
- diff --git a/clang/test/SemaTemplate/temp_arg_nontype.cpp b/clang/test/SemaTemplate/temp_arg_nontype.cpp
- index dd086dbb25b..56e1905f251 100644
- --- a/clang/test/SemaTemplate/temp_arg_nontype.cpp
- +++ b/clang/test/SemaTemplate/temp_arg_nontype.cpp
- @@ -270,6 +270,22 @@ namespace PR9227 {
- 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'?}}
- void test_char_single_quote() { enable_if_char<'\''>::type i; } // expected-error{{enable_if_char<'\''>'; did you mean 'enable_if_char<'a'>::type'?}}
- void test_char_backslash() { enable_if_char<'\\'>::type i; } // expected-error{{enable_if_char<'\\'>'; did you mean 'enable_if_char<'a'>::type'?}}
- +
- + template <int N> struct enable_if_int {};
- + template <> struct enable_if_int<1> { typedef int type; }; // expected-note{{'enable_if_int<1>::type' declared here}}
- + void test_int() { enable_if_int<2>::type i; } // expected-error{{enable_if_int<2>'; did you mean 'enable_if_int<1>::type'?}}
- +
- + template <unsigned int N> struct enable_if_unsigned_int {};
- + template <> struct enable_if_unsigned_int<1> { typedef int type; }; // expected-note{{'enable_if_unsigned_int<1>::type' declared here}}
- + 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'?}}
- +
- + template <unsigned long long N> struct enable_if_unsigned_long_long {};
- + template <> struct enable_if_unsigned_long_long<1> { typedef int type; }; // expected-note{{'enable_if_unsigned_long_long<1>::type' declared here}}
- + 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'?}}
- +
- + template <long long N> struct enable_if_long_long {};
- + template <> struct enable_if_long_long<1> { typedef int type; }; // expected-note{{'enable_if_long_long<1>::type' declared here}}
- + 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'?}}
- }
- namespace PR10579 {
- diff --git a/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp b/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
- index 7538de33090..c86dda663d8 100644
- --- a/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
- +++ b/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
- @@ -459,3 +459,13 @@ namespace PR46637 {
- X<f> y;
- int n = y.call(); // expected-error {{cannot initialize a variable of type 'int' with an rvalue of type 'void *'}}
- }
- +
- +namespace PR9227 {
- +template <auto N> struct S {};
- +template <> struct S<1> { using type = int; }; // expected-note {{'S<1>::type' declared here}}
- +S<1L>::type t; // expected-error {{no type named 'type' in 'PR9227::S<1L>'; did you mean 'S<1>::type'?}}
- +
- +template <auto N> struct A {};
- +template <> struct A<1> { using type = int; }; // expected-note {{'A<1>::type' declared here}}
- +A<2>::type x; // expected-error {{no type named 'type' in 'PR9227::A<2>'; did you mean 'A<1>::type'?}}
- +} // namespace PR9227
- diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp
- index ae427a02bc2..7504356e716 100644
- --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp
- +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp
- @@ -20,7 +20,11 @@ public:
- llvm::raw_string_ostream Stream(ArgStr);
- const TemplateArgument &Arg = ArgLoc.getArgument();
- - Arg.print(Context->getPrintingPolicy(), Stream);
- + bool knownType = true;
- + if (auto *DRE = dyn_cast<DeclRefExpr>(Arg.getAsExpr()))
- + if (DRE->hadMultipleCandidates())
- + knownType = false;
- + Arg.print(Context->getPrintingPolicy(), Stream, knownType);
- Match(Stream.str(), ArgLoc.getLocation());
- return ExpectedLocationVisitor<TemplateArgumentLocTraverser>::
- TraverseTemplateArgumentLoc(ArgLoc);
Advertisement
Add Comment
Please, Sign In to add comment