On Mon, Jun 04, 2018 at 01:28:01PM -0400, Jason Merrill wrote:
> On Mon, Jun 4, 2018 at 11:44 AM, Marek Polacek <pola...@redhat.com> wrote:
> > I've had no luck in reducing the testcase in this PR, creduce won't get even
> > past the initial passes, and reducing by hand didn't get me very far, 
> > either.
> >
> > But the problem seems to be merely that we're not handling USING_DECLs in
> > cp_tree_equal, and we can get there via comp_template_arguments.  In this 
> > case
> > we have two USING_DECLs with different full names.
> >
> > So this patch just adds the USING_DECL case, similarly to e.g.
> > https://gcc.gnu.org/ml/gcc-patches/2012-10/msg00799.html
> >
> > Bootstrapped/regtested on x86_64-linux, ok for trunk/8?  I verified manually
> > that this fixes the testcase from the PR.
> 
> Hmm, do these USING_DECLs have DECL_DEPENDENT_P set?  What do they
> represent?  In the case of dependent USING_DECL I'd think we want to
> compare the scope and name rather than just return false.

They represent a using-declaration in this testcase.

Yep, they're DECL_DEPENDENT_P.  So let's check their scope and name.

> I think we do want a reduced testcase.  Maybe add the needs-reduction
> tag if you're having trouble reducing it yourself?

I got lucky: I managed to remove some random unnecessary code which then
allowed creduce to do its job, the result is pretty nice!

Bootstrapped/regtested on x86_64-linux, ok for trunk/8?

2018-06-04  Marek Polacek  <pola...@redhat.com>

        PR c++/85976
        * tree.c (cp_tree_equal): Handle USING_DECL.

        * g++.dg/cpp0x/alias-decl-64.C: New test.

diff --git gcc/cp/tree.c gcc/cp/tree.c
index c5b6e9689b6..bbbda7e98b6 100644
--- gcc/cp/tree.c
+++ gcc/cp/tree.c
@@ -3878,6 +3878,14 @@ cp_tree_equal (tree t1, tree t2)
                                     DEFERRED_NOEXCEPT_ARGS (t2)));
       break;
 
+    case USING_DECL:
+      if (DECL_DEPENDENT_P (t1) && DECL_DEPENDENT_P (t2))
+       return (cp_tree_equal (USING_DECL_SCOPE (t1),
+                              USING_DECL_SCOPE (t2))
+               && cp_tree_equal (DECL_NAME (t1),
+                                 DECL_NAME (t2)));
+      return false;
+
     default:
       break;
     }
diff --git gcc/testsuite/g++.dg/cpp0x/alias-decl-64.C 
gcc/testsuite/g++.dg/cpp0x/alias-decl-64.C
index e69de29bb2d..019eb269750 100644
--- gcc/testsuite/g++.dg/cpp0x/alias-decl-64.C
+++ gcc/testsuite/g++.dg/cpp0x/alias-decl-64.C
@@ -0,0 +1,15 @@
+// PR c++/85976
+// { dg-do compile { target c++11 } }
+
+template <int> class A;
+template <typename> class B;
+template <typename> struct C;
+template <typename P_expr> class D {
+  using B<typename P_expr::T_numtype>::rank_;
+  void operator()(typename C<A<rank_>>::i);
+};
+
+template <typename P_expr> class F {
+  using B<typename P_expr::T_numtype>::rank_;
+  void operator()(typename C<A<rank_>>::i);
+};

        Marek

Reply via email to