diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2007-11-25 09:59:42 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2007-11-25 09:59:42 +0000 |
commit | 2e32a71e419484f79ea6ea7f67b29cb6ff0dcca9 (patch) | |
tree | e513bf0afce83d7ff044cd37ced5614c45206e7c /gcc/fortran/decl.c | |
parent | 1bfcad84abd38df371e01821d1741c4fbe352123 (diff) | |
download | gcc-2e32a71e419484f79ea6ea7f67b29cb6ff0dcca9.zip gcc-2e32a71e419484f79ea6ea7f67b29cb6ff0dcca9.tar.gz gcc-2e32a71e419484f79ea6ea7f67b29cb6ff0dcca9.tar.bz2 |
re PR fortran/33499 (Rejects valid module with a contained function with an ENTRY)
2007-11-25 Paul Thomas <pault@gcc.gnu.org>
PR fortran/33499
* decl.c (get_proc_name): If ENTRY statement occurs before type
specification, set the symbol untyped and ensure that it is in
the procedure namespace.
2007-11-25 Paul Thomas <pault@gcc.gnu.org>
PR fortran/33499
* gfortran.dg/entry_16.f90: New test.
From-SVN: r130403
Diffstat (limited to 'gcc/fortran/decl.c')
-rw-r--r-- | gcc/fortran/decl.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index d66ea53..ca17829 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -715,9 +715,7 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry) if (*result == NULL) rc = gfc_get_symbol (name, NULL, result); - else if (gfc_get_symbol (name, NULL, &sym) == 0 - && sym - && sym->ts.type != BT_UNKNOWN + else if (!gfc_get_symbol (name, NULL, &sym) && sym && (*result)->ts.type == BT_UNKNOWN && sym->attr.flavor == FL_UNKNOWN) /* Pick up the typespec for the entry, if declared in the function @@ -726,13 +724,24 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry) is set to point to the module symbol and a unique symtree to the local version. This latter ensures a correct clearing of the symbols. */ - { + { + /* If the ENTRY proceeds its specification, we need to ensure + that this does not raise a "has no IMPLICIT type" error. */ + if (sym->ts.type == BT_UNKNOWN) + sym->attr.untyped = 1; + (*result)->ts = sym->ts; - gfc_find_sym_tree (name, gfc_current_ns, 0, &st); - st->n.sym = *result; - st = gfc_get_unique_symtree (gfc_current_ns); - st->n.sym = sym; - } + + /* Put the symbol in the procedure namespace so that, should + the ENTRY preceed its specification, the specification + can be applied. */ + (*result)->ns = gfc_current_ns; + + gfc_find_sym_tree (name, gfc_current_ns, 0, &st); + st->n.sym = *result; + st = gfc_get_unique_symtree (gfc_current_ns); + st->n.sym = sym; + } } else rc = gfc_get_symbol (name, gfc_current_ns->parent, result); |