[PATCH] D132830: [clangd] Avoid crash when printing call to string literal operator template in hover
Nathan Ridge via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 5 00:26:09 PDT 2022
nridge updated this revision to Diff 457891.
nridge added a comment.
Move test to StmtPrinterTests, add test for literal operator using pack
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D132830/new/
https://reviews.llvm.org/D132830
Files:
clang/lib/AST/StmtPrinter.cpp
clang/unittests/AST/StmtPrinterTest.cpp
Index: clang/unittests/AST/StmtPrinterTest.cpp
===================================================================
--- clang/unittests/AST/StmtPrinterTest.cpp
+++ 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<std::string> Args = {
@@ -146,6 +148,35 @@
// 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,
Index: clang/lib/AST/StmtPrinter.cpp
===================================================================
--- clang/lib/AST/StmtPrinter.cpp
+++ clang/lib/AST/StmtPrinter.cpp
@@ -1993,7 +1993,7 @@
cast<FunctionDecl>(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<TemplateDecl>(DRE->getDecl()))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D132830.457891.patch
Type: text/x-patch
Size: 2541 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220905/0e3bf76a/attachment-0001.bin>
More information about the cfe-commits
mailing list