From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id 855CD3A0E83C; Thu, 22 Apr 2021 16:49:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 855CD3A0E83C MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jakub Jelinek To: gcc-cvs@gcc.gnu.org Subject: [gcc r8-10864] openmp: Fix C ICE on OpenMP atomics X-Act-Checkin: gcc X-Git-Author: Jakub Jelinek X-Git-Refname: refs/heads/releases/gcc-8 X-Git-Oldrev: 1a89fa601b0335cedb8ed415f1ef209cf1544002 X-Git-Newrev: eef73af5f1b5b3f9db8439f8ef48875c6eda5f0f Message-Id: <20210422164901.855CD3A0E83C@sourceware.org> Date: Thu, 22 Apr 2021 16:49:01 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Apr 2021 16:49:01 -0000 https://gcc.gnu.org/g:eef73af5f1b5b3f9db8439f8ef48875c6eda5f0f commit r8-10864-geef73af5f1b5b3f9db8439f8ef48875c6eda5f0f Author: Jakub Jelinek Date: Tue Nov 24 09:04:28 2020 +0100 openmp: Fix C ICE on OpenMP atomics c_parser_binary_expression was using build2 to create a temporary holder for binary expression that c_parser_atomic and c_finish_omp_atomic can then handle. The latter performs then all the needed checking. Unfortunately, build2 performs some checking too, e.g. PLUS_EXPR vs. POINTER_PLUS_EXPR or matching types of the arguments, nothing we can guarantee at the parsing time. So we need something like C++ build_min_nt*. This patch implements that inline. 2020-11-24 Jakub Jelinek PR c/97958 * c-parser.c (c_parser_binary_expression): For omp atomic binary expressions, use make_node instead of build2 to avoid checking build2 performs. * c-c++-common/gomp/pr97958.c: New test. (cherry picked from commit 1cd47144fd250f37206c8e2a0cc7d51c25ad368c) Diff: --- gcc/c/c-parser.c | 10 +++++++--- gcc/testsuite/c-c++-common/gomp/pr97958.c | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index bea4dd2a779..b41e5eb8b8c 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -6955,9 +6955,13 @@ c_parser_binary_expression (c_parser *parser, struct c_expr *after, && stack[1].expr.value != error_mark_node \ && (c_tree_equal (stack[0].expr.value, omp_atomic_lhs) \ || c_tree_equal (stack[1].expr.value, omp_atomic_lhs))) \ - stack[0].expr.value \ - = build2 (stack[1].op, TREE_TYPE (stack[0].expr.value), \ - stack[0].expr.value, stack[1].expr.value); \ + { \ + tree t = make_node (stack[1].op); \ + TREE_TYPE (t) = TREE_TYPE (stack[0].expr.value); \ + TREE_OPERAND (t, 0) = stack[0].expr.value; \ + TREE_OPERAND (t, 1) = stack[1].expr.value; \ + stack[0].expr.value = t; \ + } \ else \ stack[sp - 1].expr = parser_build_binary_op (stack[sp].loc, \ stack[sp].op, \ diff --git a/gcc/testsuite/c-c++-common/gomp/pr97958.c b/gcc/testsuite/c-c++-common/gomp/pr97958.c new file mode 100644 index 00000000000..ef6ac1ad9fb --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr97958.c @@ -0,0 +1,17 @@ +/* PR c/97958 */ + +int *p; + +void +foo (void) +{ + #pragma omp atomic + p = p + 1; +} + +void +bar (void) +{ + #pragma omp atomic /* { dg-error "invalid expression type for '#pragma omp atomic'" "" { target c } } */ + bar = bar + 1; /* { dg-error "invalid expression type for '#pragma omp atomic'" "" { target c++ } } */ +}