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

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

https://gcc.gnu.org/g:a8ecf4580442e463c3a023b6724fb27e6b7e0804

commit r16-4210-ga8ecf4580442e463c3a023b6724fb27e6b7e0804
Author: Nathaniel Shead <[email protected]>
Date:   Sat Sep 20 23:12:17 2025 +1000

    c++/modules: Handle naming external TU-local entities in ADL

    This finishes the reworking of ADL handling for modules for PR117658.
    [basic.link] p18 says that we should diagnose any references to a
    TU-local entity from a different TU; with our fixed handling of ADL this
    is now possible to occur.

    To do this we need to generate fake bindings for these decls on
    stream-out so that importers know that we have a visible name in this
    namespace.  We don't actually need (or want) to provide full DECLs
    though, as that could potentially involve streaming other TU-local
    entities, so we just build a TU_LOCAL_ENTITY for the decl on receipt.
    The patch also uses 'decl_as_string' to give a more descriptive name for
    these decls when erroring.

    We also need somewhere to store these decls.  We only actually need the
    decls for diagnostics; for correctness we only need to know whether any
    such decls existed, so to not mess with the existing packing of bindings
    or usages of the OVERLOADs this patch adds a new map to the binding
    vector that can be looked up when diagnostics need to be generated.

    Finally, as specified this diagnostic is a pretty broad hammer, as any
    internal-linkage purview function will stop ADL in exported templates
    from working with that name.  So this patch just makes it a pedwarn and
    provides an option to disable if needed.

            PR c++/117658

    gcc/c-family/ChangeLog:

            * c.opt: New flag '-Wexternal-tu-local'.
            * c.opt.urls: Regenerate.

    gcc/cp/ChangeLog:

            * cp-tree.h (TU_LOCAL_ENTITY_NAME): Clarify meaning.
            * module.cc (depset::entity_kind): New enumerator, assert that
            we have enough bits reserved.
            (depset::disc_bits): Assert the discriminator has enough bits.
            (depset::entity_kind_name): Add 'tu-local' case, assert we
            have an entry for all relevant entry_kinds.
            (name_for_tu_local_decl): New function.
            (trees_out::tree_node): Use it.
            (depset::hash::make_dependency): Validate EK_TU_LOCAL.
            (depset::hash::add_binding_entity): Generate bindings for
            internal purview functions.
            (enum ct_bind_flags): New enum for TU-local decls.
            (depset::hash::find_dependencies): Handle EK_TU_LOCAL entities.
            (binding_cmp): Likewise.
            (sort_cluster): Likewise.
            (module_state::write_cluster): Likewise.
            (module_state::read_cluster): Likewise.
            * name-lookup.cc (append_imported_binding_slot): Propagate
            internal decl list when growing binding vector.
            (name_lookup::adl_namespace_fns): Diagnose if naming a TU-local
            entity from a different TU.
            (set_module_binding): Include any internal decls in binding.
            * name-lookup.h (struct module_tree_map_traits): New type.
            (struct tree_binding_vec): Add member 'internal_decls'.
            (BINDING_VECTOR_INTERNAL_DECLS): New getter.
            (MODULE_BINDING_INTERNAL_DECLS_P): New flag.
            (set_module_binding): Add parameter.

    gcc/ChangeLog:

            * doc/invoke.texi: Document '-Wno-external-tu-local'.

    gcc/testsuite/ChangeLog:

            * g++.dg/modules/adl-6_c.C: Adjust diagnostics.
            * g++.dg/modules/internal-14_c.C: Likewise.
            * g++.dg/modules/internal-15_a.C: New test.
            * g++.dg/modules/internal-15_b.C: New test.

    Signed-off-by: Nathaniel Shead <[email protected]>
    Reviewed-by: Jason Merrill <[email protected]>

Reply via email to