From d8dd2f3a64a689127b43a7b4ca3260d93b977cc5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 27 Jan 2005 13:38:38 +0100 Subject: [PATCH] re PR c/18946 (ICE in pushdecl) 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. From-SVN: r94320 --- gcc/ChangeLog | 7 ++++++ gcc/c-decl.c | 24 ++++++++++++++------ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/noncompile/20050120-1.c | 19 ++++++++++++++++ 4 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/noncompile/20050120-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6999c439dc2..51b5a55a4c1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-01-27 Jakub Jelinek + + 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. + 2005-01-27 Richard Henderson PR tree-opt/14329 diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 61521e861c7..6e8c74203ce 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index deceb4abe19..fc2fb75164a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-01-27 Jakub Jelinek + + PR c/18946 + * gcc.dg/noncompile/20050120-1.c: New test. + 2005-01-26 Diego Novillo PR tree-optimization/19633 diff --git a/gcc/testsuite/gcc.dg/noncompile/20050120-1.c b/gcc/testsuite/gcc.dg/noncompile/20050120-1.c new file mode 100644 index 00000000000..4af84b6f22a --- /dev/null +++ b/gcc/testsuite/gcc.dg/noncompile/20050120-1.c @@ -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" } */ + } +}