Commit fce5e5e3 by Jakub Jelinek Committed by Jakub Jelinek

re PR c/67500 (OpenMP ICE with invalid safelen/simdlen/alignment expressions)

	PR c/67500
	* c-parser.c (c_parser_omp_clause_aligned,
	c_parser_omp_clause_safelen, c_parser_omp_clause_simdlen): Fix up
	test for errors.
	* c-decl.c (temp_pop_parm_decls): Allow b->decl equal to
	error_mark_node.

	* gcc.dg/gomp/pr67500.c: New test.

From-SVN: r227577
parent f4b189d5
2015-09-09 Jakub Jelinek <jakub@redhat.com> 2015-09-09 Jakub Jelinek <jakub@redhat.com>
PR c/67500
* c-parser.c (c_parser_omp_clause_aligned,
c_parser_omp_clause_safelen, c_parser_omp_clause_simdlen): Fix up
test for errors.
* c-decl.c (temp_pop_parm_decls): Allow b->decl equal to
error_mark_node.
PR c/67495 PR c/67495
* c-parser.c (c_parser_omp_atomic): Use c_parser_cast_expression * c-parser.c (c_parser_omp_atomic): Use c_parser_cast_expression
instead of c_parser_unary_expression. If the result is !lvalue_p, instead of c_parser_unary_expression. If the result is !lvalue_p,
......
...@@ -8912,7 +8912,8 @@ temp_pop_parm_decls (void) ...@@ -8912,7 +8912,8 @@ temp_pop_parm_decls (void)
current_scope->bindings = NULL; current_scope->bindings = NULL;
for (; b; b = free_binding_and_advance (b)) for (; b; b = free_binding_and_advance (b))
{ {
gcc_assert (TREE_CODE (b->decl) == PARM_DECL); gcc_assert (TREE_CODE (b->decl) == PARM_DECL
|| b->decl == error_mark_node);
gcc_assert (I_SYMBOL_BINDING (b->id) == b); gcc_assert (I_SYMBOL_BINDING (b->id) == b);
I_SYMBOL_BINDING (b->id) = b->shadowed; I_SYMBOL_BINDING (b->id) = b->shadowed;
if (b->shadowed && b->shadowed->u.type) if (b->shadowed && b->shadowed->u.type)
......
...@@ -11231,9 +11231,9 @@ c_parser_omp_clause_aligned (c_parser *parser, tree list) ...@@ -11231,9 +11231,9 @@ c_parser_omp_clause_aligned (c_parser *parser, tree list)
tree alignment = c_parser_expr_no_commas (parser, NULL).value; tree alignment = c_parser_expr_no_commas (parser, NULL).value;
mark_exp_read (alignment); mark_exp_read (alignment);
alignment = c_fully_fold (alignment, false, NULL); alignment = c_fully_fold (alignment, false, NULL);
if (!INTEGRAL_TYPE_P (TREE_TYPE (alignment)) if (TREE_CODE (alignment) != INTEGER_CST
&& TREE_CODE (alignment) != INTEGER_CST || !INTEGRAL_TYPE_P (TREE_TYPE (alignment))
&& tree_int_cst_sgn (alignment) != 1) || tree_int_cst_sgn (alignment) != 1)
{ {
error_at (clause_loc, "%<aligned%> clause alignment expression must " error_at (clause_loc, "%<aligned%> clause alignment expression must "
"be positive constant integer expression"); "be positive constant integer expression");
...@@ -11310,9 +11310,9 @@ c_parser_omp_clause_safelen (c_parser *parser, tree list) ...@@ -11310,9 +11310,9 @@ c_parser_omp_clause_safelen (c_parser *parser, tree list)
t = c_parser_expr_no_commas (parser, NULL).value; t = c_parser_expr_no_commas (parser, NULL).value;
mark_exp_read (t); mark_exp_read (t);
t = c_fully_fold (t, false, NULL); t = c_fully_fold (t, false, NULL);
if (!INTEGRAL_TYPE_P (TREE_TYPE (t)) if (TREE_CODE (t) != INTEGER_CST
&& TREE_CODE (t) != INTEGER_CST || !INTEGRAL_TYPE_P (TREE_TYPE (t))
&& tree_int_cst_sgn (t) != 1) || tree_int_cst_sgn (t) != 1)
{ {
error_at (clause_loc, "%<safelen%> clause expression must " error_at (clause_loc, "%<safelen%> clause expression must "
"be positive constant integer expression"); "be positive constant integer expression");
...@@ -11346,9 +11346,9 @@ c_parser_omp_clause_simdlen (c_parser *parser, tree list) ...@@ -11346,9 +11346,9 @@ c_parser_omp_clause_simdlen (c_parser *parser, tree list)
t = c_parser_expr_no_commas (parser, NULL).value; t = c_parser_expr_no_commas (parser, NULL).value;
mark_exp_read (t); mark_exp_read (t);
t = c_fully_fold (t, false, NULL); t = c_fully_fold (t, false, NULL);
if (!INTEGRAL_TYPE_P (TREE_TYPE (t)) if (TREE_CODE (t) != INTEGER_CST
&& TREE_CODE (t) != INTEGER_CST || !INTEGRAL_TYPE_P (TREE_TYPE (t))
&& tree_int_cst_sgn (t) != 1) || tree_int_cst_sgn (t) != 1)
{ {
error_at (clause_loc, "%<simdlen%> clause expression must " error_at (clause_loc, "%<simdlen%> clause expression must "
"be positive constant integer expression"); "be positive constant integer expression");
......
2015-09-09 Jakub Jelinek <jakub@redhat.com> 2015-09-09 Jakub Jelinek <jakub@redhat.com>
PR c/67500
* gcc.dg/gomp/pr67500.c: New test.
PR c/67495 PR c/67495
* gcc.dg/gomp/pr67495.c: New test. * gcc.dg/gomp/pr67495.c: New test.
......
/* PR c/67500 */
/* { dg-do compile } */
/* { dg-options "-fopenmp" } */
#pragma omp declare simd simdlen(d) /* { dg-error "clause expression must be positive constant integer expression" } */
void f1 (int); /* { dg-error "undeclared here" "" { target *-*-* } 5 } */
#pragma omp declare simd simdlen(0.5) /* { dg-error "clause expression must be positive constant integer expression" } */
void f2 (int);
#pragma omp declare simd simdlen(-2) /* { dg-error "clause expression must be positive constant integer expression" } */
void f3 (int);
#pragma omp declare simd simdlen(0) /* { dg-error "clause expression must be positive constant integer expression" } */
void f4 (int);
void
foo (int *p)
{
int i;
#pragma omp simd safelen(d) /* { dg-error "must be positive constant integer expression" } */
for (i = 0; i < 16; ++i) /* { dg-error "undeclared" "" { target *-*-* } 18 } */
;
#pragma omp simd safelen(0.5) /* { dg-error "must be positive constant integer expression" } */
for (i = 0; i < 16; ++i)
;
#pragma omp simd safelen(-2) /* { dg-error "must be positive constant integer expression" } */
for (i = 0; i < 16; ++i)
;
#pragma omp simd safelen(0) /* { dg-error "must be positive constant integer expression" } */
for (i = 0; i < 16; ++i)
;
#pragma omp simd aligned(p:d) /* { dg-error "must be positive constant integer expression" } */
for (i = 0; i < 16; ++i)
;
#pragma omp simd aligned(p:0.5) /* { dg-error "must be positive constant integer expression" } */
for (i = 0; i < 16; ++i)
;
#pragma omp simd aligned(p:-2) /* { dg-error "must be positive constant integer expression" } */
for (i = 0; i < 16; ++i)
;
#pragma omp simd aligned(p:0) /* { dg-error "must be positive constant integer expression" } */
for (i = 0; i < 16; ++i)
;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment