The %VAL construct is used for passing arguments by value, rather than the usual by reference or descriptor. It is vital for interoperability with other languages such as C. This feature is available in g77: http://gcc.gnu.org/onlinedocs/gcc-3.4.4/g77/_0025VAL_0028_0029.html#_0025VAL_0028_0029 My interest in this feature comes from the world of astronomy where we have a large legacy code base (~1 Million SLOC) written in Fortran 77, (see http://cvsweb.starlink.ac.uk) where this feature is used for efficiently accessing large data arrays using mmap, complex data structures, and for accessing dynamic memory.
Confirmed.
*** Bug 23062 has been marked as a duplicate of this bug. ***
Created attachment 9360 [details] Testcase. Fortran source Simple test case that calls C malloc from Fortran. Also need file malloc_wrapper.c.
Created attachment 9361 [details] Part of simple testcase.
*** Bug 23063 has been marked as a duplicate of this bug. ***
*** Bug 23064 has been marked as a duplicate of this bug. ***
Since g77 supported this construct, should this not be a regression rather than an enhancement.
Changing this into a bug, since it was implemented in g77. It might be working soon, since we will soon have ISO_C_BINDING val attribute, which does the same thing, so adding the %val construct will probably be very easy.
[Paul changed this bug into enhancement] I'm changing this back (again) into a bug, not an enhancement, because it was supported by g77, and we're trying to make a drop-in replacement for g77 in most cases.
Adding %REF and %DESCR to the summary. Documentation available here: http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Functions-and-Subroutines.html
A long overdue patch for this will be submitted in the next 24hours. Paul
Subject: Bug number PR23060 A patch for this bug has been added to the patch tracker. The mailing list url for the patch is http://gcc.gnu.org/ml/gcc-patches/2006-12/msg01834.html
Subject: Bug 23060 Author: pault Date: Sun Dec 31 06:55:16 2006 New Revision: 120295 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=120295 Log: 2006-12-31 Paul Thomas <pault@gcc.gnu.org> PR fortran/23060 * intrinsic.c (compare_actual_formal ): Distinguish argument list functions from keywords. * intrinsic.c (sort_actual): If formal is NULL, the presence of an argument list function actual is an error. * trans-expr.c (conv_arglist_function) : New function to implement argument list functions %VAL, %REF and %LOC. (gfc_conv_function_call): Call it. * resolve.c (resolve_actual_arglist): Add arg ptype and check argument list functions. (resolve_function, resolve_call): Set value of ptype before calls to resolve_actual_arglist. * primary.c (match_arg_list_function): New function. (gfc_match_actual_arglist): Call it before trying for a keyword argument. 2006-12-31 Paul Thomas <pault@gcc.gnu.org> PR fortran/23060 * gfortran.dg/c_by_val.c: Called by c_by_val_1.f. * gfortran.dg/c_by_val_1.f: New test. * gfortran.dg/c_by_val_2.f: New test. * gfortran.dg/c_by_val_3.f: New test. Added: trunk/gcc/testsuite/gfortran.dg/c_by_val.c trunk/gcc/testsuite/gfortran.dg/c_by_val_1.f trunk/gcc/testsuite/gfortran.dg/c_by_val_2.f90 trunk/gcc/testsuite/gfortran.dg/c_by_val_3.f90 trunk/gcc/testsuite/gfortran.dg/char_length_1.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/interface.c trunk/gcc/fortran/intrinsic.c trunk/gcc/fortran/primary.c trunk/gcc/fortran/resolve.c trunk/gcc/fortran/trans-expr.c trunk/gcc/testsuite/ChangeLog
Subject: Bug 23060 Author: pault Date: Sat Jan 6 14:13:20 2007 New Revision: 120525 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=120525 Log: 2007-01-06 Paul Thomas <pault@gcc.gnu.org> Bug fixes from trunk PR fortran/30034 * resolve.c (resolve_formal_arglist): Exclude the test for pointers and procedures for subroutine arguments as well as functions. PR fortran/30237 * intrinsic.c (remove_nullargs): Do not pass up arguments with a label. If the actual has a label and the formal has a type then emit an error. PR fortran/25135 * module.c (load_generic_interfaces): If the symbol is present and is not generic it is ambiguous. PR fortran/23060 * intrinsic.c (compare_actual_formal ): Distinguish argument list functions from keywords. * intrinsic.c (sort_actual): If formal is NULL, the presence of an argument list function actual is an error. * trans-expr.c (conv_arglist_function) : New function to implement argument list functions %VAL, %REF and %LOC. (gfc_conv_function_call): Call it. * resolve.c (resolve_actual_arglist): Add arg ptype and check argument list functions. (resolve_function, resolve_call): Set value of ptype before calls to resolve_actual_arglist. * primary.c (match_arg_list_function): New function. (gfc_match_actual_arglist): Call it before trying for a keyword argument. PR fortran/27900 * resolve.c (resolve_actual_arglist): If all else fails and a procedure actual argument has no type, see if a specific intrinsic matches. PR fortran/24325 * resolve.c (resolve_function): If the function reference is FL_VARIABLE this is an error. 2007-01-06 Paul Thomas <pault@gcc.gnu.org> PR fortran/30034 * gfortran.dg/pure_formal_proc_1.f90: New test. PR fortran/30237 * gfortran.dg/intrinsic_actual_3.f90: New test. PR fortran/25135 * gfortran.dg/generic_11.f90: New test. * gfortran.dg/interface_7.f90: Remove name clash between module name and procedure 'x' referenced in the interface. PR fortran/23060 * gfortran.dg/c_by_val.c: Called by c_by_val_1.f. * gfortran.dg/c_by_val_1.f: New test. * gfortran.dg/c_by_val_2.f: New test. * gfortran.dg/c_by_val_3.f: New test. PR fortran/27900 * gfortran.dg/intrinsic_actual_4.f90: New test. PR fortran/24325 * gfortran.dg/func_decl_3.f90: New test. Added: branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/c_by_val.c branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/c_by_val_1.f branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/c_by_val_2.f90 branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/c_by_val_3.f90 branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/func_decl_3.f90 branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/generic_11.f90 branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/intrinsic_actual_3.f90 branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/intrinsic_actual_4.f90 branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/pure_formal_proc_1.f90 Modified: branches/gcc-4_2-branch/gcc/fortran/ChangeLog branches/gcc-4_2-branch/gcc/fortran/interface.c branches/gcc-4_2-branch/gcc/fortran/intrinsic.c branches/gcc-4_2-branch/gcc/fortran/module.c branches/gcc-4_2-branch/gcc/fortran/primary.c branches/gcc-4_2-branch/gcc/fortran/resolve.c branches/gcc-4_2-branch/gcc/fortran/trans-expr.c branches/gcc-4_2-branch/gcc/testsuite/ChangeLog branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/dummy_procedure_1.f90 branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_7.f90
Fixed on trunk and 4.2 Paul
it looks like that suggested code doesn't work for x86_64 platform. I changed ADDR declaration to INTEGER *8 and gfortran -m64 percentval.f returns the following errors: CALL SUB1( %VAL( ADDR ), SIZE ) 1 Error: Kind of by-value argument at (1) is larger than default kind I did it on Mac OS X 10.4.8 and with gcc 4.2 but I guess it could work on Leopard 10.5 but I didn't check it
after looking at the gcc/fortran/trans_types.c I tried to use -fdefault-integer-8 switch and everything was fine
*** Bug 260998 has been marked as a duplicate of this bug. *** Seen from the domain http://volichat.com Page where seen: http://volichat.com/adult-chat-rooms Marked for reference. Resolved as fixed @bugzilla.