This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix C ICE on invalid (PR c/18946)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: joseph at codesourcery dot com
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 20 Jan 2005 09:20:00 -0500
- Subject: [PATCH] Fix C ICE on invalid (PR c/18946)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
c-decl.c (bind) documents ERROR_MARK as one of the allowed nodes in
*->decl, but there are places that clearly don't handle that, as
shown by the testcase below.
Ok to commit?
2005-01-20 Jakub Jelinek <jakub@redhat.com>
PR c/18946
* c-decl.c (warn_if_shadowing): Handle old_decl error_mark_node.
(pushdecl): Only use DECL_FILE_SCOPE_P if DECL_P.
(implicitly_declare): Handle error_mark_node.
* gcc.dg/noncompile/20050120-1.c: New test.
--- gcc/c-decl.c.jj 2005-01-06 14:25:34.000000000 +0100
+++ gcc/c-decl.c 2005-01-20 14:35:12.411122440 +0100
@@ -1850,7 +1850,13 @@ warn_if_shadowing (tree new_decl)
{
tree old_decl = b->decl;
- if (TREE_CODE (old_decl) == PARM_DECL)
+ if (old_decl == error_mark_node)
+ {
+ warning ("%Jdeclaration of %qD shadows previous non-variable",
+ new_decl, new_decl);
+ break;
+ }
+ else if (TREE_CODE (old_decl) == PARM_DECL)
warning ("%Jdeclaration of %qD shadows a parameter",
new_decl, new_decl);
else if (DECL_FILE_SCOPE_P (old_decl))
@@ -1858,15 +1864,16 @@ warn_if_shadowing (tree new_decl)
new_decl, new_decl);
else if (TREE_CODE (old_decl) == FUNCTION_DECL
&& DECL_BUILT_IN (old_decl))
- warning ("%Jdeclaration of %qD shadows a built-in function",
- new_decl, new_decl);
+ {
+ warning ("%Jdeclaration of %qD shadows a built-in function",
+ new_decl, new_decl);
+ break;
+ }
else
warning ("%Jdeclaration of %qD shadows a previous local",
new_decl, new_decl);
- if (TREE_CODE (old_decl) != FUNCTION_DECL
- || !DECL_BUILT_IN (old_decl))
- warning ("%Jshadowed declaration is here", old_decl);
+ warning ("%Jshadowed declaration is here", old_decl);
break;
}
@@ -2032,7 +2039,7 @@ pushdecl (tree x)
its type saved; the others will already have had their
proper types saved and the types will not have changed as
their scopes will not have been re-entered. */
- if (DECL_FILE_SCOPE_P (b->decl) && !type_saved)
+ if (DECL_P (b->decl) && DECL_FILE_SCOPE_P (b->decl) && !type_saved)
{
b->type = TREE_TYPE (b->decl);
type_saved = true;
@@ -2206,6 +2213,9 @@ implicitly_declare (tree functionid)
if (decl)
{
+ if (decl == error_mark_node)
+ return decl;
+
/* FIXME: Objective-C has weird not-really-builtin functions
which are supposed to be visible automatically. They wind up
in the external scope because they're pushed before the file
--- gcc/testsuite/gcc.dg/noncompile/20050120-1.c.jj 2005-01-20 14:44:32.277643440 +0100
+++ gcc/testsuite/gcc.dg/noncompile/20050120-1.c 2005-01-20 14:55:55.215292506 +0100
@@ -0,0 +1,19 @@
+/* PR c/18946 */
+/* { dg-do compile } */
+/* { dg-options "-Wshadow" } */
+
+void bar (void)
+{
+ {
+ if (foo) /* { dg-error "undeclared|for each" } */
+ foo (); /* { dg-warning "shadows previous" } */
+ }
+}
+
+void baz (void)
+{
+ if (foo) /* { dg-error "undeclared" } */
+ {
+ int foo; /* { dg-warning "shadows previous" } */
+ }
+}
Jakub