aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <doug.gregor@gmail.com>2007-12-04 20:49:08 +0000
committerDoug Gregor <dgregor@gcc.gnu.org>2007-12-04 20:49:08 +0000
commit2f93f02ca356a40d90f3df0eac1adf1239572d27 (patch)
tree0f03bbc1884e8f5c53b90c241ba2367eb58ea013
parentdb60ff18e2cc35235d436c7e492d8564af44ea9b (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cp/pt.c19
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic-throw.C25
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> ();
+}