Commit aec17bfe by Jakub Jelinek Committed by Jakub Jelinek

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
parent 5e48d8a0
2015-11-27 Jakub Jelinek <jakub@redhat.com>
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 <ilya.verbin@intel.com> 2015-11-24 Ilya Verbin <ilya.verbin@intel.com>
* c-parser.c (c_parser_oacc_declare): Replace "ifdef ENABLE_OFFLOADING" * c-parser.c (c_parser_oacc_declare): Replace "ifdef ENABLE_OFFLOADING"
......
...@@ -4729,7 +4729,8 @@ c_parser_compound_statement_nostart (c_parser *parser) ...@@ -4729,7 +4729,8 @@ c_parser_compound_statement_nostart (c_parser *parser)
syntactically. This ensures that the user doesn't put them syntactically. This ensures that the user doesn't put them
places that would turn into syntax errors if the directive places that would turn into syntax errors if the directive
were ignored. */ 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; last_label = false, last_stmt = true;
} }
else if (c_parser_next_token_is (parser, CPP_EOF)) 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) ...@@ -14988,7 +14989,7 @@ c_parser_omp_ordered (c_parser *parser, enum pragma_context context)
error_at (loc, error_at (loc,
"%<#pragma omp ordered%> with %<depend> clause may " "%<#pragma omp ordered%> with %<depend> clause may "
"only be used in compound statements"); "only be used in compound statements");
c_parser_skip_to_pragma_eol (parser); c_parser_skip_to_pragma_eol (parser, false);
return false; return false;
} }
...@@ -15636,7 +15637,7 @@ c_parser_omp_target_update (location_t loc, c_parser *parser, ...@@ -15636,7 +15637,7 @@ c_parser_omp_target_update (location_t loc, c_parser *parser,
error_at (loc, error_at (loc,
"%<#pragma omp target update%> may only be " "%<#pragma omp target update%> may only be "
"used in compound statements"); "used in compound statements");
c_parser_skip_to_pragma_eol (parser); c_parser_skip_to_pragma_eol (parser, false);
return false; return false;
} }
...@@ -15696,7 +15697,7 @@ c_parser_omp_target_enter_data (location_t loc, c_parser *parser, ...@@ -15696,7 +15697,7 @@ c_parser_omp_target_enter_data (location_t loc, c_parser *parser,
error_at (loc, error_at (loc,
"%<#pragma omp target enter data%> may only be " "%<#pragma omp target enter data%> may only be "
"used in compound statements"); "used in compound statements");
c_parser_skip_to_pragma_eol (parser); c_parser_skip_to_pragma_eol (parser, false);
return NULL_TREE; return NULL_TREE;
} }
...@@ -15781,7 +15782,7 @@ c_parser_omp_target_exit_data (location_t loc, c_parser *parser, ...@@ -15781,7 +15782,7 @@ c_parser_omp_target_exit_data (location_t loc, c_parser *parser,
error_at (loc, error_at (loc,
"%<#pragma omp target exit data%> may only be " "%<#pragma omp target exit data%> may only be "
"used in compound statements"); "used in compound statements");
c_parser_skip_to_pragma_eol (parser); c_parser_skip_to_pragma_eol (parser, false);
return NULL_TREE; return NULL_TREE;
} }
......
2015-11-27 Jakub Jelinek <jakub@redhat.com>
PR c/63326
* parser.c (cp_parser_statement): Clear in_compound after labels.
2015-11-27 Martin Liska <mliska@suse.cz> 2015-11-27 Martin Liska <mliska@suse.cz>
* parser.c (cp_parser_late_parsing_cilk_simd_fn_info): * parser.c (cp_parser_late_parsing_cilk_simd_fn_info):
......
...@@ -10003,6 +10003,7 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, ...@@ -10003,6 +10003,7 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr,
Parse the label, and then use tail recursion to parse Parse the label, and then use tail recursion to parse
the statement. */ the statement. */
cp_parser_label_for_labeled_statement (parser, std_attrs); cp_parser_label_for_labeled_statement (parser, std_attrs);
in_compound = false;
goto restart; goto restart;
case RID_IF: case RID_IF:
...@@ -10100,6 +10101,7 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, ...@@ -10100,6 +10101,7 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr,
the statement. */ the statement. */
cp_parser_label_for_labeled_statement (parser, std_attrs); cp_parser_label_for_labeled_statement (parser, std_attrs);
in_compound = false;
goto restart; goto restart;
} }
} }
2015-11-27 Jakub Jelinek <jakub@redhat.com>
PR c/63326
* gcc.dg/gomp/barrier-2.c (f2): Expect another error after label.
* c-c++-common/gomp/pr63326.c: New test.
2015-11-27 Richard Biener <rguenther@suse.de> 2015-11-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/68553 PR tree-optimization/68553
......
...@@ -16,7 +16,7 @@ void f1(void) ...@@ -16,7 +16,7 @@ void f1(void)
void f2(void) void f2(void)
{ {
label: /* { dg-error "label at end of compound statement" } */ label: /* { dg-error "label at end of compound statement" } */
#pragma omp barrier #pragma omp barrier /* { dg-error "may only be used in compound statements" } */
} }
void f3(_Bool p) void f3(_Bool p)
......
2015-11-27 Jakub Jelinek <jakub@redhat.com>
PR c/63326
* 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.
2015-11-26 David Edelsohn <dje.gcc@gmail.com> 2015-11-26 David Edelsohn <dje.gcc@gmail.com>
* configure: Regenerate. * configure: Regenerate.
......
...@@ -17,7 +17,7 @@ foo (int *x) ...@@ -17,7 +17,7 @@ foo (int *x)
int thr = omp_get_thread_num (); int thr = omp_get_thread_num ();
switch (x[thr]) switch (x[thr])
{ {
case 4: case 4:;
#pragma omp cancel parallel #pragma omp cancel parallel
break; break;
case 3: case 3:
...@@ -31,7 +31,7 @@ foo (int *x) ...@@ -31,7 +31,7 @@ foo (int *x)
case 2: case 2:
usleep (1000); usleep (1000);
/* FALLTHRU */ /* FALLTHRU */
case 1: case 1:;
#pragma omp cancellation point parallel #pragma omp cancellation point parallel
break; break;
} }
......
...@@ -13,7 +13,7 @@ foo (int *x) ...@@ -13,7 +13,7 @@ foo (int *x)
int thr = omp_get_thread_num (); int thr = omp_get_thread_num ();
switch (x[thr]) switch (x[thr])
{ {
case 4: case 4:;
#pragma omp cancel parallel #pragma omp cancel parallel
break; break;
case 3: case 3:
...@@ -27,7 +27,7 @@ foo (int *x) ...@@ -27,7 +27,7 @@ foo (int *x)
case 2: case 2:
usleep (1000); usleep (1000);
/* FALLTHRU */ /* FALLTHRU */
case 1: case 1:;
#pragma omp cancellation point parallel #pragma omp cancellation point parallel
break; break;
} }
......
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