diff options
author | Cesar Philippidis <cesar@codesourcery.com> | 2016-12-02 06:54:39 -0800 |
---|---|---|
committer | Cesar Philippidis <cesar@gcc.gnu.org> | 2016-12-02 06:54:39 -0800 |
commit | c5af52eb8cc208890ccb3bdce75b35bf5bbaa8bf (patch) | |
tree | 2f0ce488844285e012110f8b14e864975bded2ec /gcc/cp/parser.c | |
parent | 69a71a6d071a5eae8a06282351e53d8c383aba9a (diff) | |
download | gcc-c5af52eb8cc208890ccb3bdce75b35bf5bbaa8bf.zip gcc-c5af52eb8cc208890ccb3bdce75b35bf5bbaa8bf.tar.gz gcc-c5af52eb8cc208890ccb3bdce75b35bf5bbaa8bf.tar.bz2 |
c-parser.c (c_parser_pragma): Error when PRAGMA_OACC_{ENTER_DATA...
gcc/c/
* c-parser.c (c_parser_pragma): Error when PRAGMA_OACC_{ENTER_DATA,
EXIT_DATA,WAIT} are not used in compound statements.
(c_parser_oacc_enter_exit_data): Update diagnostics.
gcc/cp/
* parser.c (cp_parser_oacc_enter_exit_data): Update diagnostics.
(cp_parser_pragma): Error when PRAGMA_OACC_{ENTER_DATA,
EXIT_DATA,WAIT} are not used in compound statements.
gcc/testsuite/
* c-c++-common/goacc/data-2.c: Adjust test.
* c-c++-common/goacc/executeables-1.c: New test.
* g++.dg/goacc/data-1.C: Adjust test.
Co-Authored-By: James Norris <jnorris@codesourcery.com>
From-SVN: r243185
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r-- | gcc/cp/parser.c | 75 |
1 files changed, 57 insertions, 18 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 843cbe2..08f5f9e 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -36175,23 +36175,18 @@ static tree cp_parser_oacc_enter_exit_data (cp_parser *parser, cp_token *pragma_tok, bool enter) { + location_t loc = pragma_tok->location; tree stmt, clauses; + const char *p = ""; - if (cp_lexer_next_token_is (parser->lexer, CPP_PRAGMA_EOL) - || cp_lexer_next_token_is_not (parser->lexer, CPP_NAME)) - { - cp_parser_error (parser, enter - ? "expected %<data%> in %<#pragma acc enter data%>" - : "expected %<data%> in %<#pragma acc exit data%>"); - cp_parser_skip_to_pragma_eol (parser, pragma_tok); - return NULL_TREE; - } + if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) + p = IDENTIFIER_POINTER (cp_lexer_peek_token (parser->lexer)->u.value); - const char *p = - IDENTIFIER_POINTER (cp_lexer_peek_token (parser->lexer)->u.value); if (strcmp (p, "data") != 0) { - cp_parser_error (parser, "invalid pragma"); + error_at (loc, enter + ? "expected %<data%> after %<#pragma acc enter%>" + : "expected %<data%> after %<#pragma acc exit%>"); cp_parser_skip_to_pragma_eol (parser, pragma_tok); return NULL_TREE; } @@ -36207,8 +36202,8 @@ cp_parser_oacc_enter_exit_data (cp_parser *parser, cp_token *pragma_tok, if (find_omp_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE) { - error_at (pragma_tok->location, - "%<#pragma acc enter data%> has no data movement clause"); + error_at (loc, "%<#pragma acc %s data%> has no data movement clause", + enter ? "enter" : "exit"); return NULL_TREE; } @@ -38083,6 +38078,30 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context, bool *if_p) cp_parser_oacc_declare (parser, pragma_tok); return false; + case PRAGMA_OACC_ENTER_DATA: + if (context == pragma_stmt) + { + cp_parser_error (parser, "%<#pragma acc enter data%> may only be " + "used in compound statements"); + break; + } + else if (context != pragma_compound) + goto bad_stmt; + cp_parser_omp_construct (parser, pragma_tok, if_p); + return true; + + case PRAGMA_OACC_EXIT_DATA: + if (context == pragma_stmt) + { + cp_parser_error (parser, "%<#pragma acc exit data%> may only be " + "used in compound statements"); + break; + } + else if (context != pragma_compound) + goto bad_stmt; + cp_parser_omp_construct (parser, pragma_tok, if_p); + return true; + case PRAGMA_OACC_ROUTINE: if (context != pragma_external) { @@ -38093,17 +38112,37 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context, bool *if_p) cp_parser_oacc_routine (parser, pragma_tok, context); return false; + case PRAGMA_OACC_UPDATE: + if (context == pragma_stmt) + { + cp_parser_error (parser, "%<#pragma acc update%> may only be " + "used in compound statements"); + break; + } + else if (context != pragma_compound) + goto bad_stmt; + cp_parser_omp_construct (parser, pragma_tok, if_p); + return true; + + case PRAGMA_OACC_WAIT: + if (context == pragma_stmt) + { + cp_parser_error (parser, "%<#pragma acc wait%> may only be " + "used in compound statements"); + break; + } + else if (context != pragma_compound) + goto bad_stmt; + cp_parser_omp_construct (parser, pragma_tok, if_p); + return true; + case PRAGMA_OACC_ATOMIC: case PRAGMA_OACC_CACHE: case PRAGMA_OACC_DATA: - case PRAGMA_OACC_ENTER_DATA: - case PRAGMA_OACC_EXIT_DATA: case PRAGMA_OACC_HOST_DATA: case PRAGMA_OACC_KERNELS: case PRAGMA_OACC_PARALLEL: case PRAGMA_OACC_LOOP: - case PRAGMA_OACC_UPDATE: - case PRAGMA_OACC_WAIT: case PRAGMA_OMP_ATOMIC: case PRAGMA_OMP_CRITICAL: case PRAGMA_OMP_DISTRIBUTE: |