diff options
author | Jason Merrill <jason@redhat.com> | 2009-06-30 15:36:36 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2009-06-30 15:36:36 -0400 |
commit | 0db906f1851bacdb1b429ba5a6f501282fdf7a63 (patch) | |
tree | b5f4bc18d51739a52763e76b30d0bf6ddbd1305c | |
parent | 342f368cd9927a2929ab3d8d5bddfef625f520bc (diff) | |
download | gcc-0db906f1851bacdb1b429ba5a6f501282fdf7a63.zip gcc-0db906f1851bacdb1b429ba5a6f501282fdf7a63.tar.gz gcc-0db906f1851bacdb1b429ba5a6f501282fdf7a63.tar.bz2 |
re PR c++/40595 ([C++0x] ICE trying to use sfinae with variadic template pack expansion)
PR c++/40595
* pt.c (tsubst_pack_expansion): Handle unexpanded packs in an
EXPR_PACK_EXPANSION.
From-SVN: r149117
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic94.C | 33 |
4 files changed, 53 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index dbca775..4e85a95 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-06-30 Jason Merrill <jason@redhat.com> + + PR c++/40595 + * pt.c (tsubst_pack_expansion): Handle unexpanded packs in an + EXPR_PACK_EXPANSION. + 2009-06-29 Jason Merrill <jason@redhat.com> PR c++/40274 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e0a413b..b7c309d 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7630,8 +7630,15 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain, and return a PACK_EXPANSION_*. The caller will need to deal with that. */ if (unsubstituted_packs) - return make_pack_expansion (tsubst (pattern, args, complain, - in_decl)); + { + tree new_pat; + if (TREE_CODE (t) == EXPR_PACK_EXPANSION) + new_pat = tsubst_expr (pattern, args, complain, in_decl, + /*integral_constant_expression_p=*/false); + else + new_pat = tsubst (pattern, args, complain, in_decl); + return make_pack_expansion (new_pat); + } /* We could not find any argument packs that work. */ if (len < 0) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8287bbb..a8d5141 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-06-30 Jason Merrill <jason@redhat.com> + + PR c++/40595 + * g++.dg/cpp0x/variadic94.C: New. + 2009-06-30 Richard Sandiford <r.sandiford@uk.ibm.com> * lib/gcc-defs.exp (gcc-set-multilib-library-path): Delete. diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic94.C b/gcc/testsuite/g++.dg/cpp0x/variadic94.C new file mode 100644 index 0000000..8420f73 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic94.C @@ -0,0 +1,33 @@ +// PR c++/40595 +// { dg-options "-std=c++0x" } + +template<int N> +struct S +{ + typedef int type; +}; + +template<typename T> +struct Get +{ + static T get(); +}; + +template<typename F> +struct B +{ + template<typename ... Args> + typename S<sizeof( Get<F>::get() (Get<Args>::get() ...) )>::type + f(Args&& ... a); +}; + +struct X +{ + bool operator()(int) const; +}; + +int main() +{ + B<X> b; + b.f(1); +} |