From 54d19c3b7fb38097973a57b6e822e15cbcbd031d Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Wed, 29 Jun 2016 11:08:04 +0200 Subject: [PATCH] Improve diagnostic messages of "#pragma omp cancel", "#pragma omp cancellation point" parsing gcc/c/ * c-parser.c (c_parser_pragma) : Move pragma context checking into... (c_parser_omp_cancellation_point): ... here, and improve diagnostic messages. * c-typeck.c (c_finish_omp_cancel) (c_finish_omp_cancellation_point): Improve diagnostic messages. gcc/cp/ * parser.c (cp_parser_pragma) : Move pragma context checking into... (cp_parser_omp_cancellation_point): ... here, and improve diagnostic messages. * semantics.c (finish_omp_cancel, finish_omp_cancellation_point): Improve diagnostic messages. gcc/testsuite/ * c-c++-common/gomp/cancel-1.c: Extend. From-SVN: r237843 --- gcc/c/ChangeLog | 9 ++++++ gcc/c/c-parser.c | 24 +++++++++------- gcc/c/c-typeck.c | 4 +-- gcc/cp/ChangeLog | 9 ++++++ gcc/cp/parser.c | 33 +++++++++++----------- gcc/cp/semantics.c | 4 +-- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/c-c++-common/gomp/cancel-1.c | 15 ++++++++++ 8 files changed, 72 insertions(+), 30 deletions(-) diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index df73934ca94..7bd112b3bce 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,12 @@ +2016-06-29 Thomas Schwinge + + * c-parser.c (c_parser_pragma) : + Move pragma context checking into... + (c_parser_omp_cancellation_point): ... here, and improve + diagnostic messages. + * c-typeck.c (c_finish_omp_cancel) + (c_finish_omp_cancellation_point): Improve diagnostic messages. + 2016-06-29 Jakub Jelinek PR c/71685 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 1d2dac796ad..1a50dea228b 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -1358,11 +1358,11 @@ static tree c_parser_omp_for_loop (location_t, c_parser *, enum tree_code, static void c_parser_omp_taskwait (c_parser *); static void c_parser_omp_taskyield (c_parser *); static void c_parser_omp_cancel (c_parser *); -static void c_parser_omp_cancellation_point (c_parser *); enum pragma_context { pragma_external, pragma_struct, pragma_param, pragma_stmt, pragma_compound }; static bool c_parser_pragma (c_parser *, enum pragma_context, bool *); +static void c_parser_omp_cancellation_point (c_parser *, enum pragma_context); static bool c_parser_omp_target (c_parser *, enum pragma_context, bool *); static void c_parser_omp_end_declare_target (c_parser *); static void c_parser_omp_declare (c_parser *, enum pragma_context); @@ -10187,14 +10187,7 @@ c_parser_pragma (c_parser *parser, enum pragma_context context, bool *if_p) return false; case PRAGMA_OMP_CANCELLATION_POINT: - if (context != pragma_compound) - { - if (context == pragma_stmt) - c_parser_error (parser, "%<#pragma omp cancellation point%> may " - "only be used in compound statements"); - goto bad_stmt; - } - c_parser_omp_cancellation_point (parser); + c_parser_omp_cancellation_point (parser, context); return false; case PRAGMA_OMP_THREADPRIVATE: @@ -15668,7 +15661,7 @@ c_parser_omp_cancel (c_parser *parser) | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP)) static void -c_parser_omp_cancellation_point (c_parser *parser) +c_parser_omp_cancellation_point (c_parser *parser, enum pragma_context context) { location_t loc = c_parser_peek_token (parser)->location; tree clauses; @@ -15691,6 +15684,17 @@ c_parser_omp_cancellation_point (c_parser *parser) return; } + if (context != pragma_compound) + { + if (context == pragma_stmt) + error_at (loc, "%<#pragma omp cancellation point%> may only be used in" + " compound statements"); + else + c_parser_error (parser, "expected declaration specifiers"); + c_parser_skip_to_pragma_eol (parser, false); + return; + } + clauses = c_parser_omp_all_clauses (parser, OMP_CANCELLATION_POINT_CLAUSE_MASK, "#pragma omp cancellation point"); diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 56268fcc843..b2435deac06 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -11933,7 +11933,7 @@ c_finish_omp_cancel (location_t loc, tree clauses) mask = 8; else { - error_at (loc, "%<#pragma omp cancel must specify one of " + error_at (loc, "%<#pragma omp cancel%> must specify one of " "%, %, % or % " "clauses"); return; @@ -11972,7 +11972,7 @@ c_finish_omp_cancellation_point (location_t loc, tree clauses) mask = 8; else { - error_at (loc, "%<#pragma omp cancellation point must specify one of " + error_at (loc, "%<#pragma omp cancellation point%> must specify one of " "%, %, % or % " "clauses"); return; diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 76b86a4a2d6..327391bf775 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2016-06-29 Thomas Schwinge + + * parser.c (cp_parser_pragma) : + Move pragma context checking into... + (cp_parser_omp_cancellation_point): ... here, and improve + diagnostic messages. + * semantics.c (finish_omp_cancel, finish_omp_cancellation_point): + Improve diagnostic messages. + 2016-06-28 Jakub Jelinek * Make-lang.in: Don't cat ../stage_current if it does not exist. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 739fca08f9f..3e8270e1e6a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -34395,7 +34395,8 @@ cp_parser_omp_cancel (cp_parser *parser, cp_token *pragma_tok) | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP)) static void -cp_parser_omp_cancellation_point (cp_parser *parser, cp_token *pragma_tok) +cp_parser_omp_cancellation_point (cp_parser *parser, cp_token *pragma_tok, + enum pragma_context context) { tree clauses; bool point_seen = false; @@ -34414,7 +34415,19 @@ cp_parser_omp_cancellation_point (cp_parser *parser, cp_token *pragma_tok) if (!point_seen) { cp_parser_error (parser, "expected %"); - cp_parser_require_pragma_eol (parser, pragma_tok); + cp_parser_skip_to_pragma_eol (parser, pragma_tok); + return; + } + + if (context != pragma_compound) + { + if (context == pragma_stmt) + error_at (pragma_tok->location, + "%<#pragma omp cancellation point%> may only be used in" + " compound statements"); + else + cp_parser_error (parser, "expected declaration specifiers"); + cp_parser_skip_to_pragma_eol (parser, pragma_tok); return; } @@ -37291,20 +37304,8 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context, bool *if_p) break; case PRAGMA_OMP_CANCELLATION_POINT: - switch (context) - { - case pragma_compound: - cp_parser_omp_cancellation_point (parser, pragma_tok); - return false; - case pragma_stmt: - error_at (pragma_tok->location, - "%<#pragma omp cancellation point%> may only be " - "used in compound statements"); - break; - default: - goto bad_stmt; - } - break; + cp_parser_omp_cancellation_point (parser, pragma_tok, context); + return false; case PRAGMA_OMP_THREADPRIVATE: cp_parser_omp_threadprivate (parser, pragma_tok); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index fa4698e2281..d1fb11973fd 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -8571,7 +8571,7 @@ finish_omp_cancel (tree clauses) mask = 8; else { - error ("%<#pragma omp cancel must specify one of " + error ("%<#pragma omp cancel%> must specify one of " "%, %, % or % clauses"); return; } @@ -8608,7 +8608,7 @@ finish_omp_cancellation_point (tree clauses) mask = 8; else { - error ("%<#pragma omp cancellation point must specify one of " + error ("%<#pragma omp cancellation point%> must specify one of " "%, %, % or % clauses"); return; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c1c9a31a8e4..bc85add977d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-06-29 Thomas Schwinge + + * c-c++-common/gomp/cancel-1.c: Extend. + 2016-06-29 Jakub Jelinek PR tree-optimization/71625 diff --git a/gcc/testsuite/c-c++-common/gomp/cancel-1.c b/gcc/testsuite/c-c++-common/gomp/cancel-1.c index 896a76858bd..d26fcf1e226 100644 --- a/gcc/testsuite/c-c++-common/gomp/cancel-1.c +++ b/gcc/testsuite/c-c++-common/gomp/cancel-1.c @@ -455,3 +455,18 @@ f3 (void) } } } + +#pragma omp cancellation point /* { dg-error "expected declaration specifiers before end of line" } */ + +void +f4 (void) +{ + if (0) +#pragma omp cancellation EKAHI /* { dg-error "expected .point. before .EKAHI." } */ + ; +#pragma omp cancellation HO OKAHI /* { dg-error "expected .point. before .HO." } */ + if (0) +#pragma omp cancellation point /* { dg-error ".pragma omp cancellation point. may only be used in compound statements" } */ + ; +#pragma omp cancellation point /* { dg-error ".pragma omp cancellation point. must specify one of" } */ +} -- 2.30.2