aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
authorCesar Philippidis <cesar@codesourcery.com>2016-12-02 06:54:39 -0800
committerCesar Philippidis <cesar@gcc.gnu.org>2016-12-02 06:54:39 -0800
commitc5af52eb8cc208890ccb3bdce75b35bf5bbaa8bf (patch)
tree2f0ce488844285e012110f8b14e864975bded2ec /gcc/cp/parser.c
parent69a71a6d071a5eae8a06282351e53d8c383aba9a (diff)
downloadgcc-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.c75
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: