diff options
| author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-09-11 13:51:11 +0000 |
|---|---|---|
| committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-09-11 13:51:11 +0000 |
| commit | c77de4d1d666e917c2879a690152135a3ca1bb1a (patch) | |
| tree | 357a66411c05a666666262a327aace082edf3b37 | |
| parent | 74cc06a735b0594fd7964aad1424c4c7e03319e0 (diff) | |
| download | ppe42-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/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/cp/pt.c | 5 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/variadic161.C | 51 |
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)); |

