diff options
Diffstat (limited to 'gcc/fortran/parse.c')
-rw-r--r-- | gcc/fortran/parse.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 6fd3322..4fb690b 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -1,5 +1,5 @@ /* Main parser. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Contributed by Andy Vaught @@ -2396,7 +2396,7 @@ done: /* Come here to complain about a global symbol already in use as something else. */ -static void +void global_used (gfc_gsymbol *sym, locus *where) { const char *name; @@ -2430,7 +2430,7 @@ global_used (gfc_gsymbol *sym, locus *where) } gfc_error("Global name '%s' at %L is already being used as a %s at %L", - gfc_new_block->name, where, name, &sym->where); + sym->name, where, name, &sym->where); } @@ -2461,12 +2461,13 @@ parse_block_data (void) else { s = gfc_get_gsymbol (gfc_new_block->name); - if (s->type != GSYM_UNKNOWN) + if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_BLOCK_DATA)) global_used(s, NULL); else { s->type = GSYM_BLOCK_DATA; s->where = gfc_current_locus; + s->defined = 1; } } @@ -2491,12 +2492,13 @@ parse_module (void) gfc_gsymbol *s; s = gfc_get_gsymbol (gfc_new_block->name); - if (s->type != GSYM_UNKNOWN) + if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_MODULE)) global_used(s, NULL); else { s->type = GSYM_MODULE; s->where = gfc_current_locus; + s->defined = 1; } st = parse_spec (ST_NONE); @@ -2535,12 +2537,14 @@ add_global_procedure (int sub) s = gfc_get_gsymbol(gfc_new_block->name); - if (s->type != GSYM_UNKNOWN) + if (s->defined + || (s->type != GSYM_UNKNOWN && s->type != (sub ? GSYM_SUBROUTINE : GSYM_FUNCTION))) global_used(s, NULL); else { s->type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION; s->where = gfc_current_locus; + s->defined = 1; } } @@ -2556,12 +2560,13 @@ add_global_program (void) return; s = gfc_get_gsymbol (gfc_new_block->name); - if (s->type != GSYM_UNKNOWN) + if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_PROGRAM)) global_used(s, NULL); else { s->type = GSYM_PROGRAM; s->where = gfc_current_locus; + s->defined = 1; } } |