diff options
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/ambiguous_specific_1.f90 | 38 |
4 files changed, 56 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index c6e6d7eb64a..92a757096bf 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,11 @@ 2007-10-12 Paul Thomas <pault@gcc.gnu.org> + PR fortran/33542 + * resolve.c (resolve_actual_arglist): If the actual argument is + ambiguous, then there is an error. + +2007-10-12 Paul Thomas <pault@gcc.gnu.org> + PR fortran/33664 * expr.c (gfc_specification_expr): If a function is not external, intrinsic or pure is an error. Set the symbol pure diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 2686c3dac82..26c139c84b8 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -971,6 +971,13 @@ resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype) continue; } + if (e->expr_type == FL_VARIABLE && e->symtree->ambiguous) + { + gfc_error ("'%s' at %L is ambiguous", e->symtree->n.sym->name, + &e->where); + return FAILURE; + } + if (e->ts.type != BT_PROCEDURE) { if (gfc_resolve_expr (e) != SUCCESS) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 890da97d183..cd64825f97b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2007-10-12 Paul Thomas <pault@gcc.gnu.org> + PR fortran/33542 + * gfortran.dg/ambiguous_specific_1.f90: New test. + +2007-10-12 Paul Thomas <pault@gcc.gnu.org> + PR fortran/33664 * gfortran.dg/impure_spec_expr_1.f90: New test. * gfortran.dg/char_result_7.f90: Remove illegal test. diff --git a/gcc/testsuite/gfortran.dg/ambiguous_specific_1.f90 b/gcc/testsuite/gfortran.dg/ambiguous_specific_1.f90 new file mode 100644 index 00000000000..b5292b2dd82 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/ambiguous_specific_1.f90 @@ -0,0 +1,38 @@ +! { dg-do compile } +! Checks the fix for PR33542, in which the ambiguity in the specific +! interfaces of foo was missed. +! +! Contributed by Tobias Burnus <burnus@gcc.gnu.org> +! +MODULE M1 + INTERFACE FOO + MODULE PROCEDURE FOO + END INTERFACE +CONTAINS + SUBROUTINE FOO(I) + INTEGER, INTENT(IN) :: I + WRITE(*,*) 'INTEGER' + END SUBROUTINE FOO +END MODULE M1 + +MODULE M2 + INTERFACE FOO + MODULE PROCEDURE FOO + END INTERFACE +CONTAINS + SUBROUTINE FOO(R) + REAL, INTENT(IN) :: R + WRITE(*,*) 'REAL' + END SUBROUTINE FOO +END MODULE M2 + +PROGRAM P + USE M1 + USE M2 + implicit none + external bar + CALL FOO(10) + CALL FOO(10.) + call bar (foo) ! { dg-error "is ambiguous" } +END PROGRAM P +! { dg-final { cleanup-modules "m1 m2" } } |