On Mon, Jul 29, 2019 at 10:00:53PM +0100, Kwok Cheung Yeung wrote: > --- a/gcc/omp-low.c > +++ b/gcc/omp-low.c > @@ -11636,9 +11636,40 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, > omp_context *ctx) > tkind = GOMP_MAP_FIRSTPRIVATE_INT; > type = TREE_TYPE (ovar); > if (TREE_CODE (type) == ARRAY_TYPE) > - var = build_fold_addr_expr (var); > + { > + var = build_fold_addr_expr (var); > + gimplify_assign (x, var, &ilist); > + } > else > { > + tree opt_arg_label; > + bool optional_arg_p > + = TREE_CODE (TREE_TYPE (ovar)) == POINTER_TYPE > + && omp_is_optional_argument (ovar);
This should be also wrapped in ()s for emacs, like: bool optional_arg_p = (TREE_CODE (TREE_TYPE (ovar)) == POINTER_TYPE && omp_is_optional_argument (ovar)); > + > + if (optional_arg_p) > + { > + tree null_label > + = create_artificial_label (UNKNOWN_LOCATION); > + tree notnull_label > + = create_artificial_label (UNKNOWN_LOCATION); > + opt_arg_label > + = create_artificial_label (UNKNOWN_LOCATION); > + tree new_x = copy_node (x); Please use unshare_expr instead of copy_node here. Otherwise LGTM. On the OpenMP side this isn't sufficient, because it only handles mapping clauses, not the data sharing, so I guess I'll need to go through all data sharing clauses on all constructs, write testcases and see if what OpenMP spec says (just a general rule): "If a list item that appears in a directive or clause is an optional dummy argument that is not present, the directive or clause for that list item is ignored. If the variable referenced inside a construct is an optional dummy argument that is not present, any explicitly determined, implicitly determined, or predetermined data-sharing and data-mapping attribute rules for that variable are ignored. Otherwise, if the variable is an optional dummy argument that is present, it is present inside the construct." is handled right. Jakub