From patchwork Thu Feb 4 11:24:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tobias Burnus X-Patchwork-Id: 1435961 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DWbmW4YNrz9sXh for ; Thu, 4 Feb 2021 22:24:25 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0AADA3835424; Thu, 4 Feb 2021 11:24:21 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id CD83E3857C7B; Thu, 4 Feb 2021 11:24:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org CD83E3857C7B 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: rsz0lPtN8zSvM47S4UGkRtoyie/lRomiXUazNDvi/M2TFBe7ZX6aW+nQJLmXuQOkYeyKU9Moji K/Cw83XDfSNar1zIdfpcAg3oQNMDKfO20A8yDSAdbXvl8MSkgO/NnLNN4Mj7g71UdInjiGL9Y9 PT2O4C6rEmCflRKrkykGwy5zX8WIuMjJGSzczLjUKVB7QnyjqXUVjyjJkjV+ibrMYyxLU46bCh 7jqPqw7SJMzXdTid0Fqmt7J3OkTEUQ3WLXdDb9HKBk0nt3hZpIUPskGJMxj1PCA9lQ6X6rY1n4 CeU= X-IronPort-AV: E=Sophos;i="5.79,400,1602576000"; d="diff'?scan'208";a="57913724" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa4.mentor.iphmx.com with ESMTP; 04 Feb 2021 03:24:16 -0800 IronPort-SDR: a1FQKTr2QqHs/5pXgRXnCuWwRKTKgtqDwnN3B5eM8XqNwS12r1miRrLHjORNycbcMrsOVDk6Mf Fc3cN+3jIAEZcOGlkINubvFU70hME41+ArwZYEg+J98izZfuyfvot89jDibq/Aj/eS6AEWCYPp wSeK8WHwax8bgzidiG67sEVtYx4cgEiAC9obYDrZ1eeXC0yZv2XRNctLbdmDGE7Yqc5W17UGt5 GvMDXUC+b0DTRKl+sA+lnwoSUApwxQ2h94ZhxFlpWfF3U8oAxLNyC42OF2QIDL3A7jVXhxzjwV NUc= To: gcc-patches , fortran , Jakub Jelinek , Thomas Schwinge From: Tobias Burnus Subject: [Patch] Fortran: OpenMP/OpenACC diagnose substring rejections better Message-ID: Date: Thu, 4 Feb 2021 12:24:10 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.0 MIME-Version: 1.0 Content-Language: en-US X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: SVR-IES-MBX-08.mgc.mentorg.com (139.181.222.8) 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: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" This issue came up when looking at Julian's OpenACC patches and by coincidence it was also discussed for OpenMP yesterday (lang-spec F2F meeting; Issue #2607). OpenACC rather explicitly lists what counts as 'var' and substrings do not appear there. While OpenMP is rather silent on this issue; I think between the lines it can be read that it is not permitted - and supporting it will run into many issues. (Hence, the agreement that it should not be allowed; wording changes still need to be voted on, cf. Issue #2607). Without the patch, gfortran gives the Error: ‘str2’ in MAP clause at (1) is not a proper array section And with the patch Error: Unexpected substring reference in MAP clause at (1) Except, in one OpenMP case, it stops earlier and we get: Error: Syntax error in OpenMP variable list at (1) (see testcase) OK for mainline? Tobias ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf Fortran: OpenMP/OpenACC diagnose substring rejections better gcc/fortran/ChangeLog: * openmp.c (resolve_omp_clauses): Explicitly diagnose substrings as not permitted. gcc/testsuite/ChangeLog: * gfortran.dg/goacc/substring.f90: New test. * gfortran.dg/gomp/substring.f90: New test. gcc/fortran/openmp.c | 8 +++++++- gcc/testsuite/gfortran.dg/goacc/substring.f90 | 27 +++++++++++++++++++++++++++ gcc/testsuite/gfortran.dg/gomp/substring.f90 | 22 ++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 9a3a8f63b5e..aab17f0589f 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -5212,7 +5212,13 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, || (n->expr && (!resolved || n->expr->expr_type != EXPR_VARIABLE))) { - if (!resolved + if (array_ref + && (array_ref->type == REF_SUBSTRING + || (array_ref->next + && array_ref->next->type == REF_SUBSTRING))) + gfc_error ("Unexpected substring reference in %s clause " + "at %L", name, &n->where); + else if (!resolved || n->expr->expr_type != EXPR_VARIABLE || array_ref->next || array_ref->type != REF_ARRAY) diff --git a/gcc/testsuite/gfortran.dg/goacc/substring.f90 b/gcc/testsuite/gfortran.dg/goacc/substring.f90 new file mode 100644 index 00000000000..25031daddf3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/substring.f90 @@ -0,0 +1,27 @@ +implicit none +character(len=10) :: str1, str2(5,5) + +type t + character(len=10) :: str1, str2(5,5) +end type t +type(t) :: v + +!$acc enter data copyin(v%str1) ! OK +!$acc enter data copyin(v%str2) ! OK +!$acc enter data copyin(v%str2(1,2)) ! OK +!$acc enter data copyin(str1) ! OK +!$acc enter data copyin(str2) ! OK +!$acc enter data copyin(str2(1,2)) ! OK + +!$acc enter data copyin(v%str1(2:5)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc enter data copyin(v%str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc enter data copyin(str1(2:5)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc enter data copyin(str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } + +!$acc parallel +!$acc update host(v%str1(2:5)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc update host(v%str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc update host(str1(2:5)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc update host(str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$acc end parallel +end diff --git a/gcc/testsuite/gfortran.dg/gomp/substring.f90 b/gcc/testsuite/gfortran.dg/gomp/substring.f90 new file mode 100644 index 00000000000..23d7fb7e48a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/substring.f90 @@ -0,0 +1,22 @@ +implicit none +character(len=10) :: str1, str2(5,5) + +type t + character(len=10) :: str1, str2(5,5) +end type t +type(t) :: v + +!$omp target enter data map(to: str1) ! OK +!$omp target enter data map(to: str2) ! OK +!$omp target enter data map(to: str2(2,5)) ! OK + +!$omp target enter data map(to: str1(2,5)) ! { dg-error "Syntax error in OpenMP variable list" } +!$omp target enter data map(to: str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } + +!$omp target enter data map(to: v%str1) ! OK +!$omp target enter data map(to: v%str2) ! OK +!$omp target enter data map(to: v%str2(1,2)) ! OK + +!$omp target enter data map(to: v%str1(2:5)) ! { dg-error "Unexpected substring reference in MAP clause" } +!$omp target enter data map(to: v%str2(1,2)(2:4)) ! { dg-error "Unexpected substring reference in MAP clause" } +end