[Patch, fortran] PR29642 - Fortran 2003: VALUE Attribute (pass by value)
Paul Thomas
paulthomas2@wanadoo.fr
Sat Nov 18 10:54:00 GMT 2006
Tobias,
Many thanks for a thorough review - it does not seem to have been the
best of my efforts; still there isn't much to do :-)
>>> Standard is two spaces between date and name and between name and email
>>> address.
>>>
>>>
Mea culpa - too small a font or I nneed new glasses.You should add a
test whether the VALUE variable is also a dummy
> variable; currently,e.g.
> program test
> real, value :: a
> end program test
> gives no error.
> "C515 (R501) The INTENT, VALUE, and OPTIONAL attributes may be specified
> only for dummy arguments."
>
Bother, it's in my notes but I didn't check it off. I originally
implemented it in resolve.c but scrubbed it as I decided to put the
check in the matchers.
> One should also add VALUE (and also VOLATILE) to:
> case FL_PROGRAM:
> case FL_BLOCK_DATA:
> case FL_MODULE:
> case FL_LABEL:
> (not found in the standard, but should be obvious; for VALUE probably
> not needed if one requires "dummy".)
>
Indeed to the last remark.
>
> VALUE should conflict with PARAMETER, EXTERNAL
> See:
> "C527 (R501) If the VALUE attribute is specified, the PARAMETER,
> EXTERNAL, POINTER,
> ALLOCATABLE, DIMENSION, VOLATILE, INTENT(INOUT), or INTENT(OUT) attribute
> shall not be specified."
>
>
OK
>
>>> Index: gcc/testsuite/gfortran.dg/value_1.f90
>>> + ! { dg-options "-std=gnu" }
>>>
> Maybe better: "-std=f2003 -fall-intrinsics"
>
Why so?
>
>>> + if ((a%x /= b%x) .or. (a%c /= b%c)) dtne = .TRUE.
>>> + if (r /= 42.0) call abort ()
>>> + if (z /= (-99.0, 199.0)) call abort ()
>>> + if (r /= 42.0) call abort ()
>>> + if (r /= 99.0) call abort ()
>>> + if (z /= (-99.0, 199.0)) call abort ()
>>> + if (z /= (77.0, -42.0)) call abort ()
>>>
> Please replace the real/complex tests by something like
> abs(a%x-b%x) > epsilon(a%x)
> etc. Here it accidentally works, though.
>
I agree with FX on this - these are comparisons of copies, so there is
nothing accidental about it, nor indeed of my intention to have an exact
test there.
>
>
>>> Index: gcc/testsuite/gfortran.dg/value_3.f90
>>>
> Please add a test like:
> program x
> real,value :: r
> end program x
>
OK - ie. cf the above.
>
> value_4.f90
> + if ((2.0 * a).ne.b) call abort ()
> This fails here. You should use something like:
> if(abs(2.0*a -b)>epsilon(a)) call abort()
>
> Same for u and v, it should be something like:
> if (abs(4.0 * real(u)-real(v)) >epsilon(a) &
> .or.abs(4.0 * aimag(u)-aimag(v)) >epsilon(a) ) call abort ()
>
> value_4.c:
> + i_to_i__(long i1, long *i2)
> + return *i2 * 3.0;
> This should be "3" not "3.0"
>
OK and thanks again.
Paul
More information about the Gcc-patches
mailing list