Hello,

For PR 63727, a check was introduced, rejecting procedure pointer
components used as actual arguments:
        foo(obj%proc_comp)
but it had the side effect of also rejecting
        foo(obj%proc_comp(arg))

Fixed by the attached patch.
Tested on x86_64-linux. OK for 6/5 ?

Mikael



2015-05-23  Mikael Morin  <mik...@gcc.gnu.org>

	PR fortran/66257
	* resolve.c (resolve_actual_arglist): Don't throw an error
	if the argument with procedure pointer component is not a variable.

2015-05-23  Mikael Morin  <mik...@gcc.gnu.org>

	PR fortran/66257
	* typebound_call_27.f90: New file.

diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index fbf260f..a46ab60 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -1981,7 +1981,8 @@ resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
 	}
 
       comp = gfc_get_proc_ptr_comp(e);
-      if (comp && comp->attr.elemental)
+      if (e->expr_type == EXPR_VARIABLE
+	  && comp && comp->attr.elemental)
 	{
 	    gfc_error ("ELEMENTAL procedure pointer component %qs is not "
 		       "allowed as an actual argument at %L", comp->name,


! { dg-do compile }
!
! PR fortran/66257
! Check that typebound function calls are accepted as actual argument.
!
MODULE test_class
  IMPLICIT NONE
  PRIVATE
  PUBLIC:: test

  INTEGER, PARAMETER :: dp  = SELECTED_REAL_KIND(15)

  TYPE test
      PRIVATE
      CONTAINS
          PRIVATE
              PROCEDURE, PUBLIC:: E
              PROCEDURE, PUBLIC:: Om
  END TYPE test

CONTAINS

  ELEMENTAL FUNCTION E (self, a)
    IMPLICIT NONE
    CLASS(test), INTENT(IN):: self
    REAL(kind=dp), INTENT(IN):: a
    REAL(kind=dp):: E

    E = a
  END FUNCTION E

  ELEMENTAL FUNCTION Om (self, z)
    IMPLICIT NONE
    CLASS(test), INTENT(IN):: self
    REAL(kind=dp), INTENT(IN):: z
    REAL(kind=dp):: Om

    Om = self%E(self%E(z))
    Om = log10(self%E(z))
  END FUNCTION Om
END MODULE test_class



Reply via email to