diff options
author | Patrick Palka <ppalka@gcc.gnu.org> | 2016-02-03 20:14:43 +0000 |
---|---|---|
committer | Patrick Palka <ppalka@gcc.gnu.org> | 2016-02-03 20:14:43 +0000 |
commit | ab4bae0c13ef8574defab12befd8af9545e5b32f (patch) | |
tree | 794d580ffa605a72375fed6c65d49cc482cddf4c | |
parent | 95831c01a21a2b6aad16f7b6e1aa42a062c2ab4e (diff) | |
download | gcc-ab4bae0c13ef8574defab12befd8af9545e5b32f.zip gcc-ab4bae0c13ef8574defab12befd8af9545e5b32f.tar.gz gcc-ab4bae0c13ef8574defab12befd8af9545e5b32f.tar.bz2 |
Fix PR c++/69056 (argument pack deduction failure during overload resolution)
gcc/cp/ChangeLog:
PR c++/69056
* pt.c (try_one_overload): Handle comparing argument packs so
that there is no conflict if we deduced more arguments of an
argument pack than were explicitly specified.
gcc/testsuite/ChangeLog:
PR c++/69056
g++.dg/cpp0x/pr69056.C: New test.
From-SVN: r233108
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr69056.C | 30 |
4 files changed, 64 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 804deb0..6ac9a64 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2016-02-03 Patrick Palka <ppalka@gcc.gnu.org> + + PR c++/69056 + * pt.c (try_one_overload): Handle comparing argument packs so + that there is no conflict if we deduced more arguments of an + argument pack than were explicitly specified. + 2016-01-31 Jakub Jelinek <jakub@redhat.com> Jason Merrill <jason@redhat.com> diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 27dfdf86..9cde9c7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -18736,6 +18736,28 @@ try_one_overload (tree tparms, template args used in the function parm list with our own template parms. Discard them. */ TREE_VEC_ELT (tempargs, i) = NULL_TREE; + else if (oldelt && ARGUMENT_PACK_P (oldelt)) + { + /* Check that the argument at each index of the deduced argument pack + is equivalent to the corresponding explicitly specified argument. + We may have deduced more arguments than were explicitly specified, + and that's OK. */ + gcc_assert (ARGUMENT_PACK_INCOMPLETE_P (oldelt)); + gcc_assert (ARGUMENT_PACK_ARGS (oldelt) + == ARGUMENT_PACK_EXPLICIT_ARGS (oldelt)); + + tree explicit_pack = ARGUMENT_PACK_ARGS (oldelt); + tree deduced_pack = ARGUMENT_PACK_ARGS (elt); + + if (TREE_VEC_LENGTH (deduced_pack) + < TREE_VEC_LENGTH (explicit_pack)) + return 0; + + for (int j = 0; j < TREE_VEC_LENGTH (explicit_pack); j++) + if (!template_args_equal (TREE_VEC_ELT (explicit_pack, j), + TREE_VEC_ELT (deduced_pack, j))) + return 0; + } else if (oldelt && !template_args_equal (oldelt, elt)) return 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5bee447..1a17a9d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-03 Patrick Palka <ppalka@gcc.gnu.org> + + PR c++/69056 + g++.dg/cpp0x/pr69056.C: New test. + 2016-02-03 Vladimir Makarov <vmakarov@redhat.com> Alexandre Oliva <aoliva@redhat.com> diff --git a/gcc/testsuite/g++.dg/cpp0x/pr69056.C b/gcc/testsuite/g++.dg/cpp0x/pr69056.C new file mode 100644 index 0000000..ab4e071 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr69056.C @@ -0,0 +1,30 @@ +// { dg-do compile { target c++11 } } +// PR c++/69056 + +template <typename T, typename... Args> +void resolver(int (*) (T, Args...)); + +int funcA(int, float) { return 0; } +int funcA(double) { return 0; } + +int funcB(int, float, char) { return 0; } +int funcB(int, bool) { return 0; } +int funcB(double) { return 0; } + +int funcC(int) { return 0; } +int funcC(double) { return 0; } + +void +foo (void) +{ + resolver (&funcA); // { dg-error "no match" } + resolver<int> (&funcA); + resolver<double> (&funcA); + + resolver<int> (&funcB); // { dg-error "no match" } + resolver<int, char> (&funcB); // { dg-error "no match" } + resolver<int, float> (&funcB); + + resolver<int> (&funcC); + resolver<int, float> (&funcC); // { dg-error "no match" } +} |