[PATCH] D99407: [clang][ItaniumMangle] Check SizeExpr for DependentSizedArrayType (PR49478)
Tommy Chiang via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 1 16:18:33 PDT 2021
oToToT updated this revision to Diff 334848.
oToToT added a comment.
Remove redundant trailing spaces.
Sorry for not checking this at the first time I submit.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99407/new/
https://reviews.llvm.org/D99407
Files:
clang/lib/AST/ItaniumMangle.cpp
clang/unittests/AST/DeclTest.cpp
Index: clang/unittests/AST/DeclTest.cpp
===================================================================
--- clang/unittests/AST/DeclTest.cpp
+++ clang/unittests/AST/DeclTest.cpp
@@ -104,3 +104,37 @@
ASSERT_TRUE(0 == MangleF.compare("\x01" "foo"));
ASSERT_TRUE(0 == MangleG.compare("goo"));
}
+
+TEST(Decl, MangleDependentSizedArray) {
+ StringRef Code = R"(
+ template <int ...N>
+ int A[] = {N...};
+
+ template <typename T, int N>
+ struct S {
+ T B[N];
+ };
+ )";
+ auto AST =
+ tooling::buildASTFromCodeWithArgs(Code, {"-target", "i386-apple-darwin"});
+ ASTContext &Ctx = AST->getASTContext();
+ assert(Ctx.getTargetInfo().getDataLayout().getGlobalPrefix() &&
+ "Expected target to have a global prefix");
+ DiagnosticsEngine &Diags = AST->getDiagnostics();
+
+ const auto *DeclA =
+ selectFirst<VarDecl>("A", match(varDecl().bind("A"), Ctx));
+ const auto *DeclB =
+ selectFirst<FieldDecl>("B", match(fieldDecl().bind("B"), Ctx));
+
+ std::string MangleA, MangleB;
+ llvm::raw_string_ostream OS_A(MangleA), OS_B(MangleB);
+ std::unique_ptr<ItaniumMangleContext> MC(
+ ItaniumMangleContext::create(Ctx, Diags));
+
+ MC->mangleTypeName(DeclA->getType(), OS_A);
+ MC->mangleTypeName(DeclB->getType(), OS_B);
+
+ ASSERT_TRUE(0 == MangleA.compare("_ZTSA_i"));
+ ASSERT_TRUE(0 == MangleB.compare("_ZTSAT0__T_"));
+}
Index: clang/lib/AST/ItaniumMangle.cpp
===================================================================
--- clang/lib/AST/ItaniumMangle.cpp
+++ clang/lib/AST/ItaniumMangle.cpp
@@ -3204,7 +3204,11 @@
}
void CXXNameMangler::mangleType(const DependentSizedArrayType *T) {
Out << 'A';
- mangleExpression(T->getSizeExpr());
+ // A DependentSizedArrayType might not have size expression as below
+ //
+ // template<int ...N> int arr[] = {N...};
+ if (T->getSizeExpr())
+ mangleExpression(T->getSizeExpr());
Out << '_';
mangleType(T->getElementType());
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D99407.334848.patch
Type: text/x-patch
Size: 1961 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210401/0a2dc7da/attachment.bin>
More information about the cfe-commits
mailing list