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_")); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits