[clang] a89fb29 - [clang][ItaniumMangle] Check SizeExpr for DependentSizedArrayType
via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 2 00:33:56 PDT 2021
Author: oToToT
Date: 2021-04-02T15:31:20+08:00
New Revision: a89fb29398dc0ce48dfe6f45f99d6ae7df4c6b46
URL: https://github.com/llvm/llvm-project/commit/a89fb29398dc0ce48dfe6f45f99d6ae7df4c6b46
DIFF: https://github.com/llvm/llvm-project/commit/a89fb29398dc0ce48dfe6f45f99d6ae7df4c6b46.diff
LOG: [clang][ItaniumMangle] Check SizeExpr for DependentSizedArrayType
(PR49478)
As ArrayType::ArrayType mentioned in clang/lib/AST/Type.cpp, a
DependentSizedArrayType might not have size expression because it it
used as the type of a dependent array of unknown bound with a dependent
braced initializer.
Thus, I add a check when mangling array of that type.
This should fix https://bugs.llvm.org/show_bug.cgi?id=49478
Reviewed By: Richard Smith - zygoloid
Differential Revision: https://reviews.llvm.org/D99407
Added:
Modified:
clang/lib/AST/ItaniumMangle.cpp
clang/unittests/AST/DeclTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 3e6e29207f08c..6415fcab52c1c 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -3204,7 +3204,11 @@ void CXXNameMangler::mangleType(const VariableArrayType *T) {
}
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());
}
diff --git a/clang/unittests/AST/DeclTest.cpp b/clang/unittests/AST/DeclTest.cpp
index 08b1fbb5eb8ae..55d0a3fc065d5 100644
--- a/clang/unittests/AST/DeclTest.cpp
+++ b/clang/unittests/AST/DeclTest.cpp
@@ -104,3 +104,37 @@ TEST(Decl, AsmLabelAttr) {
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_"));
+}
More information about the cfe-commits
mailing list