[Bug c++/124794] [reflection] ICE on member function template splicing

"cvs-commit at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124794

--- Comment #10 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-16 branch has been updated by Marek Polacek
<[email protected]>:

https://gcc.gnu.org/g:4a459598063f4a7867aa142e9e1bf49479b91c13

commit r16-9572-g4a459598063f4a7867aa142e9e1bf49479b91c13
Author: Marek Polacek <[email protected]>
Date:   Fri Jul 31 11:57:14 2026 -0400

    c++/reflection: ICE with &template [:members_of():] [PR124794]

    Given

      struct C { template <class T> void f(T); };

    we handle "&template [:^^C::f:]" correctly because the spliced
    expression is

      BASELINK<OVERLOAD<TEMPLATE_DECL f>>, binfo C>

    which is fine: we have an OVERLOAD around the TEMPLATE_DECL and
    lookup_member wrapped the whole thing in a BASELINK.  But when
    we're splicing members_of(^^C, ac)[0], we ended up with

      OVERLOAD<TEMPLATE_DECL f>>

    and then go down the wrong path in cp_parser_splice_expression.

    splice already correctly adds the missing OVERLOAD but it also
    needs to (maybe) add a BASELINK.

    This patch also adjusts baselink_for_fns to gain a parameter
    controlling if we want to ignore currently_open_derived_class.
    It matters when we're in a member function of a class derived
    from C and the object argument of the -> is a different derived class,
    as exercised in splice17.C: pd->[:g1:] (42); in D2::mfn.  There, if
    we didn't ignore currently_open_derived_class, the BASELINK would
    use D2 as the access_binfo, which is wrong because it has no
    derivation relationship to the object type (here D1).  With this
    patch access_binfo will be C, which is what members_of gave us.

            PR c++/124794

    gcc/cp/ChangeLog:

            * cp-tree.h (baselink_for_fns): Adjust declaration.
            * parser.cc (cp_parser_reflect_expression): Adjust the call to
            baselink_for_fns.
            * reflect.cc (splice): Call baselink_for_fns.
            * semantics.cc (baselink_for_fns): Add a bool parameter.  If
            it's true, ignore currently_open_derived_class.

    gcc/testsuite/ChangeLog:

            * g++.dg/reflect/splice17.C: New test.

    Reviewed-by: Jason Merrill <[email protected]>
    (cherry picked from commit 8fb57eda04f88f4e0d1cbbcc209533fd9689dd9d)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.