Binary operator functions require their arguments to have intent(in). Gfortran currently doesn't enforce this, ifort does. $ cat oper-fun.f90 module mymod interface operator (.foo.) module procedure foo_int end interface contains function foo_int (a, b) integer:: foo_int integer :: a, b ! <==== should be intent(in) here foo_int = a + 3 * b end function foo_int end module mymod program main use mymod print *, 1 .foo. 2 end program main $ gfortran oper-fun.f90 && ./a.out 7 $ ifort oper-fun.f90 fortcom: Error: oper-fun.f90, line 6: An explicit INTENT(IN) declaration is expected for this dummy argument of the defined operation. [A] function foo_int (a, b) --------------------^ fortcom: Error: oper-fun.f90, line 6: An explicit INTENT(IN) declaration is expected for this dummy argument of the defined operation. [B] function foo_int (a, b) -----------------------^ fortcom: Error: oper-fun.f90, line 14: Error in opening the Library module file. [MYMOD] use mymod ------^ fortcom: Error: oper-fun.f90, line 15: Dotted string neither a defined operator nor a structure component [FOO] print *, 1 .foo. 2 --------------^ compilation aborted for oper-fun.f90 (code 1)
I have a fix for this, modulo some nonsense involving character(*) results in defined interfaces. Expect a patch in ~24hours. Paul
Subject: Bug number PR27122 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-04/msg00626.html
Subject: Bug 27122 Author: pault Date: Fri Apr 21 05:10:22 2006 New Revision: 113133 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=113133 Log: 2006-04-21 Paul Thomas <pault@gcc.gnu.org> PR fortran/27122 * resolve.c (resolve_function): Remove general restriction on auto character length function interfaces. (gfc_resolve_uops): Check restrictions on defined operator procedures. (resolve_types): Call the check for defined operators. PR fortran/27113 * trans-array.c (gfc_trans_array_constructor_subarray): Remove redundant gfc_todo_error. (get_array_ctor_var_strlen): Remove typo in enum. 2006-04-21 Paul Thomas <pault@gcc.gnu.org> PR fortran/27122 * gfortran.dg/defined_operators_1.f90: New test. * gfortran.dg/assumed_charlen_function_1.f90: Add new error and remove old ones associated, incorrectly, with Note 5.46. PR fortran/27113 * gfortran.dg/character_array_constructor_1.f90: New test. Added: trunk/gcc/testsuite/gfortran.dg/character_array_constructor_1.f90 trunk/gcc/testsuite/gfortran.dg/defined_operators_1.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/resolve.c trunk/gcc/fortran/trans-array.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gfortran.dg/assumed_charlen_function_1.f90
Subject: Bug 27122 Author: pault Date: Sun Apr 23 05:33:16 2006 New Revision: 113191 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=113191 Log: 2006-04-23 Paul Thomas <pault@gcc.gnu.org> PR fortran/27122 * resolve.c (resolve_function): Remove general restriction on auto character length function interfaces. (gfc_resolve_uops): Check restrictions on defined operator procedures. (resolve_types): Call the check for defined operators. PR fortran/27113 * trans-array.c (get_array_ctor_var_strlen): Remove typo in enum. Part of the fix in 4.2, which does not work in 4.1 because the divergence is now too great. PR fortran/26822 * intrinsic.c (add_functions): Mark LOGICAL as elemental. PR fortran/26787 * expr.c (gfc_check_assign): Extend scope of error to include assignments to a procedure in the main program or, from a module or internal procedure that is not that represented by the lhs symbol. Use VARIABLE rather than l-value in message. PR fortran/25597 * trans-decl.c (gfc_trans_deferred_vars): Check if an array result, is also automatic character length. If so, process the character length. Note that this fixes the bug in 4.2 but not here in 4.1 because the trees have diverged too much. Manifestly correct, so applied anyway. PR fortran/18803 PR fortran/25669 PR fortran/26834 * trans_intrinsic.c (gfc_walk_intrinsic_bound): Set data.info.dimen for bound intrinsics. * trans_array.c (gfc_conv_ss_startstride): Pick out LBOUND and UBOUND intrinsics and supply their shape information to the ss and the loop. PR fortran/27124 * trans_expr.c (gfc_trans_function_call): Add a new block, post, in to which all the argument post blocks are put. Add this block to se->pre after a byref call or to se->post, otherwise. 2006-04-23 Paul Thomas <pault@gcc.gnu.org> PR fortran/27122 * gfortran.dg/defined_operators_1.f90: New test. * gfortran.dg/assumed_charlen_function_1.f90: Add new error and remove old ones associated, incorrectly, with Note 5.46. PR fortran/26787 * gfortran.dg/proc_assign_1.f90: New test. * gfortran.dg/procedure_lvalue.f90: Change message. * gfortran.dg/namelist_4.f90: Add new error. PR fortran/27089 * gfortran.dg/specification_type_resolution_1.f90 PR fortran/18803 PR fortran/25669 PR fortran/26834 * gfortran.dg/bounds_temporaries_1.f90: New test. PR fortran/27124 * gfortran.dg/array_return_value_1.f90: New test. Added: branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/array_return_value_1.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/bounds_temporaries_1.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/defined_operators_1.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/proc_assign_1.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/specification_type_resolution_1.f90 Modified: branches/gcc-4_1-branch/gcc/fortran/ChangeLog branches/gcc-4_1-branch/gcc/fortran/expr.c branches/gcc-4_1-branch/gcc/fortran/intrinsic.c branches/gcc-4_1-branch/gcc/fortran/resolve.c branches/gcc-4_1-branch/gcc/fortran/trans-array.c branches/gcc-4_1-branch/gcc/fortran/trans-decl.c branches/gcc-4_1-branch/gcc/fortran/trans-expr.c branches/gcc-4_1-branch/gcc/fortran/trans-intrinsic.c branches/gcc-4_1-branch/gcc/testsuite/ChangeLog branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/assumed_charlen_function_1.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/namelist_4.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/procedure_lvalue.f90
Fixed on trunk and 4.1 Paul