diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e34fb2270a9324eff06a6c6254f78a6377ba398e..48aab06d2453602102e1fd8e5d9c95328f751c76 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2008-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	PR c++/34600
+	* decl.c (grokdeclarator): In case of extern and initializer, return
+	error_mark_node after the error.
+
 2008-08-13  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
 	PR 30551
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 3cd251128f1f2c2c1a26529bffd2c1a7f879a623..b0531604d02d86870bc3f0029bed94f0c4d8cbaa 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -9270,7 +9270,10 @@ grokdeclarator (const cp_declarator *declarator,
 	      warning (0, "%qs initialized and declared %<extern%>", name);
 	  }
 	else
-	  error ("%qs has both %<extern%> and initializer", name);
+	  {
+	    error ("%qs has both %<extern%> and initializer", name);
+	    return error_mark_node;
+	  }
       }
 
     /* Record `register' declaration for warnings on &
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bdbc3542e9ea079fc24c568d0c309efc552c784c..5355b4df23acdd40bdf06e2c428d54856d02879b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	PR c++/34600
+	* g++.dg/parse/crash43.C: New.
+
 2008-08-14  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
         PR c/28152
diff --git a/gcc/testsuite/g++.dg/parse/crash43.C b/gcc/testsuite/g++.dg/parse/crash43.C
new file mode 100644
index 0000000000000000000000000000000000000000..84fe8c5186ca3e56ee582bf243d73eaeabf69d0e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash43.C
@@ -0,0 +1,9 @@
+// PR c++/34600
+
+namespace N
+{
+  void foo()
+  {
+    extern int i = 0; // { dg-error "error: 'i' has both 'extern' and initializer" }
+  }
+}