From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa1.mentor.iphmx.com (esa1.mentor.iphmx.com [68.232.129.153]) by sourceware.org (Postfix) with ESMTPS id 68354384640D; Thu, 11 Mar 2021 17:16:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 68354384640D Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=Tobias_Burnus@mentor.com IronPort-SDR: 7ovYk8ZjSH7f6aB11QYNFGi9ItJChz/WbFyDXKuwKevLd96g3nUQ/qLpEwcjoH2kXhj7t1B+Sv q3ERUsaiU5d7hbNO+6UvxdCmAg/jNSXjyFPN7OqOiBPK7Tot7Ul9IxTkKuO1TFR8TSBxowpgR3 TWsshcDMfBe05r/8ELd9a2rdZKL03jYLIWtB0XFShEfsdIoUZEvLQRVQ04L0saxV6UFByPl6Af jisYDBPocsoF2QbB/HuMkgtelmI3GBqEQ4RLD592c4ZdnvOMuUoxBTXIpAg1gl2Xrt7QEnKz87 gss= X-IronPort-AV: E=Sophos;i="5.81,241,1610438400"; d="diff'?scan'208";a="61333014" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa1.mentor.iphmx.com with ESMTP; 11 Mar 2021 09:16:01 -0800 IronPort-SDR: BwBpt3hG17H76fopoAhjDcEJ9dcs3/02OMGP/5ur7FTMJDvgxduPqaeRqmZ5UTb7Voq6XgwA4N 4Z6JpR64ahpVmTuawb7svU3Q4A93nmCnw47onD5Hjy8A+Y3DC2ar09clD33bH5KsJjzZ7PHi1R Go4/ELxaUBgQ5jvC7uZvaD32uG0SO2Sh/vp9vrel2klRICyLj/4b2j8YKmPFmuomDA504UQvoB 4PRfqyRmwjZFIO8+ABrM8QnMG0zE+UqkUVVtXVDbOUqesDTnN7cGf266JmV8GjEQS70gzedRod yc4= To: gcc-patches , fortran From: Tobias Burnus Subject: [Patch] Fortran: Fix func decl mismatch [PR93660] Message-ID: <9d10ed6a-958c-aa97-5172-9d427a8b2b5b@codesourcery.com> Date: Thu, 11 Mar 2021 18:15:42 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------388AA8D9C01974B6AC3D45EB" Content-Language: en-US X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-05.mgc.mentorg.com (139.181.222.5) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: fortran@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Fortran mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 11 Mar 2021 17:16:05 -0000 --------------388AA8D9C01974B6AC3D45EB Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: quoted-printable This fixes an ICE with OpenMP 'omp decare simd' but is a generic bug. Namely TREE_TYPE(fndecl) has a mismatch to the arglist chain, missing some hidden arguments with -fcoarray=3Dlib. OK for mainline and GCC 10? Tobias ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 M=C3=BCnchen R= egistergericht M=C3=BCnchen HRB 106955, Gesch=C3=A4ftsf=C3=BChrer: Thomas H= eurung, Frank Th=C3=BCrauf --------------388AA8D9C01974B6AC3D45EB Content-Type: text/x-patch; charset="UTF-8"; name="fndecl.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="fndecl.diff" 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. 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 --------------388AA8D9C01974B6AC3D45EB--