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;

Reply via email to