This revision was automatically updated to reflect the committed changes. Closed by commit rGa89fb29398dc: [clang][ItaniumMangle] Check SizeExpr for DependentSizedArrayType (authored by oToToT).
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()); }
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()); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits