PR c++/91476 - anon-namespace reference temp clash between TUs.
authorJason Merrill <jason@redhat.com>
Mon, 20 Jan 2020 18:27:10 +0000 (13:27 -0500)
committerJason Merrill <jason@redhat.com>
Tue, 21 Jan 2020 15:17:50 +0000 (10:17 -0500)
commit8158a4640819dbb3210326e37786fb874f450272
treec7724af94aa2132a7bfdeb8f6fb8abbfc04058e3
parent56e2cc43de6e47312c186398c35732b890de0049
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.
gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/testsuite/g++.dg/ext/visibility/ref-temp1.C [new file with mode: 0644]