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

--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jason Merrill <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:8158a4640819dbb3210326e37786fb874f450272

commit r10-6110-g8158a4640819dbb3210326e37786fb874f450272
Author: Jason Merrill <ja...@redhat.com>
Date:   Mon Jan 20 13:27:10 2020 -0500

    PR c++/91476 - anon-namespace reference temp clash between TUs.

    The problem in the PR was that make_temporary_var_for_ref_to_temp ran
before
    determine_visibility, so when we copied the linkage of the reference
    variable it had not yet been restricted by its anonymous namespace context,
    so the temporary wrongly ended up with TREE_PUBLIC set.  The natural
    solution is to run determine_visibility earlier.  But that needs to happen
    after maybe_commonize_var increases the linkage of some local variables,
and
    on targets without weak symbol support, that function does different things
    based on the results of check_initializer, which is what calls
    make_temporary_var_for_ref_to_temp.  To break this circular dependency I'm
    calling maybe_commonize_var early, and then again later if the target
    doesn't support weak symbols.

    It also occurred to me that make_temporary_var_for_ref_to_temp wasn't
    handling DECL_VISIBILITY at all, and verified that we were doing the wrong
    thing.  So I've combined the linkage-copying code from there and two other
    places.

        * decl2.c (copy_linkage): Factor out of get_guard.
        * call.c (make_temporary_var_for_ref_to_temp): Use it.
        * decl.c (cp_finish_decomp): Use it.
        (cp_finish_decl): determine_visibility sooner.

Reply via email to