From patchwork Fri Feb 4 11:39:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tobias Burnus X-Patchwork-Id: 1588383 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+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (ip-8-43-85-97.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 bilbo.ozlabs.org (Postfix) with ESMTPS id 4JqtrT5SNQz9s8s for ; Fri, 4 Feb 2022 22:40:24 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7B4243858417 for ; Fri, 4 Feb 2022 11:40:20 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from esa2.mentor.iphmx.com (esa2.mentor.iphmx.com [68.232.141.98]) by sourceware.org (Postfix) with ESMTPS id 140E63858D20; Fri, 4 Feb 2022 11:39:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 140E63858D20 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com IronPort-SDR: Suc40guF0WX9D4+G6FbZC/O/YttVSzTNOgvhoTXpvX7fu8FaCpo1Bmg4hsByqJDcmNjLEB4A99 dhg+0OuLjxUsqZtnzCEv5GZy71CGkrXkIVjyiNYxvHU8IutZK/GsYcx2A69g/23sQAK450BZau VCWaFUu9LI8f2xOAZjTe/kun3qgdw3SqNs/2b/Kavx7uu71LZLRpjeac8Crc4HbRqzfc7Np8MT Fp64BuyTs5oEY944K9K3m1DpQyonLNYACyu3E0AfKTPSYrbXFTzoUIQdsA1BBjqHZWGPXAQvfU 7RmXdV0rJInx8dEWv0C6elz4 X-IronPort-AV: E=Sophos;i="5.88,342,1635235200"; d="diff'?scan'208";a="71606471" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa2.mentor.iphmx.com with ESMTP; 04 Feb 2022 03:39:59 -0800 IronPort-SDR: KD/xPvrM/excEiXzywt2w6NMaGg9Od1Vsai1XMntwJSxwx9PUX33BHG2IPS57kh5+9c5IsC2Kx MHU5X5VghBHotRf7IEnc6WiNkMj9d1XfPIju7gEclRwJV7g2J50yEtqQ0PphBmeFJ/aj2cavSl QjDQw22zav3rWmzEaX5vHjgvGRRVTOJSHz3jk4yaQuRaM1n2T4J4XPbgFY2rjcYi6pKyq2YRE+ z3W+jZL0twEjCqdUfDxjsx3vk2WMxGjFWSTbwz8uJX4XolIt7DQcrk0N5dzZlJNb4UyQc6X13C pM8= Message-ID: <21a15d76-bc78-5cfc-bdf1-9839e3dcedf0@codesourcery.com> Date: Fri, 4 Feb 2022 12:39:53 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.1 Content-Language: en-US To: gcc-patches , fortran From: Tobias Burnus Subject: [Patch] Fortran/OpenMP: Avoid ICE for invalid char array in omp atomic [PR104329] X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Already during parsing, the allocatable character array assignment x = (x) is converted to two gfc_codes with EXEC_ASSIGN, namely: ASSIGN z1:_F.DA0(FULL) (parens z1:x(FULL)) ASSIGN z1:x(FULL) z1:_F.DA0(FULL) But the current code expects only one gfc_code - as parse.c does some checks, that's unexpected for resolution and currently is checked with an gcc_assert. Solution: I now defer the gfc_assert until after diagnosing the arguments. OK for mainline (only affected version)? Tobias ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955 Fortran/OpenMP: Avoid ICE for invalid char array in omp atomic [PR104329] PR fortran/104329 gcc/fortran/ChangeLog: * openmp.cc (resolve_omp_atomic): Defer extra-code assert after other diagnostics. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/atomic-28.f90: New test. gcc/fortran/openmp.cc | 11 ++++++++--- gcc/testsuite/gfortran.dg/gomp/atomic-28.f90 | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc index 38c67e1f640..b1c065d9e8b 100644 --- a/gcc/fortran/openmp.cc +++ b/gcc/fortran/openmp.cc @@ -7687,7 +7687,7 @@ resolve_omp_atomic (gfc_code *code) gfc_omp_atomic_op aop = (gfc_omp_atomic_op) (atomic_code->ext.omp_clauses->atomic_op & GFC_OMP_ATOMIC_MASK); - gfc_code *stmt = NULL, *capture_stmt = NULL; + gfc_code *stmt = NULL, *capture_stmt = NULL, *tailing_stmt = NULL; gfc_expr *comp_cond = NULL; locus *loc = NULL; @@ -7825,7 +7825,8 @@ resolve_omp_atomic (gfc_code *code) stmt = code; capture_stmt = code->next; } - gcc_assert (!code->next->next); + /* Shall be NULL but can happen for invalid code. */ + tailing_stmt = code->next->next; } else { @@ -7833,7 +7834,8 @@ resolve_omp_atomic (gfc_code *code) stmt = code; if (!atomic_code->ext.omp_clauses->compare && stmt->op != EXEC_ASSIGN) goto unexpected; - gcc_assert (!code->next); + /* Shall be NULL but can happen for invalid code. */ + tailing_stmt = code->next; } if (comp_cond) @@ -7886,6 +7888,9 @@ resolve_omp_atomic (gfc_code *code) return; } + /* Should be diagnosed above already. */ + gcc_assert (tailing_stmt == NULL); + var = stmt->expr1->symtree->n.sym; stmt_expr2 = is_conversion (stmt->expr2, true, true); if (stmt_expr2 == NULL) diff --git a/gcc/testsuite/gfortran.dg/gomp/atomic-28.f90 b/gcc/testsuite/gfortran.dg/gomp/atomic-28.f90 new file mode 100644 index 00000000000..91e29c96d45 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/atomic-28.f90 @@ -0,0 +1,28 @@ +! { dg-do compile } +! +! PR fortran/104329 +! +! Contributed by G. Steinmetz +! +subroutine z1 + character(:), allocatable :: x(:) + x = ['123'] + !$omp atomic update + x = (x) ! { dg-error "OMP ATOMIC statement must set a scalar variable of intrinsic type" } +end + +subroutine z2 + character(:), allocatable :: x(:) + x = ['123'] + !$omp atomic update + x = 'a' // x // 'e' ! { dg-error "OMP ATOMIC statement must set a scalar variable of intrinsic type" } +end + + +subroutine z3 + character(:), allocatable :: x(:) + x = ['123'] + !$omp atomic capture + x = 'a' // x // 'e' ! { dg-error "OMP ATOMIC statement must set a scalar variable of intrinsic type" } + x = x +end