diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0d0c6a59b89ee3464b98f50290d77808357c84b5..7f118ab241ff998380eb6ed93fcbfe9c4d222c4c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2006-06-05  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+	PR c++/27804
+	* init.c (constant_value_1): Return decl instead of error_mark_node
+	for invalid initializers.
+
 2006-06-01  Andrew Pinski  <pinskia@physics.uc.edu>
 
 	PR c++/27592
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 99d5d99080502d736f73e6505d7b3af4b0d5dc27..8a338faa5496f7c2492389330aa1cc83e7616d13 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -1483,7 +1483,7 @@ constant_value_1 (tree decl, bool integral_p)
 	  init = DECL_INITIAL (decl);
 	}
       if (init == error_mark_node)
-	return error_mark_node;
+	return decl;
       if (!init
 	  || !TREE_TYPE (init)
 	  || (integral_p
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9b484a9a363ffa6279a8bd0b050c0f2e4bb6f135..46095299fff2c0049393515d5116ba3b24a2e9f8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2006-06-05  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+	PR c++/27804
+	* g++.dg/init/const4.C: New test.
+	* g++.dg/init/member1.C: Add error-marker.
+	* g++.dg/other/fold1.C: Adjust error-marker.
+
 2006-06-04  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
 	PR c++/27601
diff --git a/gcc/testsuite/g++.dg/init/const4.C b/gcc/testsuite/g++.dg/init/const4.C
new file mode 100644
index 0000000000000000000000000000000000000000..b99726b861667402b6672dbed7003da64782e942
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/const4.C
@@ -0,0 +1,8 @@
+// PR c++/27804
+// { dg-do compile }
+
+bool foo()
+{
+  const int i = X;  // { dg-error "not declared" }
+  return i > 0;
+}
diff --git a/gcc/testsuite/g++.dg/init/member1.C b/gcc/testsuite/g++.dg/init/member1.C
index aededf23e7b72043720c50a5c6e307538b6d3dda..e2af0809c713cf3a8ab623e0539a5cf8734f22cb 100644
--- a/gcc/testsuite/g++.dg/init/member1.C
+++ b/gcc/testsuite/g++.dg/init/member1.C
@@ -11,7 +11,7 @@ template<int> struct B {};
 template<typename T> struct C
 {
   static const int i = A<T>::i;  // { dg-error "incomplete" }
-  static const int j = i;
+  static const int j = i;  // { dg-error "non-constant expression" }
   B<j> b;  // { dg-error "not a valid template arg" }
 };
 
diff --git a/gcc/testsuite/g++.dg/other/fold1.C b/gcc/testsuite/g++.dg/other/fold1.C
index f1f0dd9b99b5ebeac95531e5c4e469de2688f7ef..b085a84f0dda9529163f6162ae586dfcc3ca5caf 100644
--- a/gcc/testsuite/g++.dg/other/fold1.C
+++ b/gcc/testsuite/g++.dg/other/fold1.C
@@ -4,5 +4,5 @@
 struct A
 {
     static const int i = i;  // { dg-error "not declared" }
-    int x[i];                // { dg-error "variable-size array" }
+    int x[i];                // { dg-error "integral constant-expression" }
 };