On Thu, Aug 30, 2018 at 3:31 PM, Julian Brown <jul...@codesourcery.com> wrote: > This patch (by Joseph) allows "this" to be used in OpenACC directives, > following -- IIUC -- the behaviour of other compilers. The standard (as > of OpenACC 2.5) does not appear to have explicit language either > permitting or forbidding such usage. > > Joseph's original commentary is in the bug report (ca. 2015, > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66053): > > "This patch, for gomp-4_0-branch, adds support for C++ "this" in > OpenACC directives. (This patch does not do anything to handle OpenMP > differently from OpenACC; that - bug 66053 - will need to be resolved > for mainline, either deciding these cases should be accepted for > OpenMP or making the parsing only accept them in OpenACC directives > and not OpenMP ones.) > > "Apart from parsing, it's necessary to prevent the "cannot take the > address of 'this', which is an rvalue expression" error from appearing > when "this" is used in such contexts. This patch duly adds a new > argument to cxx_mark_addressable (default false so callers don't all > need to change) to allow disabling that error, passing that argument > in all calls that seem relevant to OpenACC directives." > > AFAICT though, this attached version of the patch does still forbid > "this" in OpenMP directives (apart from "declare simd"). I couldn't see > that there was any change to the OpenMP spec language in 4.5. > > Tested with offloading to NVPTX and bootstrapped. > > OK to apply? > > Julian > > ChangeLog > > 20xx-xx-xx Joseph Myers <jos...@codesourcery.com> > > PR C++/66053 > > gcc/cp/ > * cp-tree.h (enum cxx_mark_addressable_flags): New. > (cxx_mark_addressable): Use it. Adjust users. > * parser.c (cp_parser_omp_var_list_no_open): Handle RID_THIS. > * semantics.c (handle_omp_array_sections_1) > (handle_omp_array_sections, finish_omp_reduction_clause) > (finish_omp_clauses): Pass CXX_MARK_ADDRESSABLE_FLAGS_ALLOW_THIS > to cxx_mark_addressable. Enforce "this" usage limitation only > for OpenMP. > * typeck.c (cp_build_array_ref): Adjust cxx_mark_addressble > call. (cxx_mark_addressable): Handle > CXX_MARK_ADDRESSABLE_FLAGS_ALLOW_THIS. > > libgomp/ > * testsuite/libgomp.oacc-c++/this.C: New test.
Why does referring to this[0:1] require making 'this' addressable? Surely what we're interested in is the value of 'this', not the address. Jason