[Patch, Fortran] First ASSOCIATE patch and some questions / RFCs

Daniel Kraft d@domob.eu
Sun Jun 6 17:43:00 GMT 2010


Hi all,

attached is my first patch on the way of implementing the ASSOCIATE 
construct.  See the test-cases for what it is supposed to do.  Not yet 
working are basically two things:


* Association of names to variables (currently only expressions).  I 
think that my original idea of replacing each occurrence directly in the 
parser with the corresponding gfc_expr does not work, because it will do 
the wrong thing if the selector expression changes, as in these two cases:

INTEGER, POINTER :: ptr
ptr => something
ASSOCIATE (x => ptr)
   ptr => something else
   ! x should still refer to something
END ASSOCIATE

INTEGER :: n
REAL :: array(10)
n = 2
ASSOCIATE (arr => array(n : n+2)
   n = 5
   ! arr is still array(2 : 4)
END ASSOCIATE

(At least if I read the standard correctly.)  So instead we need another 
strategy; possibly using a BLOCK local pointer that it pointed to the 
selector.

Does this provoke problems, when the selector is not TARGET or the like? 
  But I think we're already doing something like that for SELECT TYPE at 
the moment -- Janus, can the current implementation be used for the 
general ASSOCIATE case, too?  Or does it only work for polymorphism?


* Association to array expressions.  The problem here is that for 
something like:

INTEGER :: array(10)
ASSOCIATE (doubled => 2 * array)
   PRINT *, doubled(2)
END ASSOCIATE

During parsing, the expression "2 * array" seems not to have its rank 
defined yet; this is only done at resolution stage.  However, when 
parsing doubled(2), the compiler already needs to know that doubled is 
an array!  Any ideas what we could do here?

Otherwise, I think that with the ability of BLOCK to declare 
"dynamically sized" arrays (like VLA's in C) we can easily generate a 
correctly shaped local variable to hold the results whenever necessary.


On the other side, basic association to scalar expressions seems already 
to work quite well.  I've still two positions marked "XXX" in the patch 
I'd also like to get another opinion on:

First, when calling gfc_get_sym_tree to insert a symbol into the current 
namespace, in theory this function may return a failure code.  However, 
I'm not sure what to do in this case; especially, a grep of the source 
shows that it is already used without checking for the return value at 
all in different places.  So:  When may it precisely fail and what's the 
guideline to follow here?  Is it ok to call it without check, is the 
gcc_unreachable() check as in my patch ok, or do we have to deal and 
correctly handle a failure?  If so, should the other places also be 
updated to do so?

Second, is primary.c:match_variable the place that handles what the 
standard calls a "variable definition context"?  It seems to be so, at 
least for the basic handling.  Or is there already some other routine to 
check that?  Do I have to implement my own to be fully correct?


The patch was regression-tested on GNU/Linux-x86-32. 
array_constructor_11.f90 failed with -O3 -g, but I don't see how this 
could be related to my patch...  Does anyone else see this?  If so, ok 
for trunk?

Thanks,
Daniel

-- 
http://www.pro-vegan.info/
--
Done:  Arc-Bar-Cav-Ran-Rog-Sam-Tou-Val-Wiz
To go: Hea-Kni-Mon-Pri
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: patch.changelog
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20100606/0ac5b0c0/attachment.ksh>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: patch.diff
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20100606/0ac5b0c0/attachment-0001.ksh>


More information about the Gcc-patches mailing list