diff options
author | Mark Mitchell <mark@codesourcery.com> | 2003-04-15 01:37:03 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-04-15 01:37:03 +0000 |
commit | f4e929877c7e155de2f729c3330353762ce1b0ed (patch) | |
tree | 4c8438b79290bd778e2a8b4953783090eea99c1a /gcc/c-decl.c | |
parent | e62370313892135cb00868a78d506d915dcc27cc (diff) | |
download | gcc-f4e929877c7e155de2f729c3330353762ce1b0ed.zip gcc-f4e929877c7e155de2f729c3330353762ce1b0ed.tar.gz gcc-f4e929877c7e155de2f729c3330353762ce1b0ed.tar.bz2 |
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
Diffstat (limited to 'gcc/c-decl.c')
-rw-r--r-- | gcc/c-decl.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c index be6ff79..50b7219 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; |