aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2009-06-30 15:36:36 -0400
committerJason Merrill <jason@gcc.gnu.org>2009-06-30 15:36:36 -0400
commit0db906f1851bacdb1b429ba5a6f501282fdf7a63 (patch)
treeb5f4bc18d51739a52763e76b30d0bf6ddbd1305c
parent342f368cd9927a2929ab3d8d5bddfef625f520bc (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/pt.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic94.C33
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);
+}