From 494fc9d0f43f28049e7334c2f16183a700da3882 Mon Sep 17 00:00:00 2001
From: jsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed, 30 Mar 2005 19:35:49 +0000
Subject: [PATCH] 	PR c/20368 	* c-decl.c (start_function): Check for
 old_decl being 	error_mark_node.

testsuite:
	* gcc.dg/pr20368-1.c, gcc.dg/pr20368-2.c, gcc.dg/pr20368-3.c: New
	tests.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97270 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                    |  6 ++++++
 gcc/c-decl.c                     | 10 ++++++++--
 gcc/testsuite/ChangeLog          |  6 ++++++
 gcc/testsuite/gcc.dg/pr20368-1.c | 12 ++++++++++++
 gcc/testsuite/gcc.dg/pr20368-2.c | 12 ++++++++++++
 gcc/testsuite/gcc.dg/pr20368-3.c | 12 ++++++++++++
 6 files changed, 56 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr20368-1.c
 create mode 100644 gcc/testsuite/gcc.dg/pr20368-2.c
 create mode 100644 gcc/testsuite/gcc.dg/pr20368-3.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0e5dea3c816..285c5fb98b3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-03-30  Joseph S. Myers  <joseph@codesourcery.com>
+
+	PR c/20368
+	* c-decl.c (start_function): Check for old_decl being
+	error_mark_node.
+
 2005-03-30  Ian Lance Taylor  <ian@airs.com>
 
 	* final.c (final): Remove prescan parameter.  Change all callers.
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index cc45e26c2fd..f333dade0b8 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -5691,11 +5691,13 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
 
   /* Optionally warn of old-fashioned def with no previous prototype.  */
   if (warn_strict_prototypes
+      && old_decl != error_mark_node
       && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0
       && C_DECL_ISNT_PROTOTYPE (old_decl))
     warning ("function declaration isn%'t a prototype");
   /* Optionally warn of any global def with no previous prototype.  */
   else if (warn_missing_prototypes
+	   && old_decl != error_mark_node
 	   && TREE_PUBLIC (decl1)
 	   && !MAIN_NAME_P (DECL_NAME (decl1))
 	   && C_DECL_ISNT_PROTOTYPE (old_decl))
@@ -5703,7 +5705,9 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
   /* Optionally warn of any def with no previous prototype
      if the function has already been used.  */
   else if (warn_missing_prototypes
-	   && old_decl != 0 && TREE_USED (old_decl)
+	   && old_decl != 0
+	   && old_decl != error_mark_node
+	   && TREE_USED (old_decl)
 	   && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) == 0)
     warning ("%J%qD was used with no prototype before its definition",
 	     decl1, decl1);
@@ -5716,7 +5720,9 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
   /* Optionally warn of any def with no previous declaration
      if the function has already been used.  */
   else if (warn_missing_declarations
-	   && old_decl != 0 && TREE_USED (old_decl)
+	   && old_decl != 0
+	   && old_decl != error_mark_node
+	   && TREE_USED (old_decl)
 	   && C_DECL_IMPLICIT (old_decl))
     warning ("%J%qD was used with no declaration before its definition",
 	     decl1, decl1);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 991873cb8ab..be4633b2824 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2005-03-30  Joseph S. Myers  <joseph@codesourcery.com>
+
+	PR c/20368
+	* gcc.dg/pr20368-1.c, gcc.dg/pr20368-2.c, gcc.dg/pr20368-3.c: New
+	tests.
+
 2005-03-30  Alan Modra  <amodra@bigpond.net.au>
 
 	* gcc.c-torture/compile/pr20203.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr20368-1.c b/gcc/testsuite/gcc.dg/pr20368-1.c
new file mode 100644
index 00000000000..a88c7f803b7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr20368-1.c
@@ -0,0 +1,12 @@
+/* ICE with -Wstrict-prototypes and typeof an undeclared function.
+   Bug 20368.  */
+/* { dg-do compile } */
+/* { dg-options "-Wstrict-prototypes" } */
+
+extern __typeof (f) g; /* { dg-error "error: 'f' undeclared here \\(not in a function\\)" } */
+
+int
+f (x)
+     float x;
+{
+}
diff --git a/gcc/testsuite/gcc.dg/pr20368-2.c b/gcc/testsuite/gcc.dg/pr20368-2.c
new file mode 100644
index 00000000000..e3c8396233e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr20368-2.c
@@ -0,0 +1,12 @@
+/* ICE with -Wstrict-prototypes and typeof an undeclared function.
+   Bug 20368.  Test with -Wmissing-prototypes.  */
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-prototypes" } */
+
+extern __typeof (f) g; /* { dg-error "error: 'f' undeclared here \\(not in a function\\)" } */
+
+int
+f (x)
+     float x;
+{
+}
diff --git a/gcc/testsuite/gcc.dg/pr20368-3.c b/gcc/testsuite/gcc.dg/pr20368-3.c
new file mode 100644
index 00000000000..32095999676
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr20368-3.c
@@ -0,0 +1,12 @@
+/* ICE with -Wstrict-prototypes and typeof an undeclared function.
+   Bug 20368.  Test with -Wmissing-declarations.  */
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-declarations" } */
+
+extern __typeof (f) g; /* { dg-error "error: 'f' undeclared here \\(not in a function\\)" } */
+
+int
+f (x)
+     float x;
+{
+}
-- 
GitLab