diff mbox series

[pushed] c++: deduction from auto fn [PR105623]

Message ID 20220525150923.1115953-1-jason@redhat.com
State New
Headers show
Series [pushed] c++: deduction from auto fn [PR105623] | expand

Commit Message

Jason Merrill May 25, 2022, 3:09 p.m. UTC
Since my patch for PR90451, we defer mark_used of single functions as late
as possible.  And since my r12-1273, we keep BASELINK from lookup around
rather than reconstruct it later.  These both made us try to instantiate g
with a function type that still had 'auto' as its return type.

Tested x86_64-pc-linux-gnu, applying to trunk.

	PR c++/105623

gcc/cp/ChangeLog:

	* decl2.cc (mark_used): Copy type from fn to BASELINK.
	* pt.cc (unify_one_argument): Call mark_single_function.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp1y/auto-fn62.C: New test.
---
 gcc/cp/decl2.cc                        | 11 ++++++++---
 gcc/cp/pt.cc                           |  4 ++++
 gcc/testsuite/g++.dg/cpp1y/auto-fn62.C | 14 ++++++++++++++
 3 files changed, 26 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp1y/auto-fn62.C


base-commit: 1b661f3f5e712c951e774b3b91fffe4dac734cc7
prerequisite-patch-id: cc6e608c68f4eb133f6a153f83dfe4f033544cbd
prerequisite-patch-id: b29700132a341b1334a8e95d8f2809f7122f7181
diff mbox series

Patch

diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
index ae743c8a3df..e72fdf05382 100644
--- a/gcc/cp/decl2.cc
+++ b/gcc/cp/decl2.cc
@@ -5799,10 +5799,15 @@  mark_used (tree decl, tsubst_flags_t complain)
      actually used until after overload resolution.  */
   if (BASELINK_P (decl))
     {
-      decl = BASELINK_FUNCTIONS (decl);
-      if (really_overloaded_fn (decl))
+      tree fns = BASELINK_FUNCTIONS (decl);
+      if (really_overloaded_fn (fns))
 	return true;
-      decl = OVL_FIRST (decl);
+      fns = OVL_FIRST (fns);
+      if (!mark_used (fns, complain))
+	return false;
+      /* We might have deduced its return type.  */
+      TREE_TYPE (decl) = TREE_TYPE (fns);
+      return true;
     }
 
   if (!DECL_P (decl))
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index b45a29926d2..76913cb1409 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -22643,6 +22643,10 @@  unify_one_argument (tree tparms, tree targs, tree parm, tree arg,
 	      return unify_success (explain_p);
 	    }
 
+	  /* Force auto deduction now.  Use tf_none to avoid redundant
+	     deprecated warning on deprecated-14.C.  */
+	  mark_single_function (arg, tf_none);
+
 	  arg_expr = arg;
 	  arg = unlowered_expr_type (arg);
 	  if (arg == error_mark_node)
diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn62.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn62.C
new file mode 100644
index 00000000000..9c2bff1ccf3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn62.C
@@ -0,0 +1,14 @@ 
+// PR c++/105623
+// { dg-do compile { target c++14 } }
+
+template <class T>
+auto g(T fn) { }
+
+template<typename>
+struct base {
+  static auto value() { }
+};
+
+struct S : base<void> {
+  static void f() { g(value); }
+};