diff options
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/cp/parser.c | 16 | ||||
-rw-r--r-- | gcc/cp/pt.c | 2 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 39 |
4 files changed, 59 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9b0a34c..c1e977b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,17 @@ +2019-08-07 Jakub Jelinek <jakub@redhat.com> + + * parser.c (cp_parser_omp_clause_name): Parse use_device_addr clause. + (cp_parser_omp_all_clauses): Handle PRAGMA_OMP_CLAUSE_USE_DEVICE_ADDR. + (OMP_TARGET_DATA_CLAUSE_MASK): Add PRAGMA_OMP_CLAUSE_USE_DEVICE_ADDR. + (cp_parser_omp_target_data): Handle PRAGMA_OMP_CLAUSE_USE_DEVICE_ADDR + like PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR, adjust diagnostics about no + map or use_device_* clauses. + * semantics.c (finish_omp_clauses): For OMP_CLAUSE_USE_DEVICE_PTR + in OpenMP, require pointer or reference to pointer type rather than + pointer or array or reference to pointer or array type. Handle + OMP_CLAUSE_USE_DEVICE_ADDR. + * pt.c (tsubst_omp_clauses): Handle OMP_CLAUSE_USE_DEVICE_ADDR. + 2019-08-06 Jason Merrill <jason@redhat.com> PR c++/91378 - ICE with noexcept and auto return type. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 79da7b5..4d07a6a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -32648,6 +32648,8 @@ cp_parser_omp_clause_name (cp_parser *parser) result = PRAGMA_OMP_CLAUSE_UNTIED; else if (!strcmp ("use_device", p)) result = PRAGMA_OACC_CLAUSE_USE_DEVICE; + else if (!strcmp ("use_device_addr", p)) + result = PRAGMA_OMP_CLAUSE_USE_DEVICE_ADDR; else if (!strcmp ("use_device_ptr", p)) result = PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR; break; @@ -35637,6 +35639,11 @@ cp_parser_omp_all_clauses (cp_parser *parser, omp_clause_mask mask, clauses); c_name = "use_device_ptr"; break; + case PRAGMA_OMP_CLAUSE_USE_DEVICE_ADDR: + clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_USE_DEVICE_ADDR, + clauses); + c_name = "use_device_addr"; + break; case PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR: clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_IS_DEVICE_PTR, clauses); @@ -38715,7 +38722,8 @@ cp_parser_omp_teams (cp_parser *parser, cp_token *pragma_tok, ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP) \ | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF) \ - | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR)) + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR) \ + | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_USE_DEVICE_ADDR)) static tree cp_parser_omp_target_data (cp_parser *parser, cp_token *pragma_tok, bool *if_p) @@ -38751,7 +38759,8 @@ cp_parser_omp_target_data (cp_parser *parser, cp_token *pragma_tok, bool *if_p) *pc = OMP_CLAUSE_CHAIN (*pc); continue; } - else if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_USE_DEVICE_PTR) + else if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_USE_DEVICE_PTR + || OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_USE_DEVICE_ADDR) map_seen = 3; pc = &OMP_CLAUSE_CHAIN (*pc); } @@ -38761,7 +38770,8 @@ cp_parser_omp_target_data (cp_parser *parser, cp_token *pragma_tok, bool *if_p) if (map_seen == 0) error_at (pragma_tok->location, "%<#pragma omp target data%> must contain at least " - "one %<map%> or %<use_device_ptr%> clause"); + "one %<map%>, %<use_device_ptr%> or %<use_device_addr%> " + "clause"); return NULL_TREE; } diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b71fbaad..b1ad99d 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -16303,6 +16303,7 @@ tsubst_omp_clauses (tree clauses, enum c_omp_region_type ort, case OMP_CLAUSE_MAP: case OMP_CLAUSE_NONTEMPORAL: case OMP_CLAUSE_USE_DEVICE_PTR: + case OMP_CLAUSE_USE_DEVICE_ADDR: case OMP_CLAUSE_IS_DEVICE_PTR: case OMP_CLAUSE_INCLUSIVE: case OMP_CLAUSE_EXCLUSIVE: @@ -16427,6 +16428,7 @@ tsubst_omp_clauses (tree clauses, enum c_omp_region_type ort, case OMP_CLAUSE_IN_REDUCTION: case OMP_CLAUSE_TASK_REDUCTION: case OMP_CLAUSE_USE_DEVICE_PTR: + case OMP_CLAUSE_USE_DEVICE_ADDR: case OMP_CLAUSE_IS_DEVICE_PTR: case OMP_CLAUSE_INCLUSIVE: case OMP_CLAUSE_EXCLUSIVE: diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index fa69624..77e7a6d 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -7524,20 +7524,41 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort) { tree type = TREE_TYPE (t); if (!TYPE_PTR_P (type) - && TREE_CODE (type) != ARRAY_TYPE - && (!TYPE_REF_P (type) - || (!TYPE_PTR_P (TREE_TYPE (type)) - && TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))) + && (!TYPE_REF_P (type) || !TYPE_PTR_P (TREE_TYPE (type)))) { - error_at (OMP_CLAUSE_LOCATION (c), - "%qs variable is neither a pointer, nor an array " - "nor reference to pointer or array", - omp_clause_code_name[OMP_CLAUSE_CODE (c)]); - remove = true; + if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_PTR + && ort == C_ORT_OMP) + { + error_at (OMP_CLAUSE_LOCATION (c), + "%qs variable is neither a pointer " + "nor reference to pointer", + omp_clause_code_name[OMP_CLAUSE_CODE (c)]); + remove = true; + } + else if (TREE_CODE (type) != ARRAY_TYPE + && (!TYPE_REF_P (type) + || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE)) + { + error_at (OMP_CLAUSE_LOCATION (c), + "%qs variable is neither a pointer, nor an " + "array nor reference to pointer or array", + omp_clause_code_name[OMP_CLAUSE_CODE (c)]); + remove = true; + } } } goto check_dup_generic; + case OMP_CLAUSE_USE_DEVICE_ADDR: + field_ok = true; + t = OMP_CLAUSE_DECL (c); + if (!processing_template_decl + && (VAR_P (t) || TREE_CODE (t) == PARM_DECL) + && !TYPE_REF_P (TREE_TYPE (t)) + && !cxx_mark_addressable (t)) + remove = true; + goto check_dup_generic; + case OMP_CLAUSE_NOWAIT: case OMP_CLAUSE_DEFAULT: case OMP_CLAUSE_UNTIED: |