[committed] c++: Fix lambda in atomic constraint [PR92556]
diff mbox series

Message ID 20200215140834.17379-1-jason@redhat.com
State New
Headers show
Series
  • [committed] c++: Fix lambda in atomic constraint [PR92556]
Related show

Commit Message

Jason Merrill Feb. 15, 2020, 2:08 p.m. UTC
find_template_parameters needs to find the mention of T in the lambda.
Fixing that leaves this as a hard error, which may be surprising but is
consistent with lambdas in other SFINAE contexts like template argument
deduction.

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

gcc/cp/ChangeLog
2020-02-15  Jason Merrill  <jason@redhat.com>

	PR c++/92556
	* pt.c (any_template_parm_r): Look into lambda body.
---
 gcc/cp/pt.c                                   |  9 +++++++++
 gcc/testsuite/g++.dg/cpp2a/concepts-lambda5.C | 10 ++++++++++
 2 files changed, 19 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-lambda5.C


base-commit: d71365427670a791c5b54bfec6e3d41210844a8a

Patch
diff mbox series

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index d19bde7bcbe..6c9abb8f3d3 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -10479,6 +10479,15 @@  any_template_parm_r (tree t, void *data)
       }
       break;
 
+    case LAMBDA_EXPR:
+      {
+	/* Look in the parms and body.  */
+	tree fn = lambda_function (t);
+	WALK_SUBTREE (TREE_TYPE (fn));
+	WALK_SUBTREE (DECL_SAVED_TREE (fn));
+      }
+      break;
+
     default:
       break;
     }
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-lambda5.C b/gcc/testsuite/g++.dg/cpp2a/concepts-lambda5.C
new file mode 100644
index 00000000000..fe471899c14
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-lambda5.C
@@ -0,0 +1,10 @@ 
+// PR c++/92556
+// { dg-do compile { target c++2a } }
+
+// Having this as a hard error is consistent with template argument deduction;
+// it's an open core issue (jason 2020-02-14).
+template <class T> concept has_value
+  = requires { []{T::value;}; }; // { dg-error "" }
+template <has_value T> void f() { }
+template <class T> void f() { }
+void q() { f<int>(); }