https://gcc.gnu.org/g:6a1e109158940ce3a2d1ceed3e1b614ea6c9a2de
commit r15-4060-g6a1e109158940ce3a2d1ceed3e1b614ea6c9a2de Author: Nathaniel Shead <nathanielosh...@gmail.com> Date: Fri Oct 4 10:46:57 2024 +1000 c++: Return the underlying decl rather than the USING_DECL from update_binding [PR116913] Users of pushdecl assume that the returned decl will be a possibly updated decl matching the one that was passed in. My r15-3910 change broke this since in some cases we would now return USING_DECLs; this patch fixes the situation. PR c++/116913 gcc/cp/ChangeLog: * name-lookup.cc (update_binding): Return the strip_using'd old decl rather than the binding. gcc/testsuite/ChangeLog: * g++.dg/lookup/using70.C: New test. Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> Diff: --- gcc/cp/name-lookup.cc | 4 ++-- gcc/testsuite/g++.dg/lookup/using70.C | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc index 4754ef5a5229..609bd6e8c9b5 100644 --- a/gcc/cp/name-lookup.cc +++ b/gcc/cp/name-lookup.cc @@ -3101,7 +3101,7 @@ update_binding (cp_binding_level *level, cxx_binding *binding, tree *slot, { if (same_type_p (TREE_TYPE (old), TREE_TYPE (decl))) /* Two type decls to the same type. Do nothing. */ - return old_bval; + return old; else goto conflict; } @@ -3114,7 +3114,7 @@ update_binding (cp_binding_level *level, cxx_binding *binding, tree *slot, /* The new one must be an alias at this point. */ gcc_assert (DECL_NAMESPACE_ALIAS (decl)); - return old_bval; + return old; } else if (TREE_CODE (old) == VAR_DECL) { diff --git a/gcc/testsuite/g++.dg/lookup/using70.C b/gcc/testsuite/g++.dg/lookup/using70.C new file mode 100644 index 000000000000..14838eea7ec3 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using70.C @@ -0,0 +1,13 @@ +// PR c++/116913 +// { dg-do compile { target c++11 } } + +namespace ns { + struct c {}; + using d = int; +} + +using ns::c; +using ns::d; + +using c = ns::c; +using d = ns::d;