From d48662d49650099e5ab9e1fe218311a18c2ff73a Mon Sep 17 00:00:00 2001 From: grischka Date: Thu, 5 May 2016 20:04:00 +0200 Subject: tccgen: scopes levels for local symbols (update 1) Catch top level redeclarations too. Also fix mistakes in tcctest.c and the tcc sources (win32) showing up now. --- tccgen.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'tccgen.c') diff --git a/tccgen.c b/tccgen.c index 042fb92..6954d3a 100644 --- a/tccgen.c +++ b/tccgen.c @@ -239,11 +239,10 @@ ST_FUNC Sym *sym_push(int v, CType *type, int r, int c) ps = &ts->sym_identifier; s->prev_tok = *ps; *ps = s; - if (local_scope) { - s->scope = local_scope; - if (s->prev_tok && s->prev_tok->scope == s->scope) - tcc_error("redeclaration of '%s'", get_tok_str(v & ~SYM_STRUCT, NULL)); - } + s->scope = local_scope; + if (s->prev_tok && s->prev_tok->scope == s->scope) + tcc_error("redeclaration of '%s'", + get_tok_str(v & ~SYM_STRUCT, NULL)); } return s; } @@ -2929,6 +2928,8 @@ static void struct_decl(CType *type, AttributeDef *ad, int u) expect("struct/union/enum name"); s = struct_find(v); if (s && s->type.t == a) { + if (0 == local_scope) + goto do_decl; /* compatibility with past behavior */ if (tok != '{' && tok != ';') goto do_decl; /* variable declaration: 'struct s x;' */ if (s->scope == local_scope && (s->c == -1 || tok != '{')) -- cgit v1.3.1