diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2019-11-13 08:42:56 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2019-11-13 08:42:56 +0000 |
commit | ae83b9deb87787371cd94b4417e160d41dd0322c (patch) | |
tree | 26bc42e873c9153d6f8a4a953debfdb868a4aca3 /gcc/cp/tree.c | |
parent | 9b6e95d30e321c4d0e1355a3f20b88ef2ea29785 (diff) | |
download | gcc-ae83b9deb87787371cd94b4417e160d41dd0322c.tar.gz |
[C++] Fix interaction between aka changes and DR1558 (PR92206)
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 safely strip aliases with
dependent template parameters.
2019-11-13 Richard Sandiford <richard.sandiford@arm.com>
gcc/cp/
PR c++/92206
* cp-tree.h (STF_STRIP_DEPENDENT): New constant.
* tree.c (strip_typedefs): Add STF_STRIP_DEPENDENT 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/cpp0x/alias-decl-pr92206-1.C: New test.
* g++.dg/cpp0x/alias-decl-pr92206-2.C: Likewise.
* g++.dg/cpp0x/alias-decl-pr92206-3.C: Likewise.
From-SVN: r278119
Diffstat (limited to 'gcc/cp/tree.c')
-rw-r--r-- | gcc/cp/tree.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index ba635d4ddbd..6c39c004b01 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1488,7 +1488,8 @@ strip_typedefs (tree t, bool *remove_attributes, unsigned int flags) if (t == TYPE_CANONICAL (t)) return t; - if (dependent_alias_template_spec_p (t)) + if (!(flags & STF_STRIP_DEPENDENT) + && dependent_alias_template_spec_p (t)) /* DR 1558: However, if the template-id is dependent, subsequent template argument substitution still applies to the template-id. */ return t; @@ -1673,7 +1674,8 @@ strip_typedefs (tree t, bool *remove_attributes, unsigned int flags) && !user_facing_original_type_p (t)) return t; result = strip_typedefs (DECL_ORIGINAL_TYPE (TYPE_NAME (t)), - remove_attributes, flags); + remove_attributes, + flags | STF_STRIP_DEPENDENT); } else result = TYPE_MAIN_VARIANT (t); |