diff options
author | Douglas Gregor <doug.gregor@gmail.com> | 2007-12-04 20:49:08 +0000 |
---|---|---|
committer | Doug Gregor <dgregor@gcc.gnu.org> | 2007-12-04 20:49:08 +0000 |
commit | 2f93f02ca356a40d90f3df0eac1adf1239572d27 (patch) | |
tree | 0f03bbc1884e8f5c53b90c241ba2367eb58ea013 | |
parent | db60ff18e2cc35235d436c7e492d8564af44ea9b (diff) | |
download | gcc-2f93f02ca356a40d90f3df0eac1adf1239572d27.zip gcc-2f93f02ca356a40d90f3df0eac1adf1239572d27.tar.gz gcc-2f93f02ca356a40d90f3df0eac1adf1239572d27.tar.bz2 |
re PR c++/33509 (tsubst_pack_expansion assumed to return TREE_VEC)
2007-12-04 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33509
* pt.c (tsubst_exception_specification): Handle substitutions into
member templates, where tsubst_pack_expansion returns a
TYPE_PACK_EXPANSION.
2007-12-04 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33509
* g++.dg/cpp0x/variadic-throw.C: New.
From-SVN: r130605
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic-throw.C | 25 |
4 files changed, 55 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9b99ba8..f694c88 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2007-12-04 Douglas Gregor <doug.gregor@gmail.com> + PR c++/33509 + * pt.c (tsubst_exception_specification): Handle substitutions into + member templates, where tsubst_pack_expansion returns a + TYPE_PACK_EXPANSION. + +2007-12-04 Douglas Gregor <doug.gregor@gmail.com> + PR c++/33091 * pt.c (unify_pack_expansion): If we didn't deduce any actual bindings for the template parameter pack, don't try to keep the diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f7d6946..b64ccf8 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8653,7 +8653,24 @@ tsubst_exception_specification (tree fntype, expanded_specs = tsubst_pack_expansion (TREE_VALUE (specs), args, complain, in_decl); - len = TREE_VEC_LENGTH (expanded_specs); + + if (expanded_specs == error_mark_node) + return error_mark_node; + else if (TREE_CODE (expanded_specs) == TREE_VEC) + len = TREE_VEC_LENGTH (expanded_specs); + else + { + /* We're substituting into a member template, so + we got a TYPE_PACK_EXPANSION back. Add that + expansion and move on. */ + gcc_assert (TREE_CODE (expanded_specs) + == TYPE_PACK_EXPANSION); + new_specs = add_exception_specifier (new_specs, + expanded_specs, + complain); + specs = TREE_CHAIN (specs); + continue; + } } for (i = 0; i < len; ++i) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 38c24c0c..13e2cba 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2007-12-04 Douglas Gregor <doug.gregor@gmail.com> + PR c++/33509 + * g++.dg/cpp0x/variadic-throw.C: New. + +2007-12-04 Douglas Gregor <doug.gregor@gmail.com> + PR c++/33091 * g++.dg/cpp0x/variadic-unify.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C b/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C new file mode 100644 index 0000000..f2ff652 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C @@ -0,0 +1,25 @@ +// { dg-options -std=c++0x } +// PR c++/33509 +template<int M, int N> struct pair +{ + int i, j; + pair() : i(M), j(N) {} +}; + +template<int... M> struct S +{ + template<int... N> static int foo() throw (pair <M, N>...) // { dg-error "mismatched|no matching" } + { + return 1; + } +}; + +int bar () +{ + return S<0, 1, 2>::foo<0, 1, 3> (); +} + +int wibble() +{ + return S<0, 1, 2>::foo<0, 1> (); +} |