diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -1993,7 +1993,7 @@ cast(DRE->getDecl())->getTemplateSpecializationArgs(); assert(Args); - if (Args->size() != 1) { + if (Args->size() != 1 || Args->get(0).getKind() != TemplateArgument::Pack) { const TemplateParameterList *TPL = nullptr; if (!DRE->hadMultipleCandidates()) if (const auto *TD = dyn_cast(DRE->getDecl())) diff --git a/clang/unittests/AST/StmtPrinterTest.cpp b/clang/unittests/AST/StmtPrinterTest.cpp --- a/clang/unittests/AST/StmtPrinterTest.cpp +++ b/clang/unittests/AST/StmtPrinterTest.cpp @@ -31,7 +31,7 @@ namespace { -enum class StdVer { CXX98, CXX11, CXX14, CXX17, CXX2a }; +enum class StdVer { CXX98, CXX11, CXX14, CXX17, CXX20 }; DeclarationMatcher FunctionBodyMatcher(StringRef ContainingFunction) { return functionDecl(hasName(ContainingFunction), @@ -67,7 +67,9 @@ case StdVer::CXX11: StdOpt = "-std=c++11"; break; case StdVer::CXX14: StdOpt = "-std=c++14"; break; case StdVer::CXX17: StdOpt = "-std=c++17"; break; - case StdVer::CXX2a: StdOpt = "-std=c++2a"; break; + case StdVer::CXX20: + StdOpt = "-std=c++20"; + break; } std::vector Args = { @@ -146,6 +148,35 @@ // Should be: with semicolon } +TEST(StmtPrinter, TestStringLiteralOperatorTemplate_Pack) { + ASSERT_TRUE(PrintedStmtCXXMatches(StdVer::CXX11, + R"cpp( + template constexpr double operator""_c() { return 42; } + void A() { + constexpr auto waldo = 42_c; + } +)cpp", + FunctionBodyMatcher("A"), + "constexpr auto waldo = 42_c;\n")); +} + +TEST(StmtPrinter, TestStringLiteralOperatorTemplate_Class) { + ASSERT_TRUE( + PrintedStmtCXXMatches(StdVer::CXX20, + R"cpp( + struct C { + template constexpr C(const char (&)[N]) : n(N) {} + unsigned n; + }; + template constexpr auto operator""_c() { return c.n; } + void A() { + constexpr auto waldo = "abc"_c; + } +)cpp", + FunctionBodyMatcher("A"), + "constexpr auto waldo = operator\"\"_c<{4}>();\n")); +} + TEST(StmtPrinter, TestCXXConversionDeclImplicit) { ASSERT_TRUE(PrintedStmtCXXMatches( StdVer::CXX98,