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:
parent
db60ff18e2
commit
2f93f02ca3
|
@ -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
|
||||
|
|
19
gcc/cp/pt.c
19
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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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> ();
|
||||
}
|
Loading…
Reference in New Issue