[gcc r12-8441] c++: deduction from auto fn [PR105623]
Jason Merrill
jason@gcc.gnu.org
Tue May 31 19:31:48 GMT 2022
https://gcc.gnu.org/g:d90576952356735a2152c318ef1d60221b958b15
commit r12-8441-gd90576952356735a2152c318ef1d60221b958b15
Author: Jason Merrill <jason@redhat.com>
Date: Tue May 24 17:37:58 2022 -0400
c++: deduction from auto fn [PR105623]
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.
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.
Diff:
---
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(-)
diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
index d2b29208ed5..d7e9980ff1e 100644
--- a/gcc/cp/decl2.cc
+++ b/gcc/cp/decl2.cc
@@ -5804,10 +5804,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 7758758f40d..f92d022a59a 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -22645,6 +22645,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); }
+};
More information about the Gcc-cvs
mailing list