summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorville <ville@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-30 20:50:25 +0000
committerville <ville@138bc75d-0d04-0410-961f-82ee72b054a4>2017-08-30 20:50:25 +0000
commit0a60ad455b0bd28fab4e38768aef1f8070e422ec (patch)
tree58c7f175236c316521433b4c80e7a75b33472098
parent83464023d6029fc5cbad45e438226e9d2b1e4717 (diff)
downloadgcc-0a60ad455b0bd28fab4e38768aef1f8070e422ec.tar.gz
Make taking the address of an overloaded function a non-deduced context
cp/ * pt.c (unify_overload_resolution_failure): Remove. (unify_one_argument): Adjust. testsuite/ * g++.dg/overload/template6.C: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@251548 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/pt.c22
-rw-r--r--gcc/testsuite/g++.dg/overload/template6.C47
3 files changed, 60 insertions, 16 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 69267c0ec35..10ae08ae186 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2017-08-30 Ville Voutilainen <ville.voutilainen@gmail.com>
+
+ Make taking the address of an overloaded function a non-deduced context
+
+ * pt.c (unify_overload_resolution_failure): Remove.
+ (unify_one_argument): Adjust.
+
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 141b4d7564a..f4868abfda2 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -6400,16 +6400,6 @@ unify_template_argument_mismatch (bool explain_p, tree parm, tree arg)
return unify_invalid (explain_p);
}
-static int
-unify_overload_resolution_failure (bool explain_p, tree arg)
-{
- if (explain_p)
- inform (input_location,
- " could not resolve address from overloaded function %qE",
- arg);
- return unify_invalid (explain_p);
-}
-
/* Attempt to convert the non-type template parameter EXPR to the
indicated TYPE. If the conversion is successful, return the
converted value. If the conversion is unsuccessful, return
@@ -19305,12 +19295,12 @@ unify_one_argument (tree tparms, tree targs, tree parm, tree arg,
templates and at most one of a set of
overloaded functions provides a unique
match. */
-
- if (resolve_overloaded_unification
- (tparms, targs, parm, arg, strict,
- arg_strict, explain_p))
- return unify_success (explain_p);
- return unify_overload_resolution_failure (explain_p, arg);
+ resolve_overloaded_unification (tparms, targs, parm,
+ arg, strict,
+ arg_strict, explain_p);
+ /* If a unique match was not found, this is a
+ non-deduced context, so we still succeed. */
+ return unify_success (explain_p);
}
arg_expr = arg;
diff --git a/gcc/testsuite/g++.dg/overload/template6.C b/gcc/testsuite/g++.dg/overload/template6.C
new file mode 100644
index 00000000000..f2650aacba9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/template6.C
@@ -0,0 +1,47 @@
+// { dg-do compile { target c++11 } }
+
+template <typename>
+struct is_function {
+ static constexpr bool value = false;
+};
+
+template <typename R, typename ...Args>
+struct is_function<R(Args...)>
+{
+ static constexpr bool value = true;
+};
+
+template<bool, typename> struct enable_if {};
+
+template<typename T> struct enable_if<true, T>
+{
+ typedef T type;
+};
+
+template <class T>
+struct remove_pointer
+{
+ typedef T type;
+};
+
+template <class T>
+struct remove_pointer<T*>
+{
+ typedef T type;
+};
+
+void f(int) {}
+void f(double) {}
+
+template <class T>
+struct X
+{
+ template <class U=T,
+ typename enable_if<is_function<
+ typename remove_pointer<U>::type>::value,
+ bool>::type = false> X(U&&) {}
+};
+
+int main() {
+ X<void(*)(int)> x0(f);
+}