On 10/25/19 2:53 PM, Richard Sandiford wrote:
One of the changes in r277281 was to make the typedef variant
handling in strip_typedefs pass the raw DECL_ORIGINAL_TYPE to the
recursive call, instead of applying TYPE_MAIN_VARIANT first.
This PR shows that that interacts badly with the implementation
of DR1558, because we then refuse to strip aliases with dependent
template parameters and trip:

   gcc_assert (!typedef_variant_p (result)
              || ((flags & STF_USER_VISIBLE)
                  && !user_facing_original_type_p (result)));

Keeping the current behaviour but suppressing the ICE leads to a
duplicate error (the dg-bogus in the first test), so that didn't
seem like a good fix.

I assume keeping the alias should never actually be necessary for
DECL_ORIGINAL_TYPEs, because it will already have been checked
somewhere, even for implicit TYPE_DECLs.  This patch therefore
passes a flag to say that we can assume the type is validated
elsewhere.

It seems a rather clunky fix, sorry, but restoring the
TYPE_MAIN_VARIANT (...) isn't compatible with the aka stuff.

Bootstrapped & regression-tested on aarch64-linux-gnu.  OK to install?

2019-10-25  Richard Sandiford  <richard.sandif...@arm.com>

gcc/cp/
        PR c++/92206
        * cp-tree.h (STF_ASSUME_VALID): New constant.

Let's call this STF_STRIP_DEPENDENT.

        * tree.c (strip_typedefs): Add STF_ASSUME_VALID to the flags
        when calling strip_typedefs recursively on a DECL_ORIGINAL_TYPE.
        Don't apply the fix for DR1558 in that case; allow aliases with
        dependent template parameters to be stripped instead.

gcc/testsuite/
        PR c++/92206
        * g++.dg/pr92206-1.C: New test.
        * g++.dg/pr92206-2.C: Likewise.
        * g++.dg/pr92206-3.C: Likewise.

Let's call these g++.dg/cpp0x/alias-decl-pr92206*.

OK with those changes.

Jason

Reply via email to