From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1534) id DAA9A385701F; Tue, 23 Mar 2021 14:46:07 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DAA9A385701F MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Tobias Burnus To: gcc-cvs@gcc.gnu.org Subject: [gcc r11-7788] Fortran: Fix func decl mismatch [PR93660] X-Act-Checkin: gcc X-Git-Author: Tobias Burnus X-Git-Refname: refs/heads/master X-Git-Oldrev: d7cea7ceff9a2be7436108030c598628c51fba0f X-Git-Newrev: 212f4988f37ccf788c8c72b1dc952980bc9be3b7 Message-Id: <20210323144607.DAA9A385701F@sourceware.org> Date: Tue, 23 Mar 2021 14:46:07 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Mar 2021 14:46:08 -0000 https://gcc.gnu.org/g:212f4988f37ccf788c8c72b1dc952980bc9be3b7 commit r11-7788-g212f4988f37ccf788c8c72b1dc952980bc9be3b7 Author: Tobias Burnus Date: Tue Mar 23 15:45:36 2021 +0100 Fortran: Fix func decl mismatch [PR93660] gcc/fortran/ChangeLog: PR fortran/93660 * trans-decl.c (build_function_decl): Add comment; increment hidden_typelist for caf_token/caf_offset. * trans-types.c (gfc_get_function_type): Add comment; add missing caf_token/caf_offset args. gcc/testsuite/ChangeLog: PR fortran/93660 * gfortran.dg/gomp/declare-simd-coarray-lib.f90: New test. Diff: --- gcc/fortran/trans-decl.c | 6 +++++- gcc/fortran/trans-types.c | 21 ++++++++++++++++++++- .../gfortran.dg/gomp/declare-simd-coarray-lib.f90 | 12 ++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 6a4ed9bbfdd..34a0d49bae7 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -2488,7 +2488,9 @@ build_function_decl (gfc_symbol * sym, bool global) } -/* Create the DECL_ARGUMENTS for a procedure. */ +/* Create the DECL_ARGUMENTS for a procedure. + NOTE: The arguments added here must match the argument type created by + gfc_get_function_type (). */ static void create_function_arglist (gfc_symbol * sym) @@ -2807,6 +2809,7 @@ create_function_arglist (gfc_symbol * sym) DECL_ARG_TYPE (token) = TREE_VALUE (typelist); TREE_READONLY (token) = 1; hidden_arglist = chainon (hidden_arglist, token); + hidden_typelist = TREE_CHAIN (hidden_typelist); gfc_finish_decl (token); offset = build_decl (input_location, PARM_DECL, @@ -2832,6 +2835,7 @@ create_function_arglist (gfc_symbol * sym) DECL_ARG_TYPE (offset) = TREE_VALUE (typelist); TREE_READONLY (offset) = 1; hidden_arglist = chainon (hidden_arglist, offset); + hidden_typelist = TREE_CHAIN (hidden_typelist); gfc_finish_decl (offset); } diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index ccdc4687c39..bc7aac1f3d9 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -3011,6 +3011,10 @@ create_fn_spec (gfc_symbol *sym, tree fntype) return build_type_attribute_variant (fntype, tmp); } + +/* NOTE: The returned function type must match the argument list created by + create_function_arglist. */ + tree gfc_get_function_type (gfc_symbol * sym, gfc_actual_arglist *actual_args, const char *fnspec) @@ -3119,10 +3123,11 @@ gfc_get_function_type (gfc_symbol * sym, gfc_actual_arglist *actual_args, } } - /* Add hidden string length parameters. */ + /* Add hidden arguments. */ for (f = gfc_sym_get_dummy_args (sym); f; f = f->next) { arg = f->sym; + /* Add hidden string length parameters. */ if (arg && arg->ts.type == BT_CHARACTER && !sym->attr.is_bind_c) { if (!arg->ts.deferred) @@ -3145,6 +3150,20 @@ gfc_get_function_type (gfc_symbol * sym, gfc_actual_arglist *actual_args, && arg->ts.type != BT_CLASS && !gfc_bt_struct (arg->ts.type)) vec_safe_push (typelist, boolean_type_node); + /* Coarrays which are descriptorless or assumed-shape pass with + -fcoarray=lib the token and the offset as hidden arguments. */ + else if (arg + && flag_coarray == GFC_FCOARRAY_LIB + && ((arg->ts.type != BT_CLASS + && arg->attr.codimension + && !arg->attr.allocatable) + || (arg->ts.type == BT_CLASS + && CLASS_DATA (arg)->attr.codimension + && !CLASS_DATA (arg)->attr.allocatable))) + { + vec_safe_push (typelist, pvoid_type_node); /* caf_token. */ + vec_safe_push (typelist, gfc_array_index_type); /* caf_offset. */ + } } if (!vec_safe_is_empty (typelist) diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-simd-coarray-lib.f90 b/gcc/testsuite/gfortran.dg/gomp/declare-simd-coarray-lib.f90 new file mode 100644 index 00000000000..1f74da76ffe --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/declare-simd-coarray-lib.f90 @@ -0,0 +1,12 @@ +! { dg-additional-options "-fcoarray=lib" } +! +! PR fortran/93660 +! +! Failed as TREE_TYPE(fndecl) did not include the +! hidden caf_token/caf_offset arguments. +! +integer function f(x) + integer :: x[*] + !$omp declare simd + f = x[1] +end