diff options
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r-- | gcc/cp/parser.c | 49 |
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); |