aboutsummaryrefslogtreecommitdiff
path: root/clang/unittests
diff options
context:
space:
mode:
authorNathan Ridge <zeratul976@hotmail.com>2022-08-29 04:19:19 -0400
committerTobias Hieta <tobias@hieta.se>2022-09-28 08:16:42 +0200
commite08c165dd67a60635cc131ad7a73dcdb368d5e06 (patch)
tree20366bc63a00eb1fba2708339aba754980e47de7 /clang/unittests
parent2eba4dd78e2a47a36a65617f17d5ea156cfb6448 (diff)
downloadllvm-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.cpp35
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,