aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-04-15 23:18:06 -0400
committerJason Merrill <jason@gcc.gnu.org>2012-04-15 23:18:06 -0400
commitf905751487709b5ef6cde81c5440c4528e7f4390 (patch)
tree9b0e21ba1e0f52ff020ee5b34c8e21f44254c066 /gcc
parent51c8ebb3fb0967ffdb409d9cb43204d88980222a (diff)
downloadgcc-f905751487709b5ef6cde81c5440c4528e7f4390.zip
gcc-f905751487709b5ef6cde81c5440c4528e7f4390.tar.gz
gcc-f905751487709b5ef6cde81c5440c4528e7f4390.tar.bz2
re PR c++/52292 ([C++11] Variadic template expansion into fixed template causes constructor to not match)
PR c++/52292 PR c++/52380 * pt.c (coerce_template_parms): Even if we aren't converting we want to expand argument packs. From-SVN: r186479
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic124.C29
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic125.C25
5 files changed, 66 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 69d5b1d..d37d42c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2012-04-15 Jason Merrill <jason@redhat.com>
+ PR c++/52292
+ PR c++/52380
+ * pt.c (coerce_template_parms): Even if we aren't converting we
+ want to expand argument packs.
+
PR c++/52706
* mangle.c (write_type): nullptr_t is a builtin type.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 07a2cc0..42dc0a7 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -6882,7 +6882,7 @@ coerce_template_parms (tree parms,
{
/* We don't know how many args we have yet, just
use the unconverted ones for now. */
- new_inner_args = args;
+ new_inner_args = inner_args;
break;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f3f6895..a936b36 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,11 @@
2012-04-15 Jason Merrill <jason@redhat.com>
+ PR c++/52380
+ * g++.dg/cpp0x/variadic125.C: New.
+
+ PR c++/52292
+ * g++.dg/cpp0x/variadic124.C: New.
+
PR c++/52706
* g++.dg/cpp0x/nullptr27.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic124.C b/gcc/testsuite/g++.dg/cpp0x/variadic124.C
new file mode 100644
index 0000000..8ddc810
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic124.C
@@ -0,0 +1,29 @@
+// PR c++/52292
+// { dg-options -std=c++11 }
+
+template <template <typename...> class T>
+struct foo {
+ template <typename... U>
+ foo(T<U...> x) { }
+};
+
+template <typename T>
+struct bar {
+ bar(T x) : value(x) { }
+
+ T value;
+};
+
+struct generic : private foo<bar> {
+ template <typename T>
+ generic(bar<T> x) : foo(x)
+ {
+ }
+
+};
+
+int main()
+{
+ bar<int> x(32);
+ generic y(x); // FAILS
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic125.C b/gcc/testsuite/g++.dg/cpp0x/variadic125.C
new file mode 100644
index 0000000..89fd6b0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic125.C
@@ -0,0 +1,25 @@
+// PR c++/52380
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct S
+{
+ template<typename U>
+ struct Unary // Line 5
+ {};
+
+ template<unsigned, typename... Args>
+ struct Dispatch // Line 9
+ : public Unary<Args...>
+ {};
+
+ template<typename... Args>
+ struct Variadic
+ : public Dispatch<sizeof...(Args), Args...>
+ {};
+};
+
+int main()
+{
+ S<void>::Variadic<void> z;
+}