From: Mark Mitchell Date: Tue, 15 Apr 2003 01:37:03 +0000 (+0000) Subject: c-decl.c (grokdeclarator): Reject extern redeclarations of static variables. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f4e929877c7e155de2f729c3330353762ce1b0ed;p=gcc.git c-decl.c (grokdeclarator): Reject extern redeclarations of static variables. * c-decl.c (grokdeclarator): Reject extern redeclarations of static variables. * gcc.c-torture/execute/scope-2.c: Move to ... * gcc.dg/noncompile/scope.c: .... here. From-SVN: r65615 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1b40e3afd18..0aa770c92db 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-04-14 Mark Mitchell + + * c-decl.c (grokdeclarator): Reject extern redeclarations of + static variables. + 2003-04-14 Janis Johnson * config/rs6000/rs6000.md (define_constants): Define constants for diff --git a/gcc/c-decl.c b/gcc/c-decl.c index be6ff79059d..50b7219b393 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -4375,7 +4375,22 @@ grokdeclarator (declarator, declspecs, decl_context, initialized) } else if (type_quals) type = c_build_qualified_type (type, type_quals); - + + /* It is invalid to create an `extern' declaration for a + variable if there is a global declaration that is + `static'. */ + if (extern_ref && current_binding_level != global_binding_level) + { + tree global_decl; + + global_decl = identifier_global_value (declarator); + if (global_decl + && TREE_CODE (global_decl) == VAR_DECL + && !TREE_PUBLIC (global_decl)) + error ("variable previously declared `static' redeclared " + "`extern'"); + } + decl = build_decl (VAR_DECL, declarator, type); if (size_varies) C_DECL_VARIABLE_SIZE (decl) = 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1fc22eecce1..ab306f13bec 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-04-14 Mark Mitchell + + * gcc.c-torture/execute/scope-2.c: Move to ... + * gcc.dg/noncompile/scope.c: .... here. + 2003-04-14 Roger Sayle * gcc.dg/20030414-2.c: New test case. diff --git a/gcc/testsuite/gcc.c-torture/execute/scope-2.c b/gcc/testsuite/gcc.c-torture/execute/scope-2.c deleted file mode 100644 index c9a4775f6f5..00000000000 --- a/gcc/testsuite/gcc.c-torture/execute/scope-2.c +++ /dev/null @@ -1,17 +0,0 @@ -static int v = 3; - -f () -{ - int v = 4; - { - extern int v; - if (v != 3) - abort (); - } -} - -main () -{ - f (); - exit (0); -} diff --git a/gcc/testsuite/gcc.dg/noncompile/scope.c b/gcc/testsuite/gcc.dg/noncompile/scope.c new file mode 100644 index 00000000000..0bfc3f284db --- /dev/null +++ b/gcc/testsuite/gcc.dg/noncompile/scope.c @@ -0,0 +1,17 @@ +static int v = 3; + +f () +{ + int v = 4; + { + extern int v; /* { dg-error "static" } */ + if (v != 3) + abort (); + } +} + +main () +{ + f (); + exit (0); +}