Hi! On Thu, 03 Dec 2015 09:51:31 +0100, I wrote: > 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?)
Oh wait, it looks like the C++ front end is not actually using the functions defined in the C/C++-shared gcc/c-family/c-omp.c, but has its own implementations in gcc/cp/semantics.c, without "c_" prefixes? In addition to finish_expr_stmt calls, I see it's also using finish_call_expr instead of build_call_expr_loc/build_call_expr_loc_vec. So I guess we'll want to model this the same way for OpenACC support functions, and then (later) we should clean this up, to move the C-specific code from gcc/c-family/c-omp.c into the C front end? (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