diff mbox series

c++: Return the underlying decl rather than the USING_DECL from update_binding [PR116913]

Message ID 66ff3c3c.170a0220.d0b60.09ab@mx.google.com
State New
Headers show
Series c++: Return the underlying decl rather than the USING_DECL from update_binding [PR116913] | expand

Commit Message

Nathaniel Shead Oct. 4, 2024, 12:52 a.m. UTC
Tested on x86_64-pc-linux-gnu (so far just dg.exp), OK for trunk if full
bootstrap + regtest passes?

-- >8 --

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 <nathanieloshead@gmail.com>
---
 gcc/cp/name-lookup.cc                 |  4 ++--
 gcc/testsuite/g++.dg/lookup/using70.C | 13 +++++++++++++
 2 files changed, 15 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/lookup/using70.C

Comments

Jason Merrill Oct. 4, 2024, 3:01 a.m. UTC | #1
On 10/3/24 8:52 PM, Nathaniel Shead wrote:
> Tested on x86_64-pc-linux-gnu (so far just dg.exp), OK for trunk if full
> bootstrap + regtest passes?

OK.

> -- >8 --
> 
> 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 <nathanieloshead@gmail.com>
> ---
>   gcc/cp/name-lookup.cc                 |  4 ++--
>   gcc/testsuite/g++.dg/lookup/using70.C | 13 +++++++++++++
>   2 files changed, 15 insertions(+), 2 deletions(-)
>   create mode 100644 gcc/testsuite/g++.dg/lookup/using70.C
> 
> diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
> index 4754ef5a522..609bd6e8c9b 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 00000000000..14838eea7ec
> --- /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;
diff mbox series

Patch

diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
index 4754ef5a522..609bd6e8c9b 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 00000000000..14838eea7ec
--- /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;