https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121500

--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <[email protected]>:

https://gcc.gnu.org/g:24f012160c856e560b8e7fcd4ea9d51863fecebb

commit r16-7523-g24f012160c856e560b8e7fcd4ea9d51863fecebb
Author: Patrick Palka <[email protected]>
Date:   Sun Feb 15 12:36:38 2026 -0500

    c++: non-trivial by-value deducing this lambda [PR121500]

    Here the lambda has a by-value capture of non-trivial type, which
    in turn makes the closure type non-trivial.  This means its by-value
    'this' parameter, which gets deduced to the closure type, becomes an
    invisiref parameter, and so when lowering the operator() body we need to
    adjust uses of 'this' by adding implicit dereferences.

    But the GIMPLE dump for operator() shows that we miss some adjustments:

      bool main()::<lambda(this auto:1)>::operator()<main()::<lambda(this
auto:1)> > (struct ._anon_0 & self)
      {
        bool D.3091;
        struct ._anon_0 & self.1;
        struct A a [value-expr: self.__a]; // should be self->__a

        self.1 = self;
        _1 = self.1.__a.n; // should be self.1->__a
        D.3091 = _1 == 42;
        return D.3091;
      }

    Apparently this is because cp_genericize_r, which is responsible for the
    invisiref use adjustments, never walks DECL_VALUE_EXPR.  This patch makes
    us walk it.  For GCC 16, restrict the walking to xobj lambdas.

            PR c++/121500

    gcc/cp/ChangeLog:

            * cp-gimplify.cc (cp_genericize_r): Walk DECL_VALUE_EXPR within
            an xobj lambda.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp23/explicit-obj-lambda20.C: New test.

    Reviewed-by: Jason Merrill <[email protected]>
  • [Bug c++/121500] lambda with by... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to