diff options
author | Dodji Seketeli <dodji@redhat.com> | 2009-10-26 18:31:22 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2009-10-26 19:31:22 +0100 |
commit | f96d6fd02e10a4f266c5c459461562887cbf0c6a (patch) | |
tree | afc7e486341b3f574b937b99d93a2e7ccc1a97c8 /gcc | |
parent | 65a324b459e60405cebe9e34ee6b3496559cd217 (diff) | |
download | gcc-f96d6fd02e10a4f266c5c459461562887cbf0c6a.zip gcc-f96d6fd02e10a4f266c5c459461562887cbf0c6a.tar.gz gcc-f96d6fd02e10a4f266c5c459461562887cbf0c6a.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/cp-tree.def | 2 | ||||
-rw-r--r-- | gcc/cp/pt.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic96.C | 26 |
5 files changed, 51 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 467f078..2f7ec52 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2009-10-26 Dodji Seketeli <dodji@redhat.com> + 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 <dodji@redhat.com> + PR c++/41020 * decl.c (decls_match): Use DECL_IS_BUILTIN instead of DECL_BUILT_IN. diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def index 4df01a8..28ecc5b 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 084ad1c..e80bc30 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 08a7de5..cc89a76 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-10-26 Dodji Seketeli <dodji@redhat.com> + + PR c++/41785 + * gcc/testsuite/g++.dg/cpp0x/variadic96.C: New test. + 2009-10-26 Nick Clifton <nickc@redhat.com> * 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 0000000..d4709d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic96.C @@ -0,0 +1,26 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// 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; +} + |