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 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.