This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: C++ PATCH for c++/85976, ICE with USING_DECL in cp_tree_equal
- From: Jason Merrill <jason at redhat dot com>
- To: Marek Polacek <polacek at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 5 Jun 2018 14:57:29 +0200
- Subject: Re: C++ PATCH for c++/85976, ICE with USING_DECL in cp_tree_equal
- References: <20180604154458.GD23949@redhat.com> <CADzB+2=KJ-JYUBDJEx5E1UMfy_-b0MwAnsK3+k0vc_Qm62J6KA@mail.gmail.com> <20180604210307.GF23949@redhat.com>
On Mon, Jun 4, 2018 at 11:03 PM, Marek Polacek <polacek@redhat.com> wrote:
> On Mon, Jun 04, 2018 at 01:28:01PM -0400, Jason Merrill wrote:
>> On Mon, Jun 4, 2018 at 11:44 AM, Marek Polacek <polacek@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 <polacek@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);
> +};
Hmm, this testcase looks a bit over-reduced; these templates can never
be instantiated, so they are ill-formed (no diagnostic required). But
I suppose that's not too much of an issue. The patch is OK.
Jason