diff options
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 50 | ||||
-rw-r--r-- | gcc/c/c-typeck.c | 28 |
3 files changed, 85 insertions, 2 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index bb0573e..c58680c 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,12 @@ +2019-07-12 Jakub Jelinek <jakub@redhat.com> + + * c-parser.c (c_parser_omp_clause_name): Handle order clause. + (c_parser_omp_clause_order): New function. + (c_parser_omp_all_clauses): Handle PRAGMA_OMP_CLAUSE_ORDER. + (OMP_SIMD_CLAUSE_MASK, OMP_FOR_CLAUSE_MASK): Add + PRAGMA_OMP_CLAUSE_ORDER. + * c-typeck.c (c_finish_omp_clauses): Handle OMP_CLAUSE_ORDER. + 2019-07-10 Richard Biener <rguenther@suse.de> * gimple-parser.c (c_parser_gimple_postfix_expression): Support diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 3fa7e68..1f83c24 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -11789,6 +11789,8 @@ c_parser_omp_clause_name (c_parser *parser) case 'o': if (!strcmp ("ordered", p)) result = PRAGMA_OMP_CLAUSE_ORDERED; + else if (!strcmp ("order", p)) + result = PRAGMA_OMP_CLAUSE_ORDER; break; case 'p': if (!strcmp ("parallel", p)) @@ -13467,6 +13469,44 @@ c_parser_oacc_clause_wait (c_parser *parser, tree list) return list; } + +/* OpenMP 5.0: + order ( concurrent ) */ + +static tree +c_parser_omp_clause_order (c_parser *parser, tree list) +{ + location_t loc = c_parser_peek_token (parser)->location; + tree c; + const char *p; + + matching_parens parens; + if (!parens.require_open (parser)) + return list; + if (!c_parser_next_token_is (parser, CPP_NAME)) + { + c_parser_error (parser, "expected %<concurrent%>"); + goto out_err; + } + p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); + if (strcmp (p, "concurrent") != 0) + { + c_parser_error (parser, "expected %<concurrent%>"); + goto out_err; + } + c_parser_consume_token (parser); + parens.skip_until_found_close (parser); + /* check_no_duplicate_clause (list, OMP_CLAUSE_ORDER, "order"); */ + c = build_omp_clause (loc, OMP_CLAUSE_ORDER); + OMP_CLAUSE_CHAIN (c) = list; + return c; + + out_err: + parens.skip_until_found_close (parser); + return list; +} + + /* OpenMP 2.5: ordered @@ -15092,6 +15132,10 @@ c_parser_omp_all_clauses (c_parser *parser, omp_clause_mask mask, clauses = c_parser_omp_clause_num_threads (parser, clauses); c_name = "num_threads"; break; + case PRAGMA_OMP_CLAUSE_ORDER: + clauses = c_parser_omp_clause_order (parser, clauses); + c_name = "order"; + break; case PRAGMA_OMP_CLAUSE_ORDERED: clauses = c_parser_omp_clause_ordered (parser, clauses); c_name = "ordered"; @@ -17221,7 +17265,8 @@ omp_split_clauses (location_t loc, enum tree_code code, | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ - | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NONTEMPORAL)) + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NONTEMPORAL) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDER)) static tree c_parser_omp_simd (location_t loc, c_parser *parser, @@ -17277,7 +17322,8 @@ c_parser_omp_simd (location_t loc, c_parser *parser, | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SCHEDULE) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE) \ - | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT)) + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDER)) static tree c_parser_omp_for (location_t loc, c_parser *parser, diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 6419ca9..e4ce03d 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -13667,6 +13667,7 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort) tree last_iterators = NULL_TREE; bool last_iterators_remove = false; tree *nogroup_seen = NULL; + tree *order_clause = NULL; /* 1 if normal/task reduction has been seen, -1 if inscan reduction has been seen, -2 if mixed inscan/normal reduction diagnosed. */ int reduction_seen = 0; @@ -14631,6 +14632,25 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort) pc = &OMP_CLAUSE_CHAIN (c); continue; + case OMP_CLAUSE_ORDER: + if (ordered_clause) + { + error_at (OMP_CLAUSE_LOCATION (c), + "%<order%> clause must not be used together " + "with %<ordered%>"); + remove = true; + break; + } + else if (order_clause) + { + /* Silently remove duplicates. */ + remove = true; + break; + } + order_clause = pc; + pc = &OMP_CLAUSE_CHAIN (c); + continue; + case OMP_CLAUSE_IF: case OMP_CLAUSE_NUM_THREADS: case OMP_CLAUSE_NUM_TEAMS: @@ -14683,6 +14703,14 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort) case OMP_CLAUSE_ORDERED: ordered_clause = c; + if (order_clause) + { + error_at (OMP_CLAUSE_LOCATION (*order_clause), + "%<order%> clause must not be used together " + "with %<ordered%>"); + *order_clause = OMP_CLAUSE_CHAIN (*order_clause); + order_clause = NULL; + } pc = &OMP_CLAUSE_CHAIN (c); continue; |