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 |
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 --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;
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