@@ -11231,9 +11231,9 @@ c_parser_omp_clause_aligned (c_parser *p
tree alignment = c_parser_expr_no_commas (parser, NULL).value;
mark_exp_read (alignment);
alignment = c_fully_fold (alignment, false, NULL);
- if (!INTEGRAL_TYPE_P (TREE_TYPE (alignment))
- && TREE_CODE (alignment) != INTEGER_CST
- && tree_int_cst_sgn (alignment) != 1)
+ if (TREE_CODE (alignment) != INTEGER_CST
+ || !INTEGRAL_TYPE_P (TREE_TYPE (alignment))
+ || tree_int_cst_sgn (alignment) != 1)
{
error_at (clause_loc, "%<aligned%> clause alignment expression must "
"be positive constant integer expression");
@@ -11310,9 +11310,9 @@ c_parser_omp_clause_safelen (c_parser *p
t = c_parser_expr_no_commas (parser, NULL).value;
mark_exp_read (t);
t = c_fully_fold (t, false, NULL);
- if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
- && TREE_CODE (t) != INTEGER_CST
- && tree_int_cst_sgn (t) != 1)
+ if (TREE_CODE (t) != INTEGER_CST
+ || !INTEGRAL_TYPE_P (TREE_TYPE (t))
+ || tree_int_cst_sgn (t) != 1)
{
error_at (clause_loc, "%<safelen%> clause expression must "
"be positive constant integer expression");
@@ -11346,9 +11346,9 @@ c_parser_omp_clause_simdlen (c_parser *p
t = c_parser_expr_no_commas (parser, NULL).value;
mark_exp_read (t);
t = c_fully_fold (t, false, NULL);
- if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
- && TREE_CODE (t) != INTEGER_CST
- && tree_int_cst_sgn (t) != 1)
+ if (TREE_CODE (t) != INTEGER_CST
+ || !INTEGRAL_TYPE_P (TREE_TYPE (t))
+ || tree_int_cst_sgn (t) != 1)
{
error_at (clause_loc, "%<simdlen%> clause expression must "
"be positive constant integer expression");
@@ -8912,7 +8912,8 @@ temp_pop_parm_decls (void)
current_scope->bindings = NULL;
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);
I_SYMBOL_BINDING (b->id) = b->shadowed;
if (b->shadowed && b->shadowed->u.type)
@@ -0,0 +1,42 @@
+/* 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)
+ ;
+}