aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r--gcc/cp/parser.c49
1 files changed, 37 insertions, 12 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index f2fa7e8..be29a27 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -40464,9 +40464,9 @@ cp_parser_omp_context_selector (cp_parser *parser, tree set, bool has_parms_p)
bool allow_score = true;
bool allow_user = false;
int property_limit = 0;
- enum { CTX_PROPERTY_NONE, CTX_PROPERTY_USER, CTX_PROPERTY_IDLIST,
- CTX_PROPERTY_EXPR, CTX_PROPERTY_SIMD } property_kind
- = CTX_PROPERTY_NONE;
+ enum { CTX_PROPERTY_NONE, CTX_PROPERTY_USER, CTX_PROPERTY_NAME_LIST,
+ CTX_PROPERTY_ID, CTX_PROPERTY_EXPR,
+ CTX_PROPERTY_SIMD } property_kind = CTX_PROPERTY_NONE;
switch (IDENTIFIER_POINTER (set)[0])
{
case 'c': /* construct */
@@ -40480,13 +40480,13 @@ cp_parser_omp_context_selector (cp_parser *parser, tree set, bool has_parms_p)
allow_score = false;
allow_user = true;
property_limit = 3;
- property_kind = CTX_PROPERTY_IDLIST;
+ property_kind = CTX_PROPERTY_NAME_LIST;
break;
case 'i': /* implementation */
selectors = omp_implementation_selectors;
allow_user = true;
property_limit = 3;
- property_kind = CTX_PROPERTY_IDLIST;
+ property_kind = CTX_PROPERTY_NAME_LIST;
break;
case 'u': /* user */
selectors = omp_user_selectors;
@@ -40519,6 +40519,11 @@ cp_parser_omp_context_selector (cp_parser *parser, tree set, bool has_parms_p)
if (strcmp (selectors[i], IDENTIFIER_POINTER (selector)) == 0)
break;
}
+ if (property_kind == CTX_PROPERTY_NAME_LIST
+ && IDENTIFIER_POINTER (set)[0] == 'i'
+ && strcmp (IDENTIFIER_POINTER (selector),
+ "atomic_default_mem_order") == 0)
+ property_kind = CTX_PROPERTY_ID;
cp_lexer_consume_token (parser->lexer);
@@ -40607,21 +40612,40 @@ cp_parser_omp_context_selector (cp_parser *parser, tree set, bool has_parms_p)
}
while (1);
break;
- case CTX_PROPERTY_IDLIST:
+ case CTX_PROPERTY_ID:
+ if (cp_lexer_next_token_is (parser->lexer, CPP_KEYWORD)
+ || cp_lexer_next_token_is (parser->lexer, CPP_NAME))
+ {
+ tree prop = cp_lexer_peek_token (parser->lexer)->u.value;
+ cp_lexer_consume_token (parser->lexer);
+ properties = tree_cons (prop, NULL_TREE, properties);
+ }
+ else
+ {
+ cp_parser_error (parser, "expected identifier");
+ return error_mark_node;
+ }
+ break;
+ case CTX_PROPERTY_NAME_LIST:
do
{
- tree prop;
+ tree prop = NULL_TREE, value = NULL_TREE;
if (cp_lexer_next_token_is (parser->lexer, CPP_KEYWORD)
|| cp_lexer_next_token_is (parser->lexer, CPP_NAME))
- prop = cp_lexer_peek_token (parser->lexer)->u.value;
+ {
+ prop = cp_lexer_peek_token (parser->lexer)->u.value;
+ cp_lexer_consume_token (parser->lexer);
+ }
+ else if (cp_lexer_next_token_is (parser->lexer, CPP_STRING))
+ value = cp_parser_string_literal (parser, false, false);
else
{
- cp_parser_error (parser, "expected identifier");
+ cp_parser_error (parser, "expected identifier or "
+ "string literal");
return error_mark_node;
}
- cp_lexer_consume_token (parser->lexer);
- properties = tree_cons (prop, NULL_TREE, properties);
+ properties = tree_cons (prop, value, properties);
if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
cp_lexer_consume_token (parser->lexer);
@@ -40668,7 +40692,8 @@ cp_parser_omp_context_selector (cp_parser *parser, tree set, bool has_parms_p)
properties = nreverse (properties);
}
- else if (property_kind == CTX_PROPERTY_IDLIST
+ else if (property_kind == CTX_PROPERTY_NAME_LIST
+ || property_kind == CTX_PROPERTY_ID
|| property_kind == CTX_PROPERTY_EXPR)
{
cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);