diff options
author | Nathan Ridge <zeratul976@hotmail.com> | 2022-08-29 04:19:19 -0400 |
---|---|---|
committer | Tobias Hieta <tobias@hieta.se> | 2022-09-28 08:16:42 +0200 |
commit | e08c165dd67a60635cc131ad7a73dcdb368d5e06 (patch) | |
tree | 20366bc63a00eb1fba2708339aba754980e47de7 /clang/unittests | |
parent | 2eba4dd78e2a47a36a65617f17d5ea156cfb6448 (diff) | |
download | llvm-e08c165dd67a60635cc131ad7a73dcdb368d5e06.zip llvm-e08c165dd67a60635cc131ad7a73dcdb368d5e06.tar.gz llvm-e08c165dd67a60635cc131ad7a73dcdb368d5e06.tar.bz2 |
[clangd] Avoid crash when printing call to string literal operator template
Differential Revision: https://reviews.llvm.org/D132830
(cherry picked from commit 898c421975ed36b99ec2047589384539bd29a40b)
Diffstat (limited to 'clang/unittests')
-rw-r--r-- | clang/unittests/AST/StmtPrinterTest.cpp | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/clang/unittests/AST/StmtPrinterTest.cpp b/clang/unittests/AST/StmtPrinterTest.cpp index f3ea74d..b6f3405 100644 --- a/clang/unittests/AST/StmtPrinterTest.cpp +++ b/clang/unittests/AST/StmtPrinterTest.cpp @@ -31,7 +31,7 @@ using namespace tooling; 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 @@ PrintedStmtCXXMatches(StdVer Standard, StringRef Code, const T &NodeMatch, 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<std::string> Args = { @@ -146,6 +148,35 @@ TEST(StmtPrinter, TestFloatingPointLiteral) { // Should be: with semicolon } +TEST(StmtPrinter, TestStringLiteralOperatorTemplate_Pack) { + ASSERT_TRUE(PrintedStmtCXXMatches(StdVer::CXX11, + R"cpp( + template <char...> 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 <unsigned N> constexpr C(const char (&)[N]) : n(N) {} + unsigned n; + }; + template <C c> 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, |