From 95f804646d79ed3df1162f8ce7e0b0ebaaddf3f1 Mon Sep 17 00:00:00 2001
From: mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed, 6 Dec 2006 22:54:51 +0000
Subject: [PATCH] 	PR c++/29730 	* parser.c
 (cp_parser_init_declarator): Reject initialization of 	functions. 	PR
 c++/29730 	* g++.dg/template/crash64.C: New test. 	*
 g++.dg/parse/crash27.C: Adjust error markers.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119601 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/cp/ChangeLog                        |  6 ++++++
 gcc/cp/parser.c                         | 20 +++++++++++++++++---
 gcc/testsuite/ChangeLog                 |  6 ++++++
 gcc/testsuite/g++.dg/parse/crash27.C    |  3 ---
 gcc/testsuite/g++.dg/template/crash64.C |  6 ++++++
 5 files changed, 35 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/template/crash64.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9e63aca5e8a1..07e6b63aa380 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2006-12-06  Mark Mitchell  <mark@codesourcery.com>
+
+	PR c++/29730
+	* parser.c (cp_parser_init_declarator): Reject initialization of
+	functions.
+
 2006-12-05  Mark Mitchell  <mark@codesourcery.com>
 
 	PR c++/29729
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 82ee8873355a..cdb60f646237 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -11311,9 +11311,23 @@ cp_parser_init_declarator (cp_parser* parser,
   is_non_constant_init = true;
   if (is_initialized)
     {
-      if (function_declarator_p (declarator)
-	  && initialization_kind == CPP_EQ)
-	initializer = cp_parser_pure_specifier (parser);
+      if (function_declarator_p (declarator))
+	{
+	   if (initialization_kind == CPP_EQ)
+	     initializer = cp_parser_pure_specifier (parser);
+	   else
+	     {
+	       /* If the declaration was erroneous, we don't really
+		  know what the user intended, so just silently
+		  consume the initializer.  */
+	       if (decl != error_mark_node)
+		 error ("initializer provided for function");
+	       cp_parser_skip_to_closing_parenthesis (parser,
+						      /*recovering=*/true,
+						      /*or_comma=*/false,
+						      /*consume_paren=*/true);
+	     }
+	}
       else
 	initializer = cp_parser_initializer (parser,
 					     &is_parenthesized_init,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 58837bc40ac7..79f1decd5e39 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2006-12-06  Mark Mitchell  <mark@codesourcery.com>
+
+	PR c++/29730
+	* g++.dg/template/crash64.C: New test.
+	* g++.dg/parse/crash27.C: Adjust error markers.
+
 2006-12-06  Thomas Koenig  <Thomas.Koenig@online.de>
 
 	PR libfortran/30009
diff --git a/gcc/testsuite/g++.dg/parse/crash27.C b/gcc/testsuite/g++.dg/parse/crash27.C
index 1a13f818f11d..069436666d3b 100644
--- a/gcc/testsuite/g++.dg/parse/crash27.C
+++ b/gcc/testsuite/g++.dg/parse/crash27.C
@@ -3,6 +3,3 @@
 void Dispatcher()
 	 (__builtin_offsetof (ArgsType, largeMsgLen))
 	/* { dg-error "function " "function" { target *-*-* } 4 } */
-	/* { dg-error "expected type" "expected 1" { target *-*-* } 4 } */
-	/* { dg-error "expected `,' before" "expected 2" { target *-*-* } 4 } */
-	/* { dg-error "expected `\\\)" "expected 3" { target *-*-* } 4 } */
diff --git a/gcc/testsuite/g++.dg/template/crash64.C b/gcc/testsuite/g++.dg/template/crash64.C
new file mode 100644
index 000000000000..750e3daf19e4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/crash64.C
@@ -0,0 +1,6 @@
+// PR c++/29730
+
+struct A
+{
+  template<int> void foo()(0); // { dg-error "initializer" } 
+};
-- 
GitLab