From ff9b4073cc6f8da73fd9affa494192e91c852e64 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 14 Feb 2013 20:26:34 -0500 Subject: [PATCH] re PR c++/55232 ([C++11] ICE with -Wunused-parameter for unused parameter pack using qualified dependent name) PR c++/55232 * error.c (find_typenames_r): Don't walk into a pack expansion. From-SVN: r196064 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/error.c | 10 +++++++++- gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C | 22 +++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 033aa1ec066..4784a3cf839 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-02-14 Jason Merrill + + PR c++/55232 + * error.c (find_typenames_r): Don't walk into a pack expansion. + 2013-02-13 Jason Merrill PR c++/55670 diff --git a/gcc/cp/error.c b/gcc/cp/error.c index a4b3320dfef..60119ec6302 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -1283,7 +1283,7 @@ struct find_typenames_t }; static tree -find_typenames_r (tree *tp, int * /*walk_subtrees*/, void *data) +find_typenames_r (tree *tp, int *walk_subtrees, void *data) { struct find_typenames_t *d = (struct find_typenames_t *)data; tree mv = NULL_TREE; @@ -1296,6 +1296,14 @@ find_typenames_r (tree *tp, int * /*walk_subtrees*/, void *data) /* Add the typename without any cv-qualifiers. */ mv = TYPE_MAIN_VARIANT (*tp); + if (TREE_CODE (*tp) == TYPE_PACK_EXPANSION) + { + /* Don't mess with parameter packs since we don't remember + the pack expansion context for a particular typename. */ + *walk_subtrees = false; + return NULL_TREE; + } + if (mv && (mv == *tp || !pointer_set_insert (d->p_set, mv))) vec_safe_push (d->typenames, mv); diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C new file mode 100644 index 00000000000..53182d3e064 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C @@ -0,0 +1,22 @@ +// PR c++/55232 +// { dg-do compile { target c++11 } } + +struct vector +{ + typedef int value_type; +}; + +template< class U, class... T > +struct X +{ + void push_back( typename T::value_type ... vals ) + { + U::asoeuth; // { dg-error "" } + } +}; + +int main() +{ + X< int, vector > x; + x.push_back( 0 ); +}