From: Jakub Jelinek Date: Wed, 7 May 2014 16:09:41 +0000 (+0200) Subject: backport: re PR c++/59297 (ICE: openmp atomic with indirect LHS) X-Git-Tag: releases/gcc-4.7.4~99 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=89fc3a0ffe48047157d6bfe71a65c1fbc72788bc;p=thirdparty%2Fgcc.git backport: re PR c++/59297 (ICE: openmp atomic with indirect LHS) Backported from mainline 2013-11-28 Jakub Jelinek PR c++/59297 * semantics.c (finish_omp_atomic): Call finish_expr_stmt rather than add_stmt. * g++.dg/gomp/pr59297.C: New test. 2013-05-31 Jason Merrill PR c++/56930 * semantics.c (potential_constant_expression_1): Handle OMP_ATOMIC*. From-SVN: r210178 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 549d28d6fdb1..1ee383f8b09e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,11 +1,22 @@ 2014-05-07 Jakub Jelinek Backported from mainline + 2013-11-28 Jakub Jelinek + + PR c++/59297 + * semantics.c (finish_omp_atomic): Call finish_expr_stmt + rather than add_stmt. + 2013-09-09 Jakub Jelinek PR c++/58325 * init.c (build_vec_delete): Call mark_rvalue_use on base. + 2013-05-31 Jason Merrill + + PR c++/56930 + * semantics.c (potential_constant_expression_1): Handle OMP_ATOMIC*. + 2014-02-26 Fabien Chêne PR c++/37140 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index d5c35c695c3d..e71f7d99f2f4 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -4977,7 +4977,7 @@ finish_omp_atomic (enum tree_code code, enum tree_code opcode, tree lhs, } stmt = build2 (OMP_ATOMIC, void_type_node, integer_zero_node, stmt); } - add_stmt (stmt); + finish_expr_stmt (stmt); } void @@ -8594,6 +8594,12 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags) } return false; + case OMP_ATOMIC: + case OMP_ATOMIC_READ: + case OMP_ATOMIC_CAPTURE_OLD: + case OMP_ATOMIC_CAPTURE_NEW: + return false; + default: sorry ("unexpected AST of kind %s", tree_code_name[TREE_CODE (t)]); gcc_unreachable(); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4307f7197b1e..eeda6f55c31c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2014-05-07 Jakub Jelinek Backported from mainline + 2013-11-28 Jakub Jelinek + + PR c++/59297 + * g++.dg/gomp/pr59297.C: New test. + 2013-11-27 Jakub Jelinek PR tree-optimization/59014 diff --git a/gcc/testsuite/g++.dg/gomp/pr59297.C b/gcc/testsuite/g++.dg/gomp/pr59297.C new file mode 100644 index 000000000000..330ed2e00b1c --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr59297.C @@ -0,0 +1,25 @@ +// PR c++/59297 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template +struct A +{ + ~A (); + const T &operator[] (int) const; +}; + +struct B +{ + int &operator () (A ); +}; + +void +foo (B &x, int &z) +{ + A > y; + #pragma omp atomic + x (y[0]) += 1; + #pragma omp atomic + z += x(y[1]); +}