This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[Patch, fortran] PR33542 - gfortran does not detect ambigious specific names if they are the same as generic names
- From: "Paul Richard Thomas" <paul dot richard dot thomas at gmail dot com>
- To: "fortran at gcc dot gnu dot org" <fortran at gcc dot gnu dot org>, "gcc-patches List" <gcc-patches at gcc dot gnu dot org>
- Date: Sun, 7 Oct 2007 21:01:21 +0200
- Subject: [Patch, fortran] PR33542 - gfortran does not detect ambigious specific names if they are the same as generic names
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:mime-version:content-type; bh=Tn045vlEUcirYCxrRrIRD8V9mZkrErgh3slssvvx0aI=; b=M51TzHbk7WLCFGsCe13BFfkHWgWmWi36AHRsjG80kAuLZn8v0fR/2rLmAUC8WVPC59Ee4je9klUiYIA0UlATKVoGI1gwg+6p32ukjcc5PTXIs5X88hdq8yrK7gbvugK9V4ul7hI++1m/e9wY2SqE2HpnCpkKgOvGkb38GarUXnQ=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:mime-version:content-type; b=bQzs3qVZu1pFBPBwm/C2oiYN77L725HmehZ2IEK6x85HZKKoHBkc8Kid3XwmnvcXSA0N1TyRWOOIf3uCEctXYniTNJlcs/O/0hSLJ7jiEef0c2o8mSHN+74Gl0O4egtJmgkRGokH+X/w3g843rtnb4vwivSMYvgnRT0g1UoMIx4=
:ADDPATCH fortran:
This is the obvious version of the 'obvious' patch that wasn't. Sorry
about the last mess.
The general rule is that use associated symbols can be ambiguous just
as long as they are not referenced. This is done so that other
symbols may be used from these modules that are not ambiguous, without
necessitating only clauses.
In the case of this PR, the symtree for 'foo' is ambiguous, where
there are two identically named specific procedures. Thus, the trick
is to make sure this is detected when resolving the actual argument.
The testcase is the original..
This time, I have tested tonto-2.3 with the patch, as well as
bootstrapping and regtesting.
OK for trunk?
Paul
2007-10-07 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-07 Paul Thomas <pault@gcc.gnu.org>
PR fortran/33542
* gfortran.dg/ambiguous_specific_1.f90: New test.
--
The knack of flying is learning how to throw yourself at the ground and miss.
--Hitchhikers Guide to the Galaxy
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 <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" } }