From e1a18c68eba04c396dd491a361aeef15f73e8b05 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 2 Nov 2007 03:26:46 +0000 Subject: [PATCH] re PR c++/33955 (internal compiler error: in dependent_type_p, at cp/pt.c:15245 (vararg template problem)) 2007-11-01 Douglas Gregor PR c++/33955 * pt.c (find_parameter_packs_r): Handle TYPENAME_TYPE. 2007-11-01 Douglas Gregor * g++.dg/cpp0x/pr33955.C: New. From-SVN: r129843 --- gcc/cp/ChangeLog | 5 ++++ gcc/cp/pt.c | 9 ++++++- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/g++.dg/cpp0x/pr33955.C | 39 ++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/pr33955.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 51f219bb7bf..c784c31f066 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2007-11-01 Douglas Gregor + + PR c++/33955 + * pt.c (find_parameter_packs_r): Handle TYPENAME_TYPE. + 2007-11-01 Jakub Jelinek PR c++/32384 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 5f6e29690d2..8f72ba90ec7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2504,7 +2504,14 @@ find_parameter_packs_r (tree *tp, int *walk_subtrees, void* data) *walk_subtrees = 0; return NULL_TREE; - + + case TYPENAME_TYPE: + cp_walk_tree (&TYPENAME_TYPE_FULLNAME (t), &find_parameter_packs_r, + ppd, ppd->visited); + *walk_subtrees = 0; + return NULL_TREE; + + case TYPE_PACK_EXPANSION: case EXPR_PACK_EXPANSION: *walk_subtrees = 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b1c5701bc3f..459d5a25092 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-11-01 Douglas Gregor + + * g++.dg/cpp0x/pr33955.C: New. + 2007-11-01 Tom Tromey PR preprocessor/30805: diff --git a/gcc/testsuite/g++.dg/cpp0x/pr33955.C b/gcc/testsuite/g++.dg/cpp0x/pr33955.C new file mode 100644 index 00000000000..cde92dedf97 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr33955.C @@ -0,0 +1,39 @@ +// { dg-options "-std=c++0x" } +template +struct uncvref +{ + typedef T type; +}; + +template +struct args +{ + static const int size = sizeof...(Args); +}; + +template +struct apply_args; + +template +struct apply_args, args, S, V, N, N> +{ + typedef args< + typename G::template apply::type, S, V>::type... + > type; +}; + +struct or_ +{ + template + struct apply { + typedef typename E::type type; + }; +}; + +template +struct identity +{ + typedef T type; +}; + +apply_args, args>, float, double> a1; -- 2.30.2