aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-06-28 15:59:44 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-06-28 15:59:44 -0400
commit7e61b3d4fd0ec658697ece8dac2d27000d6da921 (patch)
tree263323a24ffaba8b5d234cfc2f92f277a43f7232
parentd778c63739f59f83f47973a4f02a7f86ac74a3e7 (diff)
downloadgcc-7e61b3d4fd0ec658697ece8dac2d27000d6da921.zip
gcc-7e61b3d4fd0ec658697ece8dac2d27000d6da921.tar.gz
gcc-7e61b3d4fd0ec658697ece8dac2d27000d6da921.tar.bz2
PR c++/61022 - error with variadic template template parm
* pt.c (convert_template_argument): Keep the TYPE_PACK_EXPANSION. From-SVN: r249756
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic-ttp8.C27
3 files changed, 31 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ae6de7f..9c21f6f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2017-06-28 Jason Merrill <jason@redhat.com>
+ PR c++/61022 - error with variadic template template parm
+ * pt.c (convert_template_argument): Keep the TYPE_PACK_EXPANSION.
+
PR c++/72801 - ICE with variadic partial specialization
* pt.c (unify_pack_expansion): Use PACK_EXPANSION_EXTRA_ARGS.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index b86b346..fa75037 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -7695,7 +7695,7 @@ convert_template_argument (tree parm,
if (TREE_CODE (TREE_TYPE (arg)) == UNBOUND_CLASS_TEMPLATE)
/* The number of argument required is not known yet.
Just accept it for now. */
- val = TREE_TYPE (arg);
+ val = orig_arg;
else
{
tree parmparm = DECL_INNERMOST_TEMPLATE_PARMS (parm);
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ttp8.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ttp8.C
new file mode 100644
index 0000000..f3e576a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ttp8.C
@@ -0,0 +1,27 @@
+// PR c++/69111
+// { dg-do compile { target c++11 } }
+
+template <template <typename> class ...>
+struct template_list {};
+
+template <typename T>
+struct A
+{};
+
+template <typename>
+struct B
+{
+ template <typename T>
+ using type = A<T>;
+};
+
+template <typename ... Types>
+struct C
+{
+ using type = template_list<B<Types>::template type...>;
+};
+
+int main()
+{
+ return 0;
+}