diff options
author | Jason Merrill <jason@redhat.com> | 2011-11-20 21:05:03 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-11-20 21:05:03 -0500 |
commit | 25a96761979b320209f0b513ad364e5d9e5a05d6 (patch) | |
tree | 1c53bba6c7eef073bcf60c707b6c7e4c061bbe2d /gcc | |
parent | c67dd256897a902e8b2fbddb04aba837e8131721 (diff) | |
download | gcc-25a96761979b320209f0b513ad364e5d9e5a05d6.zip gcc-25a96761979b320209f0b513ad364e5d9e5a05d6.tar.gz gcc-25a96761979b320209f0b513ad364e5d9e5a05d6.tar.bz2 |
* pt.c (tsubst_pack_expansion): Fix SFINAE.
From-SVN: r181548
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 93cd960..c083144 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 f0ee0c5..2ba26b2 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 0000000..6fcf5f7 --- /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); +} |