diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index cff2db4a07eeb61febeefa83a2c46eda4009db6e..cb81d8e9229bb41518d9b8b077c08d85bb6dafd7 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -22122,6 +22122,8 @@ resolve_overloaded_unification (tree tparms,
 	      && !any_dependent_template_arguments_p (subargs))
 	    {
 	      fn = instantiate_template (fn, subargs, tf_none);
+	      if (!constraints_satisfied_p (fn))
+		continue;
 	      if (undeduced_auto_decl (fn))
 		{
 		  /* Instantiate the function to deduce its return type.  */
@@ -22268,7 +22270,8 @@ resolve_nondeduced_context (tree orig_expr, tsubst_flags_t complain)
 		  badfn = fn;
 		  badargs = subargs;
 		}
-	      else if (elem && (!goodfn || !decls_match (goodfn, elem)))
+	      else if (elem && (!goodfn || !decls_match (goodfn, elem))
+		       && constraints_satisfied_p (elem))
 		{
 		  goodfn = elem;
 		  ++good;
diff --git a/gcc/testsuite/g++.dg/concepts/fn8.C b/gcc/testsuite/g++.dg/concepts/fn8.C
index ed9008099087ef2e473551507df6715c1bcdab4f..32df5a556c0f01aa7af2ea8c02ba540ed5779a9a 100644
--- a/gcc/testsuite/g++.dg/concepts/fn8.C
+++ b/gcc/testsuite/g++.dg/concepts/fn8.C
@@ -24,5 +24,5 @@ template<typename T>
   void g(T x) { }
 
 int main () {
-  g(&f<int>); // { dg-error "no matches" }
+  g(&f<int>); // { dg-error "no match" }
 }
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C
index 238eb819e909108ff45716dc429a4296e1fa3f12..b31675d255ca1f8291d9e2c930bac1354dbadf66 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C
@@ -170,7 +170,7 @@ template<typename T> void g(T x) { }
 void driver_3 () 
 {
   g(&ok<int>);
-  g(&err<int>); // { dg-error "no matches" }
+  g(&err<int>); // { dg-error "no match" }
 }
 
 
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-fn5.C b/gcc/testsuite/g++.dg/cpp2a/concepts-fn5.C
new file mode 100644
index 0000000000000000000000000000000000000000..8f00a760d7ebe8c152c54ac975a2a8d1e1067be7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-fn5.C
@@ -0,0 +1,17 @@
+// Verify we check associated constraints when resolving the address of a
+// template-id.
+// { dg-do compile { target c++20 } }
+
+void id(auto) { }
+
+template <typename>
+int f() { return 0; }
+
+template <typename T> requires requires { T::fail(); }
+auto f() { T::fail(); }
+
+int main() {
+  using U = decltype(&f<int>);
+  (void)&f<int>;
+  id(&f<int>);
+}
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-ts2.C b/gcc/testsuite/g++.dg/cpp2a/concepts-ts2.C
index d28002c035ad73e0e615d6fb63743a8118a10b47..5942ff19327ce1074774dda5b97f194ae3736296 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-ts2.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-ts2.C
@@ -173,7 +173,7 @@ template<typename T> void g(T x) { }
 void driver_3 () 
 {
   g(&ok<int>);
-  g(&err<int>); // { dg-error "no matches" }
+  g(&err<int>); // { dg-error "no match" }
 }
 
 
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-ts3.C b/gcc/testsuite/g++.dg/cpp2a/concepts-ts3.C
index 9d47a7a083d05b86fe8cee2b46550632c5442d8b..6f7ed1ffee4671342a6b393537026e92b528e511 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-ts3.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-ts3.C
@@ -173,7 +173,7 @@ template<typename T> void g(T x) { }
 void driver_3 () 
 {
   g(&ok<int>);
-  g(&err<int>); // { dg-error "no matches" }
+  g(&err<int>); // { dg-error "no match" }
 }