summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2014-09-11 13:51:11 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2014-09-11 13:51:11 +0000
commitc77de4d1d666e917c2879a690152135a3ca1bb1a (patch)
tree357a66411c05a666666262a327aace082edf3b37
parent74cc06a735b0594fd7964aad1424c4c7e03319e0 (diff)
downloadppe42-gcc-c77de4d1d666e917c2879a690152135a3ca1bb1a.tar.gz
ppe42-gcc-c77de4d1d666e917c2879a690152135a3ca1bb1a.zip
PR c++/63139
* pt.c (tsubst_pack_expansion): Simplify substitution into T.... git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@215172 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic161.C51
3 files changed, 61 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 18ae4f22bcd..21da6c47871 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2014-09-10 Jason Merrill <jason@redhat.com>
+
+ PR c++/63139
+ * pt.c (tsubst_pack_expansion): Simplify substitution into T....
+
2014-09-09 Jason Merrill <jason@redhat.com>
PR lto/53808
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 91ff32acb26..d788e1fdbef 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -9816,6 +9816,11 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain,
}
}
+ /* If the expansion is just T..., return the matching argument pack. */
+ if (!unsubstituted_packs
+ && TREE_PURPOSE (packs) == pattern)
+ return ARGUMENT_PACK_ARGS (TREE_VALUE (packs));
+
/* We cannot expand this expansion expression, because we don't have
all of the argument packs we need. */
if (use_pack_expansion_extra_args_p (packs, len, unsubstituted_packs))
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic161.C b/gcc/testsuite/g++.dg/cpp0x/variadic161.C
new file mode 100644
index 00000000000..ac6eaf6a36a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic161.C
@@ -0,0 +1,51 @@
+// PR c++/63139
+// { dg-do compile { target c++11 } }
+
+template<typename ...T>
+struct type_list {};
+
+template<typename ...T>
+struct make_type_list
+{
+ using type = type_list<T...>;
+};
+
+// The bug disappears if you use make_type_list directly.
+template<typename ...T>
+using make_type_list_t = typename make_type_list<T...>::type;
+
+
+struct ContainerEndA {};
+
+template<typename ...Ts>
+struct ContainerA
+{
+ using type = make_type_list_t<Ts..., ContainerEndA>;
+};
+
+
+struct ContainerEndB {};
+
+template<typename ...Ts>
+struct ContainerB
+{
+ using type = make_type_list_t<Ts..., ContainerEndB>;
+};
+
+template<typename T, typename U>
+struct is_same
+{
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T>
+{
+ static const bool value = true;
+};
+
+#define SA(X) static_assert((X), #X)
+
+SA((is_same<ContainerB<>::type, type_list<ContainerEndB>>::value));
+SA((!is_same<ContainerA<>::type, type_list<ContainerEndB>>::value));
+SA((!is_same<ContainerA<>::type, ContainerB<>::type>::value));
OpenPOWER on IntegriCloud