On Wed, Apr 3, 2013 at 7:36 AM, Jakub Jelinek <ja...@redhat.com> wrote:
> Hi!
>
> On the following testcase we ICE with -fcompare-debug with
> --enable-checking=yes, because strip_typedefs copies args to a new TREE_VEC,
> but doesn't copy over NON_DEFAULT_TEMPLATE_ARGS_COUNT.  For ENABLE_CHECKING
> the code requires that it is set, for !ENABLE_CHECKING it would be needed
> only if NON_DEFAULT_TEMPLATE_ARGS_COUNT was already non-NULL (otherwise
> GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT would use length of the TREE_VEC).
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/4.8/4.7?
>
> 2013-04-03  Jakub Jelinek  <ja...@redhat.com>
>
>         PR debug/56819
>         * tree.c (strip_typedefs): SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT
>         on new_args.
>
>         * g++.dg/debug/pr56819.C: New test.
>
> --- gcc/cp/tree.c.jj    2013-04-02 20:24:34.000000000 +0200
> +++ gcc/cp/tree.c       2013-04-03 10:51:56.614548181 +0200
> @@ -1255,8 +1255,16 @@ strip_typedefs (tree t)
>                   changed = true;
>               }
>             if (changed)
> -             fullname = lookup_template_function (TREE_OPERAND (fullname, 0),
> -                                                  new_args);
> +             {
> +#ifndef ENABLE_CHECKING
> +               if (NON_DEFAULT_TEMPLATE_ARGS_COUNT (args))
> +#endif
> +                 SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT
> +                   (new_args, GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (args));
> +               fullname
> +                 = lookup_template_function (TREE_OPERAND (fullname, 0),
> +                                             new_args);
> +             }
>             else
>               ggc_free (new_args);

Hmm, the resulting code does not look simpler.
Why can't we always copy the stuff as opposed to
playing cat-n-fish with the CPP macro ENABLE_CHECKING?

-- Gaby

Reply via email to