aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-02-15 14:48:08 +0100
committerJason Merrill <jason@redhat.com>2020-02-15 14:59:32 +0100
commit1e166191ef330f3491d405bf3eb09b2b796c9b0e (patch)
tree3c7f342cbc19b7cd380c94f786b955ffc31417ad /gcc
parentd71365427670a791c5b54bfec6e3d41210844a8a (diff)
downloadgcc-1e166191ef330f3491d405bf3eb09b2b796c9b0e.zip
gcc-1e166191ef330f3491d405bf3eb09b2b796c9b0e.tar.gz
gcc-1e166191ef330f3491d405bf3eb09b2b796c9b0e.tar.bz2
c++: Fix lambda in atomic constraint.
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. gcc/cp/ChangeLog 2020-02-15 Jason Merrill <jason@redhat.com> PR c++/92556 * pt.c (any_template_parm_r): Look into lambda body.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/pt.c9
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-lambda5.C10
3 files changed, 22 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ed6b0d0..6ac938b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2020-02-15 Jason Merrill <jason@redhat.com>
+ PR c++/92556
+ * pt.c (any_template_parm_r): Look into lambda body.
+
PR c++/92583
* pt.c (any_template_parm_r): Remove CONSTRUCTOR handling.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index d19bde7..6c9abb8 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 0000000..fe47189
--- /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>(); }