diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-01-27 12:38:38 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2005-01-27 12:38:38 +0000 |
commit | ae265014796c9739eab0f148323b7b0298701312 (patch) | |
tree | b2864a812c50dc742c1e1dbe54fa02578d8854fb /gcc/c-decl.c | |
parent | fb432c2a6c2ff0ae61f6a3f07bd2b23e884a6f84 (diff) |
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.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@94320 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-decl.c')
-rw-r--r-- | gcc/c-decl.c | 24 |
1 files changed, 17 insertions, 7 deletions
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 |