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

--- Comment #4 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:d6bf4b1c93221118b3008a878ec508f6412dfc55

commit r15-2003-gd6bf4b1c93221118b3008a878ec508f6412dfc55
Author: Nathaniel Shead <nathanielosh...@gmail.com>
Date:   Thu Jun 27 11:08:15 2024 +1000

    c++: Introduce USING_DECLs for non-function usings [PR114683]

    With modules, a non-function using-declaration is not completely
    interchangable with the declaration that it refers to; in particular,
    such a using-declaration may be exported without revealing the name of
    the entity it refers to.

    This patch fixes this by building USING_DECLs for all using-declarations
    that bind a non-function from a different scope.  These new decls can
    than have purviewness and exportingness attached to them without
    affecting the decl that they refer to.

    We do this for all such usings, not just usings that may be revealed in
    a module; this way we can verify the change in representation against
    the (more comprehensive) non-modules testsuites, and in a future patch
    we can use the locations of these using-decls to enhance relevant
    diagnostics.

    Another possible approach would be to reuse OVERLOADs for this, as is
    already done within add_binding_entity for modules.  I didn't do this
    because lots of code (as well as the names of the accessors) makes
    assumptions that OVERLOADs refer to function overload sets, and so
    splitting this up reduced semantic burden and made it easier to avoid
    unintentional changes.  This did mean that we need to move out the
    definitions of ovl_iterator::{purview,exporting}_p, because the
    structures for module decls are declared later on in cp-tree.h.

    Building USING_DECLs changed a couple of code paths when adjusting
    bindings; in particular, pushdecl recognises global using-declarations
    as usings now, and so checks fall through to update_binding.  To not
    regress g++.dg/lookup/linkage2.C the checks for 'extern' declarations no
    longer were sufficient (they don't handle 'extern "C"'); but
    duplicate_decls performed all the relevant checks anyway.

    Otherwise in general we strip using-decls from all lookup_* functions
    where necessary.  Over time for diagnostics purposes it would probably
    be good to slowly revert this (especially e.g. lookup_elaborated_type
    causes some diagnostic quality regressions here) but this patch doesn't
    do so to minimise churn.

    This patch also tries not to build USING_DECLs when just redeclaring an
    existing declaration, and instead reveals that declaration in-place.
    This requires reworking some logic handling CONST_DECLs in module
    streaming, since a non-using CONST_DECL may now be exported indepenently
    of its containing enum.

    'add_binding_entity' needs to explicitly write the names of unscoped
    enumerators so that lazy loading will trigger when the name is found by
    name lookup; it does this by pretending that the enum declarations are
    always usings so that it doesn't double-write definitions.  By also
    checking if the enumerator was marked purview/exported we can use that
    to override a non-purview/non-exported TYPE_DECL and ensure it's made
    visible regardless.

    When reading we should get the exported flag on the enumeration
    constant, and so should properly create a binding for it.  We don't need
    to do anything to handle importedness as that checking is skipped for
    EK_USINGs.

    Some other places assume that module information for a CONST_DECL
    inherits module information from its containing type.  This includes:

    - get_originating_module_decl, for determining if the name was imported
      or has module attachment; I don't /think/ this change should affect
      that, so I'm leaving this untouched.

    - binding_cmp, for sorting by exportedness; since now an enumerator
      could be exported without the containing decl being exported, we need
      to handle this here too.

            PR c++/114683

    gcc/cp/ChangeLog:

            * cp-tree.h (class ovl_iterator): Move definitions of purview_p
            and exporting_p to name-lookup.cc.
            * module.cc (depset::hash::add_binding_entity): Strip
            using-decls.  Remove workarounds.  Handle CONST_DECLs with
            different purview/exported from their enum.
            (enum ct_bind_flags): Remove unnecessary cbf_wrapped flag.
            (module_state::write_cluster): Likewise.
            (module_state::read_cluster): Build USING_DECL for non-function
            usings.
            (binding_cmp): Handle CONST_DECLs with different purview and/or
            exported from their enum.
            (set_instantiating_module): Support CONST_DECLs.
            * name-lookup.cc (get_fixed_binding_slot): Strip USING_DECLs.
            (name_lookup::process_binding): Strip USING_DECLs.
            (name_lookup::process_module_binding): Remove workaround.
            (update_binding): Strip USING_DECLs, remove incorrect check for
            non-extern variables.
            (ovl_iterator::purview_p): Support USING_DECLs.
            (ovl_iterator::exporting_p): Support USING_DECLs.
            (walk_module_binding): Handle stat hack type.
            (do_nonmember_using_decl): Strip USING_DECLs when comparing;
            build USING_DECLs for non-function usings in different scope
            rather than binding directly.
            (get_namespace_binding): Strip USING_DECLs.
            (lookup_name): Strip USING_DECLs.
            (lookup_elaborated_type): Strip USING_DECLs.
            * decl.cc (poplevel): Still support -Wunused for using-decls.
            (lookup_and_check_tag): Remove unnecessary strip_using_decl.
            * parser.cc (cp_parser_template_name): Likewise.
            (cp_parser_nonclass_name): Likewise.
            (cp_parser_class_name): Likewise.

    gcc/testsuite/ChangeLog:

            * g++.dg/lookup/using29.C: Update errors.
            * g++.dg/lookup/using53.C: Update errors, add XFAILs.
            * g++.dg/modules/using-22_b.C: Remove xfails.
            * g++.dg/warn/Wunused-var-18.C: Update error, add check.
            * g++.dg/lookup/using68.C: New test.
            * g++.dg/modules/using-24_a.C: New test.
            * g++.dg/modules/using-24_b.C: New test.
            * g++.dg/modules/using-25_a.C: New test.
            * g++.dg/modules/using-25_b.C: New test.
            * g++.dg/modules/using-enum-4_a.C: New test.
            * g++.dg/modules/using-enum-4_b.C: New test.
            * g++.dg/modules/using-enum-4_c.C: New test.

    Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
    Reviewed-by: Jason Merrill <ja...@redhat.com>

Reply via email to