On Wed, Nov 05, 2014 at 03:39:44PM -0600, James Norris wrote:
>       * c-typeck.c (c_finish_oacc_parallel, c_finish_oacc_kernels,
>       c_finish_oacc_data): New functions.
>       (handle_omp_array_sections, c_finish_omp_clauses):

Handle should be on the above line, no need to wrap too early.

> @@ -9763,6 +9830,10 @@ c_parser_omp_clause_name (c_parser *parser)
>         else if (!strcmp ("from", p))
>           result = PRAGMA_OMP_CLAUSE_FROM;
>         break;
> +     case 'h':
> +       if (!strcmp ("host", p))
> +         result = PRAGMA_OMP_CLAUSE_SELF;
> +       break;

Shouldn't this be PRAGMA_OMP_CLAUSE_HOST (PRAGMA_OACC_CLAUSE_HOST)
instead?  It is _HOST in the C++ patch, are there no C tests with
that clause covering it?

> +      tree v = TREE_PURPOSE (t);
> +
> +      /* FIXME diagnostics: Ideally we should keep individual
> +      locations for all the variables in the var list to make the
> +      following errors more precise.  Perhaps
> +      c_parser_omp_var_list_parens() should construct a list of
> +      locations to go along with the var list.  */

Like in C++ patch, please avoid the comment, file a PR instead,
or just queue the work for GCC 6.

> +      /* Attempt to statically determine when the number isn't positive.  */
> +      c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
> +                    build_int_cst (TREE_TYPE (t), 0));

build_int_cst not aligned below expr_loc.

> +      if (CAN_HAVE_LOCATION_P (c))
> +     SET_EXPR_LOCATION (c, expr_loc);
> +      if (c == boolean_true_node)
> +     {
> +       warning_at (expr_loc, 0,
> +                   "%<num_gangs%> value must be positive");

This would fit perfectly on one line.

> +  tree c, t;
> +  location_t loc = c_parser_peek_token (parser)->location;
> +
> +  /* TODO XXX: FIX -1  (acc_async_noval).  */
> +  t = build_int_cst (integer_type_node, -1);

Again, as in C++ patch, please avoid this.  Use gomp-constants.h,
or some enum, or explain what the -1 is, but avoid TODO XXX: FIX.

> +  else
> +    {
> +      t = c_fully_fold (t, false, NULL);
> +    }

Please avoid the {}s and reindent.

> -/* OpenMP 4.0:
> -   parallel
> -   for
> -   sections
> -   taskgroup */
> +      if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
> +     {
> +       c_parser_error (parser, "expected integer expression");
> +       return list;
> +     }
>  
> -static tree
> -c_parser_omp_clause_cancelkind (c_parser *parser ATTRIBUTE_UNUSED,
> -                             enum omp_clause_code code, tree list)
> -{
> -  tree c = build_omp_clause (c_parser_peek_token (parser)->location, code);
> +      /* Attempt to statically determine when the number isn't positive.  */
> +      c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
> +                    build_int_cst (TREE_TYPE (t), 0));

I wonder if it wouldn't be better to just put the new OpenACC routines
into a new block of code, not stick it in between the OpenMP handling
routines, because diff apparently lost track and I'm afraid so will svn 
blame/git blame
and we'll lose history for the OpenMP changes.

> +     case PRAGMA_OMP_CLAUSE_VECTOR_LENGTH:
> +       clauses = c_parser_omp_clause_vector_length (parser, clauses);
> +       c_name = "vector_length";
> +       break;

That is OpenACC clause, right?  Shouldn't the routine be called
c_parser_oacc_clause_vector_length?

> +     case PRAGMA_OMP_CLAUSE_WAIT:
> +       clauses = c_parser_oacc_clause_wait (parser, clauses);

E.g. c_parser_oacc_clause_wait is.

> +  clauses =  c_parser_oacc_all_clauses (parser, OACC_DATA_CLAUSE_MASK,
> +                                     "#pragma acc data");

Too many spaces after =.

> +/* OpenACC 2.0:
> +   # pragma acc kernels oacc-kernels-clause[optseq] new-line
> +     structured-block
> +
> +   LOC is the location of the #pragma token.

Again, what is LOC?

> +  clauses =  c_parser_oacc_all_clauses (parser, OACC_KERNELS_CLAUSE_MASK,
> +                                     p_name);

See above.

> +      c_parser_error (parser, enter
> +                   ? "expected %<data%> in %<#pragma acc enter data%>"
> +                   : "expected %<data%> in %<#pragma acc exit data%>");
> +      c_parser_skip_to_pragma_eol (parser);
> +      return;
> +    }
> +
> +  const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
> +  if (strcmp (p, "data") != 0)
> +    {
> +      c_parser_error (parser, "invalid pragma");

See the C++ patch review.

> +  if (find_omp_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE)
> +    {
> +      error_at (loc, enter
> +             ? "%<#pragma acc enter data%> has no data movement clause"
> +             : "%<#pragma acc exit data%> has no data movement clause");

Similarly (though, in this case C++ had unconditional acc enter data).

> +  clauses =  c_parser_oacc_all_clauses (parser, OACC_PARALLEL_CLAUSE_MASK,
> +                                     p_name);

See above.

> +  if (find_omp_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE)
> +    {
> +      error_at (loc,
> +             "%<#pragma acc update%> must contain at least one "
> +             "%<device%> or %<host/self%> clause");

There is no host/self clause, so you better write or %<host%> or
%<self%> clause?

Otherwise LGTM.

        Jakub

Reply via email to