diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 295ed765dc462aae0ede992b8238dbaf8ecf46d4..0cd3ccc8fb6156265eb943aa494df0819127dd2c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index e8af0e45679ede67028f65beffbf7626f1ef0d66..d10c3a2f0482801db80a40ef5c41992a1d8f2423 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 99e57c7ac70402188ea8ef529aaab1ae722b6c54..d0f9bc073fe676b7b3b68e8fd11f4f3c5cc92aa9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000000000000000000000000000000000000..a949c0cd85eadc1e7744862bb417f58bc38c2a2c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/static29.C
@@ -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 };