Commit add31061 by Jakub Jelinek

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.
parent 2d33dcfe
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> 2020-01-31 Tobias Burnus <tobias@codesourcery.com>
PR fortran/93462 PR fortran/93462
......
...@@ -2645,8 +2645,8 @@ create_function_arglist (gfc_symbol * sym) ...@@ -2645,8 +2645,8 @@ create_function_arglist (gfc_symbol * sym)
|| f->sym->ts.u.cl->backend_decl == length) || f->sym->ts.u.cl->backend_decl == length)
{ {
if (POINTER_TYPE_P (len_type)) if (POINTER_TYPE_P (len_type))
f->sym->ts.u.cl->backend_decl = f->sym->ts.u.cl->backend_decl
build_fold_indirect_ref_loc (input_location, length); = build_fold_indirect_ref_loc (input_location, length);
else if (f->sym->ts.u.cl->backend_decl == NULL) else if (f->sym->ts.u.cl->backend_decl == NULL)
gfc_create_string_length (f->sym); gfc_create_string_length (f->sym);
...@@ -2677,6 +2677,8 @@ create_function_arglist (gfc_symbol * sym) ...@@ -2677,6 +2677,8 @@ create_function_arglist (gfc_symbol * sym)
DECL_ARG_TYPE (tmp) = boolean_type_node; DECL_ARG_TYPE (tmp) = boolean_type_node;
TREE_READONLY (tmp) = 1; TREE_READONLY (tmp) = 1;
gfc_finish_decl (tmp); gfc_finish_decl (tmp);
hidden_typelist = TREE_CHAIN (hidden_typelist);
} }
/* For non-constant length array arguments, make sure they use /* For non-constant length array arguments, make sure they use
......
...@@ -3098,6 +3098,16 @@ gfc_get_function_type (gfc_symbol * sym, gfc_actual_arglist *actual_args) ...@@ -3098,6 +3098,16 @@ gfc_get_function_type (gfc_symbol * sym, gfc_actual_arglist *actual_args)
vec_safe_push (typelist, type); 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) if (!vec_safe_is_empty (typelist)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment