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

Reply via email to