oToToT created this revision. oToToT added reviewers: rsmith, gbenyei, MaskRay, yaxunl. oToToT added a project: clang. oToToT requested review of this revision. Herald added a subscriber: cfe-commits.
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 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D99407 Files: clang/lib/AST/ItaniumMangle.cpp clang/test/AST/ast-dump-array-json.cpp Index: clang/test/AST/ast-dump-array-json.cpp =================================================================== --- /dev/null +++ clang/test/AST/ast-dump-array-json.cpp @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump=json -ast-dump-filter Test %s | FileCheck %s + +template<unsigned... N> struct A { static const int Test[]; }; +template<unsigned... N> const int A<N...>::Test[] = { N... }; + +// CHECK: "mangledName": "_ZN1A4TestE", +// CHECK: "mangledName": "_ZN1A4TestE", 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/test/AST/ast-dump-array-json.cpp =================================================================== --- /dev/null +++ clang/test/AST/ast-dump-array-json.cpp @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump=json -ast-dump-filter Test %s | FileCheck %s + +template<unsigned... N> struct A { static const int Test[]; }; +template<unsigned... N> const int A<N...>::Test[] = { N... }; + +// CHECK: "mangledName": "_ZN1A4TestE", +// CHECK: "mangledName": "_ZN1A4TestE", 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