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

--- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Nathaniel Shead <nsh...@gcc.gnu.org>:

https://gcc.gnu.org/g:5b85364a6dd0bbfd3e26d3346b075a0819be7cd4

commit r16-3353-g5b85364a6dd0bbfd3e26d3346b075a0819be7cd4
Author: Nathaniel Shead <nathanielosh...@gmail.com>
Date:   Fri Aug 22 15:15:01 2025 +1000

    c++/modules: Provide definitions of synthesized methods outside their
defining module [PR120499]

    In the PR, we're getting a linker error from _Vector_impl's destructor
    never getting emitted.  This is because of a combination of factors:

    1. in imp-member-4_a, the destructor is not used and so there is no
       definition generated.

    2. in imp-member-4_b, the destructor gets synthesized (as part of the
       synthesis for Coll's destructor) but is not ODR-used and so does not
       get emitted.  Despite there being a definition provided in this TU,
       the destructor is still considered imported and so isn't streamed
       into the module body.

    3. in imp-member-4_c, we need to ODR-use the destructor but we only got
       a forward declaration from imp-member-4_b, so we cannot emit a body.

    The point of failure here is step 2; this function has effectively been
    declared in the imp-member-4_b module, and so we shouldn't treat it as
    imported.  This way we'll properly stream the body so that importers can
    emit it.

            PR c++/120499

    gcc/cp/ChangeLog:

            * method.cc (synthesize_method): Set the instantiating module.

    gcc/testsuite/ChangeLog:

            * g++.dg/modules/imp-member-4_a.C: New test.
            * g++.dg/modules/imp-member-4_b.C: New test.
            * g++.dg/modules/imp-member-4_c.C: New test.

    Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
  • [Bug c++/120499] import std: in... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to