From f96d6fd02e10a4f266c5c459461562887cbf0c6a Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Mon, 26 Oct 2009 18:31:22 +0000 Subject: [PATCH] re PR c++/41785 ([C++0x] ICE on canonical types with variadic templates and CRTP) Fix PR c++/41785 gcc/cp/ChangeLog: PR c++/41785 * pt.c (template_args_equal): Handle comparison of an ARGUMENT_PACK_SELECT node with the arguments node it selects into. * cp-tree.def: Fix a typo in the description of TYPE_PACK_EXPANSION. gcc/testsuite/ChangeLog: PR c++/41785 * gcc/testsuite/g++.dg/cpp0x/variadic96.C: New test. From-SVN: r153564 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/cp-tree.def | 2 +- gcc/cp/pt.c | 12 ++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/variadic96.C | 26 +++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic96.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 467f0782c3f..2f7ec52b804 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2009-10-26 Dodji Seketeli + + PR c++/41785 + * pt.c (template_args_equal): Handle comparison of + an ARGUMENT_PACK_SELECT node with the arguments node it selects into. + * cp-tree.def: Fix a typo in the description of TYPE_PACK_EXPANSION. + 2009-10-26 Dodji Seketeli PR c++/41020 diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def index 4df01a8e205..28ecc5bf681 100644 --- a/gcc/cp/cp-tree.def +++ b/gcc/cp/cp-tree.def @@ -393,7 +393,7 @@ DEFTREECODE (NONTYPE_ARGUMENT_PACK, "nontype_argument_pack", tcc_expression, 1) }; The derivation from tuple contains a TYPE_PACK_EXPANSION for the - template arguments. Its EXPR_PACK_EXPANSION is "Values&" and its + template arguments. Its PACK_EXPANSION_PATTERN is "Values&" and its PACK_EXPANSION_PARAMETER_PACKS will contain "Values". */ DEFTREECODE (TYPE_PACK_EXPANSION, "type_pack_expansion", tcc_type, 0) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 084ad1cb09f..e80bc30152e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5818,6 +5818,18 @@ template_args_equal (tree ot, tree nt) return 0; return 1; } + else if (ot && TREE_CODE (ot) == ARGUMENT_PACK_SELECT) + { + /* We get here probably because we are in the middle of substituting + into the pattern of a pack expansion. In that case the + ARGUMENT_PACK_SELECT temporarily replaces the pack argument we are + interested in. So we want to use the initial pack argument for + the comparison. */ + ot = ARGUMENT_PACK_SELECT_FROM_PACK (ot); + if (nt && TREE_CODE (nt) == ARGUMENT_PACK_SELECT) + nt = ARGUMENT_PACK_SELECT_FROM_PACK (nt); + return template_args_equal (ot, nt); + } else if (TYPE_P (nt)) return TYPE_P (ot) && same_type_p (ot, nt); else if (TREE_CODE (ot) == TREE_VEC || TYPE_P (ot)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 08a7de5fa03..cc89a761ba0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-10-26 Dodji Seketeli + + PR c++/41785 + * gcc/testsuite/g++.dg/cpp0x/variadic96.C: New test. + 2009-10-26 Nick Clifton * lib/target-supports.exp (check_profiling_available): diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic96.C b/gcc/testsuite/g++.dg/cpp0x/variadic96.C new file mode 100644 index 00000000000..d4709d074b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic96.C @@ -0,0 +1,26 @@ +// Contributed by Dodji Seketeli +// Origin: PR c++/41785 +// { dg-options -std=c++0x } + +struct a {}; + +template < typename T, typename ENCLOSING > +struct base; + +template < typename... T > +struct derived + : public base< T, derived< T... > >... +{}; + +template < typename... T> +struct base< a, derived< T... > > +{ + typedef derived< T... > + Derived; +}; + +int main() +{ + derived< a > instance; +} +