From patchwork Fri Oct 20 14:02:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Paul-Antoine Arras X-Patchwork-Id: 156120 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2010:b0:403:3b70:6f57 with SMTP id fe16csp1077821vqb; Fri, 20 Oct 2023 07:03:17 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE2TCX9IeEXnR1jkFc3ydqbAGJIdERpLEjlqyUBx2ezHz8RTYgfy9VnC7OMS+DgB7WrpI3i X-Received: by 2002:ac8:5c91:0:b0:418:1a99:3918 with SMTP id r17-20020ac85c91000000b004181a993918mr2083716qta.6.1697810597615; Fri, 20 Oct 2023 07:03:17 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1697810597; cv=pass; d=google.com; s=arc-20160816; b=eFGWvXDKGGlu3bEq1o9C9QBdTksBIjBWPBCcbiSaPyltDc0UNM6oTlLPDGNwy8BjZK OL+lQfjj+R6D0zVZLXfS2mvrIgHgvbPczzB+8RpCsev4lov1C0bo4XTU7DpB9Tz1L04h B8RwDU6LykivM60OwgyUMUyirE67kuBToj9rJyrKOav3mIJPaWUUMNysWvwlMdV5icSa p3iZk9NBY4RzdyStKgNVit8L9Kp41o/LuWx6TWteclsOFSgpPEisnwZmuA6teFJo8E20 qk/Sti/ZDLP9fHbSXyG7rk2CqBeH5BDZvY/n58PnufHcdU9PNEWDVSTndCAQrHAI23LL AgOQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:from:to :content-language:user-agent:mime-version:date:message-id :ironport-sdr:arc-filter:dmarc-filter:delivered-to; bh=3Amkc/j5f8VcpNrM8EehpguWXUhKfxJffX9w11HORvo=; fh=+kMYnEvGu04CJM5KQB6bTAnuczepCfp47JciDzTPE3E=; b=SrAC7yYxR1gLP38Dtl42Ignm8Mjb6nwfBW3PUn60dF89IaJ9OMe0VIrYU0Xz3ShfmZ SbfmRNTQFuvUS2rA3ws1GMSfFMcL+2+ETviMYIddFWfe96fhK2TaaHVUQnQ9PAyanZuz dlY69azRoZlxkLQNz7PEckQLxnyl+M9Hfmo4ho8EuQeJIVcrcIg4tF4AZfUjQ5VjD8uK jcYwtSMvjtXLy+3YJsOhNGJK/0SYqeadVkJVJHE6nUlTNAutHl7exGHvVUp2TMxaKQ8B WSYECBWpk7ksvC0liTtboE+t5N81DMqN5nZv6abVyV/4Q7/qTRLnHlFYb9ndo59OfPuh BzNA== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id q6-20020a05622a04c600b004181075e931si1283548qtx.154.2023.10.20.07.03.17 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Oct 2023 07:03:17 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C0DD8385783F for ; Fri, 20 Oct 2023 14:03:12 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from esa3.mentor.iphmx.com (esa3.mentor.iphmx.com [68.232.137.180]) by sourceware.org (Postfix) with ESMTPS id 55C983857C66; Fri, 20 Oct 2023 14:02:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 55C983857C66 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 55C983857C66 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=68.232.137.180 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697810567; cv=none; b=Ty2rUit3q27OG0H06iHc1Dh518B/pJ7JmO1wiY4gPyQOdmdMAmeuDFuU07n2SZF9G12BhJ29eTXq0sp6D38r6mKGa9wADkOcLb4cnfATEIfSdtw7n1s2ZC9myr6BNIzOzlrX6HTay8rPH3yH16PwsNTpsB6O1zmj5J2p69Cyhgo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697810567; c=relaxed/simple; bh=7MvVGjg3rpBnVRU86IyOTrUJItBft+ASGU/VuZ8bPUE=; h=Message-ID:Date:MIME-Version:To:From:Subject; b=rMQvWVUXv3Yl/M7S0Hb9De6EjYPs7WewI3p8KR5zQIZsQ1Fx7N87bvcLdslkInIjblo3yGHSnWfD0j8Xb20FDXR5B703kE6ytG2BFxX9HHxsPsR7oAh6J6P1aYoZIpZJ9HNt511gZaTEqTmorgxNS6+yACgPZei/TV+60KZWiAM= ARC-Authentication-Results: i=1; server2.sourceware.org X-CSE-ConnectionGUID: aV5F1YVFTpaVHZNFqpHhmA== X-CSE-MsgGUID: naa7PE+XT0edJodKIsQ9lg== X-IronPort-AV: E=Sophos;i="6.03,239,1694764800"; d="scan'208,223";a="20242193" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 20 Oct 2023 06:02:44 -0800 IronPort-SDR: ZMYpaqJaRp7GcEYg1yBRCm7O0rp4FZWFiyFGDQYkfRIXOp0jzXEBpxp9KOlDzIFZfzWsVTqc8W hBqY2Px3tcEmxPMmr1n20awCD4A/ukmnwViaDiqke9q/gjECkqdBHMhZhDis6ZAtQtd9j3bYK+ pbldlPRCc/KmACVBrPOSE5EIs5snebW84DDfQWrUOd1+byUUXLtkNEpneIua+EcxZDqLFtDuiZ 9nDNhPrUXMRTWVd7zgeT61Zv+sBQicYwrnDJ33FMSsJ8on8VTDxc2dXsdTP3LHz9rv0DXE36BU pwk= Message-ID: <6fc6a877-2dc7-4551-b141-fd117c66ecfa@codesourcery.com> Date: Fri, 20 Oct 2023 16:02:39 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-GB, fr To: , From: Paul-Antoine Arras Subject: [PATCH] Fortran: Fix incompatible types between INTEGER(8) and TYPE(c_ptr) X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) To svr-ies-mbx-13.mgc.mentorg.com (139.181.222.13) X-Spam-Status: No, score=-12.0 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.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1780283445465605550 X-GMAIL-MSGID: 1780283445465605550 Hi all, The attached patch fixes a bug that causes valid OpenMP declare variant directive and functions to be rejected with the following error (see testcase): c_ptr.f90:41:37: 41 | !$omp declare variant(foo_variant) & | 1 Error: variant ‘foo_variant’ and base ‘foo’ at (1) have incompatible types: Type mismatch in argument 'c_bv' (INTEGER(8)/TYPE(c_ptr)) The fix consists in special-casing this situation in gfc_compare_types(). OK for mainline? Thanks, From 8e5fa4828678a1388e75795de2a1f253d9f0ec95 Mon Sep 17 00:00:00 2001 From: Paul-Antoine Arras Date: Fri, 20 Oct 2023 12:42:49 +0200 Subject: [PATCH] Fortran: Fix incompatible types between INTEGER(8) and TYPE(c_ptr) In the context of an OpenMP declare variant directive, arguments of type C_PTR are sometimes recognised as C_PTR in the base function and as INTEGER(8) in the variant - or the other way around, depending on the parsing order. This patch prevents such situation from turning into a compile error. 2023-10-20 Paul-Antoine Arras Tobias Burnus gcc/fortran/ChangeLog: * interface.cc (gfc_compare_types): Return true in this situation. gcc/testsuite/ChangeLog: * gfortran.dg/c_ptr_tests_20.f90: New test. --- gcc/fortran/ChangeLog.omp | 5 ++ gcc/fortran/interface.cc | 17 +++--- gcc/testsuite/ChangeLog.omp | 4 ++ gcc/testsuite/gfortran.dg/c_ptr_tests_20.f90 | 56 ++++++++++++++++++++ 4 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/c_ptr_tests_20.f90 diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp index 62a33475ee5..299223ceaa7 100644 --- a/gcc/fortran/ChangeLog.omp +++ b/gcc/fortran/ChangeLog.omp @@ -1,3 +1,8 @@ +2023-10-20 Paul-Antoine Arras + Tobias Burnus + + * interface.cc (gfc_compare_types): Return true in this situation. + 2023-09-19 Tobias Burnus Backported from master: diff --git a/gcc/fortran/interface.cc b/gcc/fortran/interface.cc index e9843e9549c..8bd35fd6d22 100644 --- a/gcc/fortran/interface.cc +++ b/gcc/fortran/interface.cc @@ -705,12 +705,17 @@ gfc_compare_types (gfc_typespec *ts1, gfc_typespec *ts2) /* Special case for our C interop types. FIXME: There should be a better way of doing this. When ISO C binding is cleared up, - this can probably be removed. See PR 57048. */ - - if (((ts1->type == BT_INTEGER && ts2->type == BT_DERIVED) - || (ts1->type == BT_DERIVED && ts2->type == BT_INTEGER)) - && ts1->u.derived && ts2->u.derived - && ts1->u.derived == ts2->u.derived) + this can probably be removed. See PR 57048. + Note that this does not distinguish between c_ptr and c_funptr. */ + + if ((ts1->type == BT_INTEGER && ts2->type == BT_DERIVED + && ts1->f90_type == BT_VOID + && ts2->u.derived->ts.is_iso_c + && ts2->u.derived->ts.u.derived->ts.f90_type == BT_VOID) + || (ts2->type == BT_INTEGER && ts1->type == BT_DERIVED + && ts2->f90_type == BT_VOID + && ts1->u.derived->ts.is_iso_c + && ts1->u.derived->ts.u.derived->ts.f90_type == BT_VOID)) return true; /* The _data component is not always present, therefore check for its diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp index e9f4d1c63e6..1fc9b0606dc 100644 --- a/gcc/testsuite/ChangeLog.omp +++ b/gcc/testsuite/ChangeLog.omp @@ -1,3 +1,7 @@ +2023-10-20 Paul-Antoine Arras + + * gfortran.dg/c_ptr_tests_20.f90: New test. + 2023-09-20 Tobias Burnus Backported from master: diff --git a/gcc/testsuite/gfortran.dg/c_ptr_tests_20.f90 b/gcc/testsuite/gfortran.dg/c_ptr_tests_20.f90 new file mode 100644 index 00000000000..777181cece0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/c_ptr_tests_20.f90 @@ -0,0 +1,56 @@ +! { dg-do compile } +! +! This failed to compile the declare variant directive due to the C_PTR +! arguments to foo being recognised as INTEGER(8) + +program adjust_args + use iso_c_binding, only: c_loc + implicit none + + integer, parameter :: N = 1024 + real, allocatable, target :: av(:), bv(:), cv(:) + + call foo(c_loc(bv), c_loc(av), N) + + !$omp target data map(to: av(:N)) map(from: cv(:N)) + !$omp parallel + call foo(c_loc(cv), c_loc(av), N) + !$omp end parallel + !$omp end target data + +contains + subroutine foo_variant(c_d_bv, c_d_av, n) + use iso_c_binding, only: c_ptr, c_f_pointer + type(c_ptr), intent(in) :: c_d_bv, c_d_av + integer, intent(in) :: n + real, pointer :: f_d_bv(:) + real, pointer :: f_d_av(:) + integer :: i + + call c_f_pointer(c_d_bv, f_d_bv, [n]) + call c_f_pointer(c_d_av, f_d_av, [n]) + !$omp target teams loop is_device_ptr(f_d_bv, f_d_av) + do i = 1, n + f_d_bv(i) = f_d_av(i) * i + end do + end subroutine + + + subroutine foo(c_bv, c_av, n) + use iso_c_binding, only: c_ptr, c_f_pointer + type(c_ptr), intent(in) :: c_bv, c_av + integer, intent(in) :: n + real, pointer :: f_bv(:) + real, pointer :: f_av(:) + integer :: i + !$omp declare variant(foo_variant) & + !$omp match(construct={parallel}) + + call c_f_pointer(c_bv, f_bv, [n]) + call c_f_pointer(c_av, f_av, [n]) + !$omp parallel loop + do i = 1, n + f_bv(i) = f_av(i) * i + end do + end subroutine +end program -- 2.42.0