On Tue, Nov 16, 2021 at 08:43:27PM +0800, Chung-Lin Tang wrote: > 2021-11-16 Chung-Lin Tang <clt...@codesourcery.com> > > PR middle-end/92120 > > gcc/cp/ChangeLog: > > * semantics.c (handle_omp_array_sections_1): Add handling to create ... > (finish_omp_target_clauses): New function.
Just calling current_nonlambda_class_type in static member functions returns non-NULL, but something that isn't *this and if unlucky can match part of the IL and can be added to target clauses. if (DECL_NONSTATIC_MEMBER_P (decl) && current_class_ptr) is a guard used elsewhere (in check_accessibility_of_qualified_id). Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk, queued for 12.3 backport. 2022-09-07 Jakub Jelinek <ja...@redhat.com> PR c++/106829 * semantics.cc (finish_omp_target_clauses): If current_function_decl isn't a nonstatic member function, don't set data.current_object to non-NULL. * g++.dg/gomp/pr106829.C: New test. --- gcc/cp/semantics.cc.jj 2022-09-03 09:41:34.892005463 +0200 +++ gcc/cp/semantics.cc 2022-09-06 15:00:33.253199294 +0200 @@ -9555,16 +9555,15 @@ finish_omp_target_clauses (location_t lo { omp_target_walk_data data; data.this_expr_accessed = false; + data.current_object = NULL_TREE; - tree ct = current_nonlambda_class_type (); - if (ct) - { - tree object = maybe_dummy_object (ct, NULL); - object = maybe_resolve_dummy (object, true); - data.current_object = object; - } - else - data.current_object = NULL_TREE; + if (DECL_NONSTATIC_MEMBER_P (current_function_decl) && current_class_ptr) + if (tree ct = current_nonlambda_class_type ()) + { + tree object = maybe_dummy_object (ct, NULL); + object = maybe_resolve_dummy (object, true); + data.current_object = object; + } if (DECL_LAMBDA_FUNCTION_P (current_function_decl)) { --- gcc/testsuite/g++.dg/gomp/pr106829.C.jj 2022-09-06 15:03:44.305635408 +0200 +++ gcc/testsuite/g++.dg/gomp/pr106829.C 2022-09-06 15:03:12.987055704 +0200 @@ -0,0 +1,15 @@ +// PR c++/106829 + +namespace std +{ + template <typename> class complex; + template <> struct complex<double> { complex (double); _Complex double d; }; +} +struct S { void static foo (); }; + +void +S::foo () +{ +#pragma omp target + std::complex<double> c = 0.0; +} Jakub