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

--- Comment #1 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:852b58552991099141f9df5782e1f28d8606af9d

commit r14-9267-g852b58552991099141f9df5782e1f28d8606af9d
Author: Nathaniel Shead <nathanielosh...@gmail.com>
Date:   Fri Mar 1 11:08:23 2024 +1100

    c++: Stream definitions for implicit instantiations [PR114170]

    An implicit instantiation has an initializer depending on whether
    DECL_INITIALIZED_P is set (like normal VAR_DECLs) which needs to be
    written to ensure that consumers of header modules properly emit
    definitions for these instantiations. This patch ensures that we
    correctly fallback to checking this flag when DECL_INITIAL is not set
    for a template instantiation.

    For variables with non-trivial dynamic initialization, DECL_INITIAL can
    be empty after 'split_nonconstant_init' but DECL_INITIALIZED_P is still
    set; we need to check the latter to determine if we need to go looking
    for a definition to emit (often in 'static_aggregates' here). This is
    the case in the linked testcase.

    However, for template specialisations (not instantiations?) we primarily
    care about DECL_INITIAL; if the variable has initialization depending on
    a template parameter then we'll need to emit that definition even though
    it doesn't yet have DECL_INITIALIZED_P set; this is the case in e.g.

      template <int N> int value = N;

    As a drive-by fix, also ensures that the count of initializers matches
    the actual number of initializers written. This doesn't seem to be
    necessary for correctness in the current testsuite, but feels wrong and
    makes debugging harder when initializers aren't properly written for
    other reasons.

            PR c++/114170

    gcc/cp/ChangeLog:

            * module.cc (has_definition): Fall back to DECL_INITIALIZED_P
            when DECL_INITIAL is not set on a template.
            (module_state::write_inits): Only increment count when
            initializers are actually written.

    gcc/testsuite/ChangeLog:

            * g++.dg/modules/var-tpl-2_a.H: New test.
            * g++.dg/modules/var-tpl-2_b.C: New test.

    Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>

Reply via email to