diff options
author | Jason Merrill <jason@redhat.com> | 2013-02-14 20:26:34 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-02-14 20:26:34 -0500 |
commit | ff9b4073cc6f8da73fd9affa494192e91c852e64 (patch) | |
tree | 8e6764b68579fbf02b4d07869b8e3d0523c3ca21 /gcc | |
parent | 9c85798a59e75b90fa7a8ed3eacf67929e056a2f (diff) | |
download | gcc-ff9b4073cc6f8da73fd9affa494192e91c852e64.zip gcc-ff9b4073cc6f8da73fd9affa494192e91c852e64.tar.gz gcc-ff9b4073cc6f8da73fd9affa494192e91c852e64.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/error.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic-diag1.C | 22 |
3 files changed, 36 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 033aa1e..4784a3c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-02-14 Jason Merrill <jason@redhat.com> + + PR c++/55232 + * error.c (find_typenames_r): Don't walk into a pack expansion. + 2013-02-13 Jason Merrill <jason@redhat.com> PR c++/55670 diff --git a/gcc/cp/error.c b/gcc/cp/error.c index a4b3320..60119ec 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 0000000..53182d3 --- /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 ); +} |