[gcc(refs/users/marxin/heads/marxin-gcc-benchmark-branch)] fortran: Fix up TYPE_ARG_TYPES of procs with scalar VALUE optional args [PR92305]

Martin Liska marxin@gcc.gnu.org
Mon Mar 30 10:42:49 GMT 2020


https://gcc.gnu.org/g:add31061ec23e07fdf749dc335308efc81151a3d

commit add31061ec23e07fdf749dc335308efc81151a3d
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Sat Feb 1 10:02:20 2020 +0100

    fortran: Fix up TYPE_ARG_TYPES of procs with scalar VALUE optional args [PR92305]
    
    The following patch fixes
    -FAIL: libgomp.fortran/use_device_addr-1.f90   -O0  execution test
    -FAIL: libgomp.fortran/use_device_addr-2.f90   -O0  execution test
    that has been FAILing for several months on powerpc64le-linux.
    The problem is in the Fortran FE, which adds the artificial arguments
    for scalar VALUE OPTIONAL dummy args only to DECL_ARGUMENTS where the
    current function can see them, but not to TYPE_ARG_TYPES; if those functions
    aren't varargs, this confuses calls.c to pass the remaining arguments
    (which aren't named (== not covered by TYPE_ARG_TYPES) and aren't varargs
    either) in a different spot from what the callee (which has proper
    DECL_ARGUMENTS for all args) expects.  For the artificial length arguments
    for character dummy args we already put them in both DECL_ARGUMENTS and
    TYPE_ARG_TYPES.
    
    2020-02-01  Jakub Jelinek  <jakub@redhat.com>
    
            PR fortran/92305
            * trans-types.c (gfc_get_function_type): Also push boolean_type_node
            types for non-character scalar VALUE optional dummy arguments.
            * trans-decl.c (create_function_arglist): Skip those in
            hidden_typelist.  Formatting fix.

Diff:
---
 gcc/fortran/ChangeLog     |  8 ++++++++
 gcc/fortran/trans-decl.c  |  6 ++++--
 gcc/fortran/trans-types.c | 10 ++++++++++
 3 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 9b17daf15f9..2b188e513b7 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,11 @@
+2020-02-01  Jakub Jelinek  <jakub@redhat.com>
+
+	PR fortran/92305
+	* trans-types.c (gfc_get_function_type): Also push boolean_type_node
+	types for non-character scalar VALUE optional dummy arguments.
+	* trans-decl.c (create_function_arglist): Skip those in
+	hidden_typelist.  Formatting fix.
+
 2020-01-31  Tobias Burnus  <tobias@codesourcery.com>
 
 	PR fortran/93462
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 1147c246281..e91a2795762 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -2645,8 +2645,8 @@ create_function_arglist (gfc_symbol * sym)
 	      || f->sym->ts.u.cl->backend_decl == length)
 	    {
 	      if (POINTER_TYPE_P (len_type))
-		f->sym->ts.u.cl->backend_decl =
-			build_fold_indirect_ref_loc (input_location, length);
+		f->sym->ts.u.cl->backend_decl
+		  = build_fold_indirect_ref_loc (input_location, length);
 	      else if (f->sym->ts.u.cl->backend_decl == NULL)
 		gfc_create_string_length (f->sym);
 
@@ -2677,6 +2677,8 @@ create_function_arglist (gfc_symbol * sym)
           DECL_ARG_TYPE (tmp) = boolean_type_node;
           TREE_READONLY (tmp) = 1;
           gfc_finish_decl (tmp);
+
+	  hidden_typelist = TREE_CHAIN (hidden_typelist);
 	}
 
       /* For non-constant length array arguments, make sure they use
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index 0a749d6e0a0..8a4c8eef4a1 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -3098,6 +3098,16 @@ gfc_get_function_type (gfc_symbol * sym, gfc_actual_arglist *actual_args)
 
 	  vec_safe_push (typelist, type);
 	}
+      /* For noncharacter scalar intrinsic types, VALUE passes the value,
+	 hence, the optional status cannot be transferred via a NULL pointer.
+	 Thus, we will use a hidden argument in that case.  */
+      else if (arg
+	       && arg->attr.optional
+	       && arg->attr.value
+	       && !arg->attr.dimension
+	       && arg->ts.type != BT_CLASS
+	       && !gfc_bt_struct (arg->ts.type))
+	vec_safe_push (typelist, boolean_type_node);
     }
 
   if (!vec_safe_is_empty (typelist)


More information about the Gcc-cvs mailing list