Hi Chung-Lin! On Mon, 23 Nov 2015 21:15:00 +0800, Chung-Lin Tang <clt...@codesourcery.com> wrote: > The OpenACC wait directive is represented as a call to the runtime > function "GOACC_wait" instead of a tree code. I am seeing when > '#pragma acc wait' is using inside a template function, the CALL_EXPR > to GOACC_wait is being silently ignored/removed during tsubst_expr().
Uh. > I think the correct way to organize this is that the call should be inside > an EXPR_STMT, so here's a patch to do that; basically remove the > add_stmt() call from the shared c_finish_oacc_wait() code, and add > add_stmt()/finish_expr_stmt() in the corresponding C/C++ parts. > > Tested with no regressions on trunk, okay to commit? > --- c-family/c-omp.c (revision 230703) > +++ c-family/c-omp.c (working copy) > @@ -63,7 +63,6 @@ c_finish_oacc_wait (location_t loc, tree parms, tr > } > > stmt = build_call_expr_loc_vec (loc, stmt, args); > - add_stmt (stmt); > > vec_free (args); | | return stmt; | } I see in gcc/c/c-omp.c that several other c_finish_omp_* functions that build builtin calls instead of tree nodes, do similar things like c_finish_oacc_wait; I'd like to understand why it's -- presumably -- not a problem for these: c_finish_omp_barrier, c_finish_omp_taskwait, c_finish_omp_taskyield, c_finish_omp_flush? (Jakub?) > --- c/c-parser.c (revision 230703) > +++ c/c-parser.c (working copy) > @@ -13886,6 +13886,7 @@ c_parser_oacc_wait (location_t loc, c_parser *pars > strcpy (p_name, " wait"); > clauses = c_parser_oacc_all_clauses (parser, OACC_WAIT_CLAUSE_MASK, > p_name); > stmt = c_finish_oacc_wait (loc, list, clauses); > + add_stmt (stmt); > > return stmt; > } > --- cp/parser.c (revision 230703) > +++ cp/parser.c (working copy) > @@ -34930,6 +34930,7 @@ cp_parser_oacc_wait (cp_parser *parser, cp_token * > "#pragma acc wait", pragma_tok); > > stmt = c_finish_oacc_wait (loc, list, clauses); > + stmt = finish_expr_stmt (stmt); > > return stmt; > } Grüße Thomas
signature.asc
Description: PGP signature