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
This commit is contained in:
Douglas Gregor 2007-12-04 20:49:08 +00:00 committed by Doug Gregor
parent db60ff18e2
commit 2f93f02ca3
4 changed files with 55 additions and 1 deletions

View File

@ -1,3 +1,10 @@
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

View File

@ -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)

View File

@ -1,3 +1,8 @@
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

View File

@ -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> ();
}