Index: /svn/trunk/gcc/fortran/resolve.c =================================================================== *** /svn/trunk/gcc/fortran/resolve.c (revision 129068) --- /svn/trunk/gcc/fortran/resolve.c (working copy) *************** resolve_actual_arglist (gfc_actual_argli *** 971,976 **** --- 971,983 ---- 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) Index: /svn/trunk/gcc/testsuite/gfortran.dg/ambiguous_specific_1.f90 =================================================================== *** /svn/trunk/gcc/testsuite/gfortran.dg/ambiguous_specific_1.f90 (revision 0) --- /svn/trunk/gcc/testsuite/gfortran.dg/ambiguous_specific_1.f90 (revision 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 + ! + 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" } }