re PR middle-end/64824 (ICE in gimple verification)

PR c/64824
	* c-parser.c (c_parser_binary_expression): Fix OpenMP stack[sp].prec
	check in the POP macro.

	* testsuite/libgomp.c/atomic-18.c: New test.
	* testsuite/libgomp.c++/atomic-16.C: New test.

From-SVN: r220617
This commit is contained in:
Jakub Jelinek 2015-02-11 14:40:31 +01:00 committed by Jakub Jelinek
parent c43ade8004
commit fa01ffccc7
5 changed files with 80 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2015-02-11 Jakub Jelinek <jakub@redhat.com>
PR c/64824
* c-parser.c (c_parser_binary_expression): Fix OpenMP stack[sp].prec
check in the POP macro.
2015-02-09 Marek Polacek <polacek@redhat.com>
PR c/64856

View File

@ -6233,8 +6233,8 @@ c_parser_binary_expression (c_parser *parser, struct c_expr *after,
if (__builtin_expect (omp_atomic_lhs != NULL_TREE, 0) && sp == 1 \
&& c_parser_peek_token (parser)->type == CPP_SEMICOLON \
&& ((1 << stack[sp].prec) \
& (1 << (PREC_BITOR | PREC_BITXOR | PREC_BITAND | PREC_SHIFT \
| PREC_ADD | PREC_MULT))) \
& ((1 << PREC_BITOR) | (1 << PREC_BITXOR) | (1 << PREC_BITAND) \
| (1 << PREC_SHIFT) | (1 << PREC_ADD) | (1 << PREC_MULT))) \
&& stack[sp].op != TRUNC_MOD_EXPR \
&& stack[0].expr.value != error_mark_node \
&& stack[1].expr.value != error_mark_node \

View File

@ -1,3 +1,9 @@
2015-02-11 Jakub Jelinek <jakub@redhat.com>
PR c/64824
* testsuite/libgomp.c/atomic-18.c: New test.
* testsuite/libgomp.c++/atomic-16.C: New test.
2015-02-04 Jakub Jelinek <jakub@redhat.com>
PR c/64824

View File

@ -0,0 +1,5 @@
// PR c/64824
// { dg-do run }
// { dg-options "-O2 -fopenmp" }
#include "../libgomp.c/atomic-18.c"

View File

@ -0,0 +1,61 @@
/* PR c/64824 */
/* { dg-do run } */
/* { dg-options "-O2 -fopenmp" } */
void
f1 (void)
{
short a;
short b = 1;
int c = 3;
#pragma omp atomic capture
a = b = c << b;
if (b != 6 || a != 6)
__builtin_abort ();
}
void
f2 (void)
{
short a;
short b = 1;
int c = 3;
#pragma omp atomic capture
a = b = c + b;
if (b != 4 || a != 4)
__builtin_abort ();
}
void
f3 (void)
{
short a;
short b = 1;
long long int c = 3;
#pragma omp atomic capture
a = b = c + b;
if (b != 4 || a != 4)
__builtin_abort ();
}
void
f4 (void)
{
char a;
char b = 1;
long long int c = 3LL;
#pragma omp atomic capture
a = b = c << b;
if (b != 6 || a != 6)
__builtin_abort ();
}
int
main ()
{
f1 ();
f2 ();
f3 ();
f4 ();
return 0;
}