From patchwork Fri Feb 19 12:59:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tobias Burnus X-Patchwork-Id: 1442142 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=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (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 4Dhs9N3qtsz9sVF for ; Fri, 19 Feb 2021 23:59:33 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6774738708BF; Fri, 19 Feb 2021 12:59:30 +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 B34A4385481F for ; Fri, 19 Feb 2021 12:59:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org B34A4385481F 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: B4kaUO/LS+XAAB1u+YaeVwxb9/slpw//1NRQ2vxSV7B0p0D3s9Pvr+OzQfaOGBvVaJx+Y8cU6o GjA1YNkB3Dk37KPDUXh/yA8BuKczAmc6EBKg+uZL7qqBTN70FGV9ANPv9WQHqemF0QuDKmjLBv 1LUNA7p3gLyjV0MYhq/gPa8LT9Ui4E+DdFH6grwuO6Px6EFZYddX7QGTXFOEtoSyTyTgLcneuR M+We7VUv/CAUJFbyTYTURNGzFla24hIOQOcU658Q8GqbGRqNdjVQgT/WzhMM55/IdLgZvpRpE8 NGQ= X-IronPort-AV: E=Sophos;i="5.81,189,1610438400"; d="diff'?scan'208";a="58423844" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa4.mentor.iphmx.com with ESMTP; 19 Feb 2021 04:59:26 -0800 IronPort-SDR: 7OjzYnOABqGuqs1Gai52aPlq08K7i9h6Yd5t0eWoc/TNy9kJCBktCOo7K+fkAEew1C3f8X4ky8 LM72ZuYFHl71WLGMKEKXPLWLwnHP/7P6oJNp9GL/Ap1CPvdPE7F7u387S/AuhASQc8A9gnoogZ iGI+fVOgtnVg/K3y1vm7Gte41ZMuPmej/XxIIkbeg77uHuk4epdvTKywWYFj239rQWoz4VJBt7 TfOTXJkTNOQhnGvtq2iGhpjfKB19bLx8jRuLKoZuVoRfrctqjBIUsT37wH/l8lIqxhy3dS4ncM Ceg= To: gcc-patches , Thomas Schwinge From: Tobias Burnus Subject: [Patch] OpenACC: C/C++ - fix async parsing [PR99137] Message-ID: <79bda6c8-0b27-693c-2f01-539400546872@codesourcery.com> Date: Fri, 19 Feb 2021 13:59:20 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 Content-Language: en-US X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: SVR-IES-MBX-03.mgc.mentorg.com (139.181.222.3) 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: 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" For: #pragma acc parallel async(1,2) avoid with C an ICE for the original tree: #pragma acc parallel async(<<< Unknown tree: c_maybe_const_expr 1, 2 >>>) It did not ICE with C++, but I think the tree does not make sense, either: #pragma acc parallel async(<<< Unknown tree: void_cst >>>, 2) OK for mainline? (Not a regression; I don't know whether it makes sense to apply to other branches). Tobias ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf OpenACC: C/C++ - fix async parsing [PR99137] gcc/c/ChangeLog: PR c/99137 * c-parser.c (c_parser_oacc_clause_async): Reject comma expressions. gcc/cp/ChangeLog: PR c/99137 * parser.c (cp_parser_oacc_clause_async): Reject comma expressions. gcc/testsuite/ChangeLog: PR c/99137 * c-c++-common/goacc/asyncwait-1.c: Update dg-error. * c-c++-common/goacc/async-1.c: New test. gcc/c/c-parser.c | 2 +- gcc/cp/parser.c | 2 +- gcc/testsuite/c-c++-common/goacc/async-1.c | 7 +++++++ gcc/testsuite/c-c++-common/goacc/asyncwait-1.c | 16 ++++++++-------- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 2a49d07bab4..5cdeb21a458 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -14332,7 +14332,7 @@ c_parser_oacc_clause_async (c_parser *parser, tree list) { c_parser_consume_token (parser); - t = c_parser_expression (parser).value; + t = c_parser_expr_no_commas (parser, NULL).value; if (!INTEGRAL_TYPE_P (TREE_TYPE (t))) c_parser_error (parser, "expected integer expression"); else if (t == error_mark_node diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 70775792161..6a29b6dca10 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -37991,7 +37991,7 @@ cp_parser_oacc_clause_async (cp_parser *parser, tree list) matching_parens parens; parens.consume_open (parser); - t = cp_parser_expression (parser); + t = cp_parser_assignment_expression (parser); if (t == error_mark_node || !parens.require_close (parser)) cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true, diff --git a/gcc/testsuite/c-c++-common/goacc/async-1.c b/gcc/testsuite/c-c++-common/goacc/async-1.c new file mode 100644 index 00000000000..a578dabce8c --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/async-1.c @@ -0,0 +1,7 @@ +/* PR c/99137 */ + +void f () +{ + #pragma acc parallel async(1,2) /* { dg-error "expected '\\)' before ',' token" } */ + ; +} diff --git a/gcc/testsuite/c-c++-common/goacc/asyncwait-1.c b/gcc/testsuite/c-c++-common/goacc/asyncwait-1.c index 2f5d4762b49..b5d789621ec 100644 --- a/gcc/testsuite/c-c++-common/goacc/asyncwait-1.c +++ b/gcc/testsuite/c-c++-common/goacc/asyncwait-1.c @@ -9,7 +9,7 @@ f (int N, float *a, float *b) b[ii] = a[ii]; } -#pragma acc parallel copyin (a[0:N]) copy (b[0:N]) async (1,) /* { dg-error "expected (primary-|)expression before" } */ +#pragma acc parallel copyin (a[0:N]) copy (b[0:N]) async (1,) /* { dg-error "expected '\\)' before ',' token" } */ { for (ii = 0; ii < N; ii++) b[ii] = a[ii]; @@ -21,19 +21,19 @@ f (int N, float *a, float *b) b[ii] = a[ii]; } -#pragma acc parallel copyin (a[0:N]) copy (b[0:N]) async (1,2,) /* { dg-error "expected (primary-|)expression before" } */ +#pragma acc parallel copyin (a[0:N]) copy (b[0:N]) async (1,2,) /* { dg-error "expected '\\)' before ',' token" } */ { for (ii = 0; ii < N; ii++) b[ii] = a[ii]; } -#pragma acc parallel copyin (a[0:N]) copy (b[0:N]) async (1,2 3) /* { dg-error "expected '\\)' before numeric constant" } */ +#pragma acc parallel copyin (a[0:N]) copy (b[0:N]) async (1,2 3) /* { dg-error "expected '\\)' before ',' token" } */ { for (ii = 0; ii < N; ii++) b[ii] = a[ii]; } -#pragma acc parallel copyin (a[0:N]) copy (b[0:N]) async (1,2,,) /* { dg-error "expected (primary-|)expression before" } */ +#pragma acc parallel copyin (a[0:N]) copy (b[0:N]) async (1,2,,) /* { dg-error "expected '\\)' before ',' token" } */ { for (ii = 0; ii < N; ii++) b[ii] = a[ii]; @@ -193,15 +193,15 @@ f (int N, float *a, float *b) #pragma acc wait async (1 2) /* { dg-error "expected '\\)' before numeric constant" } */ -#pragma acc wait async (1,) /* { dg-error "expected (primary-|)expression before" } */ +#pragma acc wait async (1,) /* { dg-error "expected '\\)' before ',' token" } */ #pragma acc wait async (,1) /* { dg-error "expected (primary-|)expression before" } */ -#pragma acc wait async (1,2,) /* { dg-error "expected (primary-|)expression before" } */ +#pragma acc wait async (1,2,) /* { dg-error "expected '\\)' before ',' token" } */ -#pragma acc wait async (1,2 3) /* { dg-error "expected '\\)' before numeric constant" } */ +#pragma acc wait async (1,2 3) /* { dg-error "expected '\\)' before ',' token" } */ -#pragma acc wait async (1,2,,) /* { dg-error "expected (primary-|)expression before" } */ +#pragma acc wait async (1,2,,) /* { dg-error "expected '\\)' before ',' token" } */ #pragma acc wait async (1 /* { dg-error "expected '\\)' before end of line" } */