diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5de8b3c6488..b09cb7e3f1a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2005-07-08 Jakub Jelinek + + * primary.c (gfc_match_rvalue): Handle ENTRY the same way + as FUNCTION. + 2005-07-07 Jakub Jelinek * scanner.c (load_line): Add pbuflen argument, don't make diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index f6807d5ec32..36e5eb96f37 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -1846,11 +1846,24 @@ gfc_match_rvalue (gfc_expr ** result) gfc_set_sym_referenced (sym); - if (sym->attr.function && sym->result == sym - && (gfc_current_ns->proc_name == sym + if (sym->attr.function && sym->result == sym) + { + if (gfc_current_ns->proc_name == sym || (gfc_current_ns->parent != NULL - && gfc_current_ns->parent->proc_name == sym))) - goto variable; + && gfc_current_ns->parent->proc_name == sym)) + goto variable; + + if (sym->attr.entry + && (sym->ns == gfc_current_ns + || sym->ns == gfc_current_ns->parent)) + { + gfc_entry_list *el = NULL; + + for (el = sym->ns->entries; el; el = el->next) + if (sym == el->sym) + goto variable; + } + } if (sym->attr.function || sym->attr.external || sym->attr.intrinsic) goto function0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 67c70d4c17e..2a06854202c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-07-08 Jakub Jelinek + + * gfortran.fortran-torture/execute/entry_10.f90: New test. + 2005-07-07 Geoffrey Keating * gcc.dg/darwin-version-1.c: New. diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/entry_10.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/entry_10.f90 new file mode 100644 index 00000000000..0c21d76e303 --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/execute/entry_10.f90 @@ -0,0 +1,13 @@ + function foo () + foo = 4 + foo = foo / 2 + return + entry bar () + bar = 9 + bar = bar / 3 + end + + program entrytest + if (foo () .ne. 2) call abort () + if (bar () .ne. 3) call abort () + end