From add31061ec23e07fdf749dc335308efc81151a3d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 1 Feb 2020 10:02:20 +0100 Subject: [PATCH] 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 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. --- 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 + + 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 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) -- 2.30.2