On Thu, Nov 10, 2016 at 06:46:16PM +0800, Chung-Lin Tang wrote: > 2016-XX-XX Nathan Sidwell <nat...@codesourcery.com> > > c/ > * c-parser.c (c_parser_omp_clause_collapse): Disallow tile. > (c_parser_oacc_clause_tile): Disallow collapse. Fix parsing and > semantic checking. > * c-parser.c (c_parser_omp_for_loop): Accept tiling constructs. > > cp/ > * parser.c (cp_parser_oacc_clause_tile): Disallow collapse. Fix > parsing. Parse constant expression. Remove semantic checking. > (cp_parser_omp_clause_collapse): Disallow tile. > (cp_parser_omp_for_loop): Deal with tile clause. Don't emit a
Similarly to the previous patch, some lines have spaces instead of tabs. > parse error about missing for after already emitting one. > Use more conventional for idiom for unbounded loop. > * pt.c (tsubst_omp_clauses): Require integral constant expression > for COLLAPSE and TILE. Remove broken TILE subst. > * semantics.c (finish_omp_clauses): Correct TILE semantic check. > (finish_omp_for): Deal with tile clause. > > gcc/testsuite/ > * c-c++-common/goacc/loop-auto-1.c: Adjust and add additional > case. > * c-c++-common/goacc/loop-auto-2.c: New. > * c-c++-common/goacc/tile.c: Include stdbool, fix expected errors. > * g++.dg/goacc/template.C: Test tile subst. Adjust erroneous > uses. > * g++.dg/goacc/tile-1.C: Check tile subst. > * gcc.dg/goacc/loop-processing-1.c: Adjust dg-final pattern. > + if (!INTEGRAL_TYPE_P (TREE_TYPE (expr)) > + || TREE_CODE (expr) != INTEGER_CST No need to test for INTEGER_CST, tree_fits_shwi_p will test that. > + || !tree_fits_shwi_p (expr) > + || tree_to_shwi (expr) <= 0) > { > - warning_at (expr_loc, 0,"%<tile%> value must be positive"); > - expr = integer_one_node; > + error_at (expr_loc, "%<tile%> argument needs positive" > + " integral constant"); > + expr = integer_zero_node; > } > } > @@ -14713,6 +14713,7 @@ tsubst_omp_clauses (tree clauses, enum c_omp_regio > nc = copy_node (oc); > OMP_CLAUSE_CHAIN (nc) = new_clauses; > new_clauses = nc; > + bool needs_ice = false; > > switch (OMP_CLAUSE_CODE (nc)) > { > @@ -14742,10 +14743,16 @@ tsubst_omp_clauses (tree clauses, enum c_omp_regio > = tsubst_omp_clause_decl (OMP_CLAUSE_DECL (oc), args, complain, > in_decl); > break; > + case OMP_CLAUSE_COLLAPSE: > + case OMP_CLAUSE_TILE: > + /* These clauses really need a positive integral constant > + expression, but we don't have a predicate for that > + (yet). */ > + needs_ice = true; > + /* FALLTHRU */ As I said earlier on gcc-patches, no need to change anything for OMP_CLAUSE_COLLAPSE, we require that the argument is a constant integer already at parsing time, it can't be e.g. a template integral parameter. And for OMP_CLAUSE_TILE, please avoid the needs_ice var, instead don't fall through into the tsubst_expr and copy it over and change the argument there instead, it is short enough. > + if (TREE_CODE (t) != INTEGER_CST > + || !tree_fits_shwi_p (t) Again, no need to check for INTEGER_CST when tree_fits_shwi_p will do that. Jakub