diff options
| author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-21 02:05:03 +0000 |
|---|---|---|
| committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-21 02:05:03 +0000 |
| commit | 14fdc4a0b800960d3b71a0fb320c0c7bfe4d134a (patch) | |
| tree | 1c53bba6c7eef073bcf60c707b6c7e4c061bbe2d /gcc | |
| parent | 2b6ed700ac98f9851deaa6abac003d469920a334 (diff) | |
| download | ppe42-gcc-14fdc4a0b800960d3b71a0fb320c0c7bfe4d134a.tar.gz ppe42-gcc-14fdc4a0b800960d3b71a0fb320c0c7bfe4d134a.zip | |
* pt.c (tsubst_pack_expansion): Fix SFINAE.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181548 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/cp/ChangeLog | 2 | ||||
| -rw-r--r-- | gcc/cp/pt.c | 4 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/sfinae30.C | 25 |
3 files changed, 30 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 93cd960a611..c08314449bf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,7 @@ 2011-11-20 Jason Merrill <jason@redhat.com> + * pt.c (tsubst_pack_expansion): Fix SFINAE. + PR c++/48322 * cp-tree.h (PACK_EXPANSION_EXTRA_ARGS): New. * cp-tree.def (EXPR_PACK_EXPANSION): Add an operand for it. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f0ee0c5f17e..2ba26b206bd 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9350,7 +9350,9 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain, len = my_len; else if (len != my_len) { - if (TREE_CODE (t) == TYPE_PACK_EXPANSION) + if (!(complain & tf_error)) + /* Fail quietly. */; + else if (TREE_CODE (t) == TYPE_PACK_EXPANSION) error ("mismatched argument pack lengths while expanding " "%<%T%>", pattern); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae30.C b/gcc/testsuite/g++.dg/cpp0x/sfinae30.C new file mode 100644 index 00000000000..6fcf5f75609 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae30.C @@ -0,0 +1,25 @@ +// { dg-do compile { target c++11 } } + +template <class... T> struct tuple; +template <class T> struct tuple<T> { T t; }; + +template <class T, class U> struct pair; +template<> struct pair<int,double> { }; + +template <class... Ts> +struct A +{ + template <class... Us, + class V = tuple<pair<Ts,Us>...> > + static void f(Us...) + { + V v; + } + template <class U> + static void f(bool); +}; + +int main() +{ + A<int,float>::f<double>(1.0); +} |

