From 9e35b3869c9afa2b359e7e40bb6b11c284d8ba11 Mon Sep 17 00:00:00 2001 From: Erik Edelmann Date: Thu, 25 Aug 2005 14:57:36 +0300 Subject: [PATCH] re PR fortran/20363 (interface body has incorrect scope) 2005-08-25 Erik Edelmann fortran/ PR fortran/20363 * symbol.c (find_special): Remove. (build_sym, add_init_expr, attr_decl1): Remove calls to find_special in favor of calls to gfc_get_symbol. testsuite/ PR fortran/20363 * gfortran.dg/named_interface.f90: New. From-SVN: r103486 --- gcc/fortran/ChangeLog | 7 +++++ gcc/fortran/decl.c | 30 +++++++++++-------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gfortran.dg/named_interface.f90 | 9 ++++++ 4 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/named_interface.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 271bbc4bb46d..1de65f53cd63 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2005-08-25 Erik Edelmann + + PR fortran/20363 + * symbol.c (find_special): Remove. + (build_sym, add_init_expr, attr_decl1): Remove calls to + find_special in favor of calls to gfc_get_symbol. + 2005-08-24 Thomas Koenig PR fortran/17758 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 6062627cae3b..8c4ce585e43d 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -530,29 +530,34 @@ syntax: } -/* Special subroutine for finding a symbol. If we're compiling a - function or subroutine and the parent compilation unit is an - interface, then check to see if the name we've been given is the - name of the interface (located in another namespace). If so, - return that symbol. If not, use gfc_get_symbol(). */ +/* Special subroutine for finding a symbol. Check if the name is found + in the current name space. If not, and we're compiling a function or + subroutine and the parent compilation unit is an interface, then check + to see if the name we've been given is the name of the interface + (located in another namespace). */ static int find_special (const char *name, gfc_symbol ** result) { gfc_state_data *s; + int i; + i = gfc_get_symbol (name, NULL, result); + if (i==0) + goto end; + if (gfc_current_state () != COMP_SUBROUTINE && gfc_current_state () != COMP_FUNCTION) - goto normal; + goto end; s = gfc_state_stack->previous; if (s == NULL) - goto normal; + goto end; if (s->state != COMP_INTERFACE) - goto normal; + goto end; if (s->sym == NULL) - goto normal; /* Nameless interface */ + goto end; /* Nameless interface */ if (strcmp (name, s->sym->name) == 0) { @@ -560,8 +565,8 @@ find_special (const char *name, gfc_symbol ** result) return 0; } -normal: - return gfc_get_symbol (name, NULL, result); +end: + return i; } @@ -616,7 +621,8 @@ build_sym (const char *name, gfc_charlen * cl, symbol_attribute attr; gfc_symbol *sym; - if (find_special (name, &sym)) + /* if (find_special (name, &sym)) */ + if (gfc_get_symbol (name, NULL, &sym)) return FAILURE; /* Start updating the symbol table. Add basic type attribute diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9ec423454c66..ad5c25fc3363 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-08-25 Erik Edelmann + + PR fortran/20363 + * gfortran.dg/named_interface.f90: New. + 2005-08-26 Maciej W. Rozycki * gcc.c-torture/execute/frame-address.c: New test. diff --git a/gcc/testsuite/gfortran.dg/named_interface.f90 b/gcc/testsuite/gfortran.dg/named_interface.f90 new file mode 100644 index 000000000000..90fea809fb0c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/named_interface.f90 @@ -0,0 +1,9 @@ +! { dg-do compile } +! PR 20363 +module snafu + interface foo + subroutine really_snafu (foo) + integer, intent (inout) :: foo + end subroutine really_snafu + end interface foo +end module snafu