Fix PR c++/62212 (ICE during mangling of array type)
authorPatrick Palka <ppalka@gcc.gnu.org>
Thu, 24 Mar 2016 15:59:53 +0000 (15:59 +0000)
committerPatrick Palka <ppalka@gcc.gnu.org>
Thu, 24 Mar 2016 15:59:53 +0000 (15:59 +0000)
gcc/cp/ChangeLog:

PR c++/62212
* tree.c (build_cplus_array_type): Determine type-dependentess
with uses_template_parms instead of with dependent_type_p.

gcc/testsuite/ChangeLog:

PR c++/62212
* g++.dg/template/mangle2.C: New test.

From-SVN: r234457

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/mangle2.C [new file with mode: 0644]

index b32c72dac83862b1d8ec2f152ed6be243a69b917..dbef1b206f28b734707af1344a528afd906b4731 100644 (file)
@@ -1,3 +1,9 @@
+2016-03-24  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR c++/62212
+       * tree.c (build_cplus_array_type): Determine type-dependentess
+       with uses_template_parms instead of with dependent_type_p.
+
 2016-03-23  Patrick Palka  <ppalka@gcc.gnu.org>
 
        PR c++/70347
index f7849522781c4134087b904adef9acdaab43d63d..5d9de344e7c8a5fa4980ea0c437674395aaea99c 100644 (file)
@@ -824,9 +824,8 @@ build_cplus_array_type (tree elt_type, tree index_type)
   if (elt_type == error_mark_node || index_type == error_mark_node)
     return error_mark_node;
 
-  bool dependent = (processing_template_decl
-                   && (dependent_type_p (elt_type)
-                       || (index_type && dependent_type_p (index_type))));
+  bool dependent = (uses_template_parms (elt_type)
+                   || (index_type && uses_template_parms (index_type)));
 
   if (elt_type != TYPE_MAIN_VARIANT (elt_type))
     /* Start with an array of the TYPE_MAIN_VARIANT.  */
index 99ef9f7a4177cc1f8d009e8822bb3065216772c5..582bb8bcad06dc0ea67c99b1eb5d3a94642e0fef 100644 (file)
@@ -1,3 +1,8 @@
+2016-03-24  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR c++/62212
+       * g++.dg/template/mangle2.C: New test.
+
 2016-03-24  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/70396
diff --git a/gcc/testsuite/g++.dg/template/mangle2.C b/gcc/testsuite/g++.dg/template/mangle2.C
new file mode 100644 (file)
index 0000000..50b0d9f
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/62212
+// { dg-do assemble }
+
+typedef int my_int;
+
+template<typename T>
+struct X {
+    enum {value = 1};
+};
+
+template<typename T>
+void f(const my_int(&)[X<T>::value]);
+
+int main() {
+    const my_int a[1] = {};
+    f<void>(a);
+}
+
+// { dg-final { scan-assembler "_Z1fIvEvRAsr1XIT_E5value_Ki" } }