re PR c++/29570 (ICE with brace-enclosed initializer)
authorJakub Jelinek <jakub@redhat.com>
Tue, 21 Nov 2006 09:43:16 +0000 (10:43 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 21 Nov 2006 09:43:16 +0000 (10:43 +0100)
PR c++/29570
* decl.c (cp_finish_decl): Check for value dependent brace enclosed
scalar initializer.

* g++.dg/template/static29.C: New test.

From-SVN: r119045

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

index 295ed765dc462aae0ede992b8238dbaf8ecf46d4..0cd3ccc8fb6156265eb943aa494df0819127dd2c 100644 (file)
@@ -1,5 +1,9 @@
 2006-11-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/29570
+       * decl.c (cp_finish_decl): Check for value dependent brace enclosed
+       scalar initializer.
+
        PR c++/29734
        * cp-tree.h (WANT_VECTOR): Define.
        (WANT_ARITH): Add WANT_VECTOR.
index e8af0e45679ede67028f65beffbf7626f1ef0d66..d10c3a2f0482801db80a40ef5c41992a1d8f2423 100644 (file)
@@ -5058,7 +5058,14 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
          || !DECL_CLASS_SCOPE_P (decl)
          || !DECL_INTEGRAL_CONSTANT_VAR_P (decl)
          || type_dependent_p
-         || value_dependent_expression_p (init))
+         || value_dependent_expression_p (init)
+            /* Check also if initializer is a value dependent
+               { integral_constant_expression }.  */
+         || (TREE_CODE (init) == CONSTRUCTOR
+             && VEC_length (constructor_elt, CONSTRUCTOR_ELTS (init)) == 1
+             && value_dependent_expression_p
+                  (VEC_index (constructor_elt,
+                              CONSTRUCTOR_ELTS (init), 0)->value)))
        {
          if (init)
            DECL_INITIAL (decl) = init;
index 99e57c7ac70402188ea8ef529aaab1ae722b6c54..d0f9bc073fe676b7b3b68e8fd11f4f3c5cc92aa9 100644 (file)
@@ -1,5 +1,8 @@
 2006-11-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/29570
+       * g++.dg/template/static29.C: New test.
+
        PR c++/29734
        * g++.dg/conversion/simd4.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/template/static29.C b/gcc/testsuite/g++.dg/template/static29.C
new file mode 100644 (file)
index 0000000..a949c0c
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/29570
+
+template<int> struct A { static const int i; };
+
+template<int N> const int A<N>::i = { A<N>::i };