aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r--gcc/cp/parser.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 5a2d73d..0c77c20 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -35383,12 +35383,21 @@ cp_parser_omp_clause_hint (cp_parser *parser, tree list, location_t location)
t = cp_parser_assignment_expression (parser);
+ if (t != error_mark_node)
+ {
+ t = fold_non_dependent_expr (t);
+ if (!value_dependent_expression_p (t)
+ && (!INTEGRAL_TYPE_P (TREE_TYPE (t))
+ || !tree_fits_shwi_p (t)
+ || tree_int_cst_sgn (t) == -1))
+ error_at (location, "expected constant integer expression with "
+ "valid sync-hint value");
+ }
if (t == error_mark_node
|| !parens.require_close (parser))
cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
/*or_comma=*/false,
/*consume_paren=*/true);
-
check_no_duplicate_clause (list, OMP_CLAUSE_HINT, "hint", location);
c = build_omp_clause (location, OMP_CLAUSE_HINT);
@@ -38210,13 +38219,10 @@ cp_parser_omp_critical (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)
&& cp_lexer_nth_token_is (parser->lexer, 2, CPP_NAME))
cp_lexer_consume_token (parser->lexer);
-
- clauses = cp_parser_omp_all_clauses (parser,
- OMP_CRITICAL_CLAUSE_MASK,
- "#pragma omp critical", pragma_tok);
}
- else
- cp_parser_require_pragma_eol (parser, pragma_tok);
+
+ clauses = cp_parser_omp_all_clauses (parser, OMP_CRITICAL_CLAUSE_MASK,
+ "#pragma omp critical", pragma_tok);
stmt = cp_parser_omp_structured_block (parser, if_p);
return c_finish_omp_critical (input_location, stmt, name, clauses);