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 7174B385782B; Mon, 8 Feb 2021 17:50:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7174B385782B 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: FL+qHwL9MwD2vBitlmFVdol4xKrcTMm6ihjLIfaw+OoUnIljdHRbGOxlZUysQBDuoq23XshlQN aMcooKpBYlpicho4uynLJ5c7AyrIfQDdt45Dv8w+Isy/btM/aEHdrevJo/lRMVakFUmu2gJHxb CanpWD4pUwWTgXxIpYuMEWLnh1+UOfooaz+kEmUFhrPIum2rdBG57v4zqlY3+G4ZLVExbZ+1DX VwJilS4fDZv4wfbl10HtlWOthNOlFeWDugVlsMo5Uac5I9ioiekMZ/qW4rbeNArDB7i+xeDiqN W0U= X-IronPort-AV: E=Sophos;i="5.81,162,1610438400"; d="diff'?scan'208";a="60187609" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa1.mentor.iphmx.com with ESMTP; 08 Feb 2021 09:50:32 -0800 IronPort-SDR: VjPnzSWx+nkCmaKVhIM/hTPpOUSAOUa4wAZ08WiPBXqhb4Z8DDDaGaooK3lHPb0brikAdqnkma BNgxiwCVykYuazBv0h5VfCDUHFVudYbtO+0iYOoEG1U+HrNeZ1rvW1VRTLSA7IK+0QmSa0SS/r oBFcuIC+k2pzWBZoxVLPJhJojuDPGbHxpuLZ9jTjL4+D+3JS6as7FP7oWCVt4sBvbA1GJPeKTl yBR/Vwy25jOkG2cNqA0+GSCXQqm2ylpfJ4GxhObx0g+x3MbaxUwPR+yx8GEpp07OUDdwyM9BG5 Zas= To: gcc-patches , fortran , Jakub Jelinek , Thomas Schwinge From: Tobias Burnus Subject: [Patch] Fortran: %re/%im fixes for OpenMP/OpenACC + gfc_is_simplify_contiguous Message-ID: Date: Mon, 8 Feb 2021 18:50:25 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------1563E87B705C05F75F313ADC" Content-Language: en-US X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: SVR-IES-MBX-04.mgc.mentorg.com (139.181.222.4) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) X-Spam-Status: No, score=-12.2 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: Mon, 08 Feb 2021 17:50:35 -0000 --------------1563E87B705C05F75F313ADC Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: quoted-printable Found when looking at Julian's 3/4 OpenACC patch, which has not yet been committed (and needs still to be revised a bit.) The fix (a) avoids an ICE when Julian's patch has been applied. The patch (b) just makes one error message less confusing. The testcase shows that only %re/%im run reach the new code as %kind/%len are !=3D EXPR_VARIABLE. (The error message is slightly misleading if the 'list item'/'var' is not a variable.) (a) We need to handle REF_INQUIRY gfc_is_simplify_contiguous. That function is used for 'is_contiguous(a(:)%re)', but it works without this patch and simplifies already to .false. And it is used in openmp.c, which can ICE without this patch. (b) Just makes the error message nicer - as only EXPR_VARIABLE reaches that code, only %re and %im are mentioned in the error message. (Actually, it is not completely clear whether %re/%im are invalid or not; I think they should be =E2=80=93 but one can argue otherwise. For OpenMP I just saw that it is tacked internally in Issue 2661, for OpenACC it is tracked as Issue 346 =E2=80=93 but neither has been discussed, yet.) OK for mainline? Tobias PS: '%re'/'%im' permit accessing the real/imaginary part of a complex variable as lvalue (in the C++ sense) and also permit "var(:)%re =3D 1.0", which real(z) or imag(z) does not permit. var%kind =3D=3D kind(var), but derived types also permit parameterized derived types (PDT), which can use '%foo' for respective 'len' and 'kind' components. ----------------- 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 --------------1563E87B705C05F75F313ADC Content-Type: text/x-patch; charset="UTF-8"; name="cmplx-omp-oacc-v2.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cmplx-omp-oacc-v2.diff" Fortran: %re/%im fixes for OpenMP/OpenACC + gfc_is_simplify_contiguous gcc/fortran/ChangeLog: * expr.c (gfc_is_simplify_contiguous): Handle REF_INQUIRY, i.e. %im and %re which are EXPR_VARIABLE. * openmp.c (resolve_omp_clauses): Diagnose %re/%im explicitly. gcc/testsuite/ChangeLog: * gfortran.dg/goacc-gomp/ref_inquiry.f90: New test. gcc/fortran/expr.c | 2 ++ gcc/fortran/openmp.c | 8 +++++ .../gfortran.dg/goacc-gomp/ref_inquiry.f90 | 42 ++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 4f456fc629a..92a6700568d 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -5854,6 +5854,8 @@ gfc_is_simply_contiguous (gfc_expr *expr, bool strict, bool permit_element) part_ref = ref; else if (ref->type == REF_SUBSTRING) return false; + else if (ref->type == REF_INQUIRY) + return false; else if (ref->u.ar.type != AR_ELEMENT) ar = &ref->u.ar; } diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 797f6c86b62..f0307c801a5 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -5219,6 +5219,14 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, && array_ref->next->type == REF_SUBSTRING))) gfc_error ("Unexpected substring reference in %s clause " "at %L", name, &n->where); + else if (array_ref && array_ref->type == REF_INQUIRY) + { + gcc_assert (array_ref->u.i == INQUIRY_RE + || array_ref->u.i == INQUIRY_IM); + gfc_error ("Unexpected complex-parts designator " + "reference in %s clause at %L", + name, &n->where); + } else if (!resolved || n->expr->expr_type != EXPR_VARIABLE || array_ref->next diff --git a/gcc/testsuite/gfortran.dg/goacc-gomp/ref_inquiry.f90 b/gcc/testsuite/gfortran.dg/goacc-gomp/ref_inquiry.f90 new file mode 100644 index 00000000000..f92a6632af9 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc-gomp/ref_inquiry.f90 @@ -0,0 +1,42 @@ +implicit none +type t + integer :: i + character :: c + complex :: z +end type t + +integer :: i +character(kind=4, len=5) :: c +complex :: z, zz(5) +type(t) :: x + +print *, is_contiguous(zz(:)%re) + +! EXPR_VARIABLE / Cf. also OpenMP spec issue 2661 +!$omp target enter data map(to: z%re) ! { dg-error "Unexpected complex-parts designator" } +!$omp target enter data map(to: z%im) ! { dg-error "Unexpected complex-parts designator" } +!$omp target enter data map(to: x%z%re) ! { dg-error "Unexpected complex-parts designator" } +!$omp target enter data map(to: x%z%im) ! { dg-error "Unexpected complex-parts designator" } + +! Fails differently as it is not a variable (EXPR_VARIABLE) +!$omp target enter data map(to: i%kind, c%len) ! { dg-error "not a proper array section" } +!$omp target enter data map(to: x%i%kind, x%c%len) ! { dg-error "not a proper array section" } + +! Likewise for OpenACC +!$acc enter data copyin(i%kind, c%len) ! { dg-error "not a proper array section" } +!$acc enter data copyin(x%i%kind) ! { dg-error "not a proper array section" } +!$acc enter data copyin(x%c%len) ! { dg-error "not a proper array section" } +!$acc update self(i%kind, c%len) ! { dg-error "not a proper array section" } +!$acc update self(x%i%kind) ! { dg-error "not a proper array section" } +!$acc update self(x%c%len) ! { dg-error "not a proper array section" } + +! EXPR_VARIABLE / cf. OpenACC spec issue 346 +!$acc enter data copyin(z%re) ! { dg-error "Unexpected complex-parts designator" } +!$acc enter data copyin(z%im) ! { dg-error "Unexpected complex-parts designator" } +!$acc enter data copyin(x%z%re) ! { dg-error "Unexpected complex-parts designator" } +!$acc enter data copyin(x%z%im) ! { dg-error "Unexpected complex-parts designator" } +!$acc update self(z%re) ! { dg-error "Unexpected complex-parts designator" } +!$acc update self(z%im) ! { dg-error "Unexpected complex-parts designator" } +!$acc update self(zz%re) +!$acc update self(zz%im) +end --------------1563E87B705C05F75F313ADC--