re PR c/18963 (static and nested declarations cause an ice)

2004-12-21  James A. Morrison  <phython@gcc.gnu.org>

       PR c/18963
       * c-decl.c (pushdecl): Remove block trying to merge static function
       declarations at block scope to file scope declarations.

testsuite:
        PR c/18963
        * gcc.dg/pr18963-1.c: New test.

From-SVN: r92460
This commit is contained in:
James A. Morrison 2004-12-21 17:07:06 +00:00
parent 6f17bbcf05
commit ebef4d3044
4 changed files with 40 additions and 24 deletions

View File

@ -1,3 +1,9 @@
2004-12-21 James A. Morrison <phython@gcc.gnu.org>
PR c/18963
* c-decl.c (pushdecl): Remove block trying to merge static function
declarations at block scope to file scope declarations.
2004-12-21 James A. Morrison <phython@gcc.gnu.org>
PR c/18596

View File

@ -2069,30 +2069,6 @@ pushdecl (tree x)
}
}
}
/* Similarly, a declaration of a function with static linkage at
block scope must be checked against any existing declaration
of that function at file scope. */
else if (TREE_CODE (x) == FUNCTION_DECL && scope != file_scope
&& !TREE_PUBLIC (x) && !DECL_INITIAL (x))
{
if (warn_nested_externs && !DECL_IN_SYSTEM_HEADER (x))
warning ("nested static declaration of %qD", x);
while (b && !B_IN_FILE_SCOPE (b))
b = b->shadowed;
if (b && same_translation_unit_p (x, b->decl)
&& duplicate_decls (x, b->decl))
{
bind (name, b->decl, scope, /*invisible=*/false, /*nested=*/true);
return b->decl;
}
else
{
bind (name, x, file_scope, /*invisible=*/true, /*nested=*/false);
nested = true;
}
}
warn_if_shadowing (x);

View File

@ -1,3 +1,8 @@
2004-12-21 James A. Morrison <phython@gcc.gnu.org>
PR c/18963
* gcc.dg/pr18963-1.c: New test.
2004-12-21 James A. Morrison <phython@gcc.gnu.org>
PR c/18596

View File

@ -0,0 +1,29 @@
/* { dg-do run } */
/* { dg-options "" } */
static int barf ();
int foo ()
{
auto int barf ();
int j = 4;
int barf () {
return j;
}
return barf ();
}
static int barf () {
return 3;
}
extern void exit (int);
extern void abort ();
int main (int argc, char *argv[]) {
if (foo () != 4)
abort ();
exit (0);
}