From aec17bfe911ec61571db80eb5b0093a5b19e39e4 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 27 Nov 2015 09:59:55 +0100 Subject: re PR c/63326 (whether a #pragma is a statement depends on the type of pragma) PR c/63326 * c-parser.c (c_parser_compound_statement_nostart): If last_label is true, use pragma_stmt instead of pragma_compound as second c_parser_pragma argument. (c_parser_omp_ordered, c_parser_omp_target_update, c_parser_omp_target_enter_data, c_parser_omp_target_exit_data): Pass false as second argument to c_parser_skip_to_pragma_eol after diagnosing standalone directives used in pragma_stmt context. * parser.c (cp_parser_statement): Clear in_compound after labels. * gcc.dg/gomp/barrier-2.c (f2): Expect another error after label. * c-c++-common/gomp/pr63326.c: New test. * testsuite/libgomp.c/cancel-parallel-2.c (foo): Add semicolon in between case label and OpenMP standalone directives. * testsuite/libgomp.c++/cancel-parallel-2.C (foo): Likewise. From-SVN: r230999 --- gcc/c/ChangeLog | 11 +++++++++++ gcc/c/c-parser.c | 11 ++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) (limited to 'gcc/c') diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 805cc4f..2f58369 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,14 @@ +2015-11-27 Jakub Jelinek + + PR c/63326 + * c-parser.c (c_parser_compound_statement_nostart): If + last_label is true, use pragma_stmt instead of pragma_compound + as second c_parser_pragma argument. + (c_parser_omp_ordered, c_parser_omp_target_update, + c_parser_omp_target_enter_data, c_parser_omp_target_exit_data): Pass + false as second argument to c_parser_skip_to_pragma_eol after + diagnosing standalone directives used in pragma_stmt context. + 2015-11-24 Ilya Verbin * c-parser.c (c_parser_oacc_declare): Replace "ifdef ENABLE_OFFLOADING" diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 44a925b..0259f66 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -4729,7 +4729,8 @@ c_parser_compound_statement_nostart (c_parser *parser) syntactically. This ensures that the user doesn't put them places that would turn into syntax errors if the directive were ignored. */ - if (c_parser_pragma (parser, pragma_compound)) + if (c_parser_pragma (parser, + last_label ? pragma_stmt : pragma_compound)) last_label = false, last_stmt = true; } else if (c_parser_next_token_is (parser, CPP_EOF)) @@ -14988,7 +14989,7 @@ c_parser_omp_ordered (c_parser *parser, enum pragma_context context) error_at (loc, "%<#pragma omp ordered%> with % clause may " "only be used in compound statements"); - c_parser_skip_to_pragma_eol (parser); + c_parser_skip_to_pragma_eol (parser, false); return false; } @@ -15636,7 +15637,7 @@ c_parser_omp_target_update (location_t loc, c_parser *parser, error_at (loc, "%<#pragma omp target update%> may only be " "used in compound statements"); - c_parser_skip_to_pragma_eol (parser); + c_parser_skip_to_pragma_eol (parser, false); return false; } @@ -15696,7 +15697,7 @@ c_parser_omp_target_enter_data (location_t loc, c_parser *parser, error_at (loc, "%<#pragma omp target enter data%> may only be " "used in compound statements"); - c_parser_skip_to_pragma_eol (parser); + c_parser_skip_to_pragma_eol (parser, false); return NULL_TREE; } @@ -15781,7 +15782,7 @@ c_parser_omp_target_exit_data (location_t loc, c_parser *parser, error_at (loc, "%<#pragma omp target exit data%> may only be " "used in compound statements"); - c_parser_skip_to_pragma_eol (parser); + c_parser_skip_to_pragma_eol (parser, false); return NULL_TREE; } -- cgit v1.1