diff options
author | Jason Merrill <jason@redhat.com> | 2020-02-15 14:48:08 +0100 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2020-02-15 14:59:32 +0100 |
commit | 1e166191ef330f3491d405bf3eb09b2b796c9b0e (patch) | |
tree | 3c7f342cbc19b7cd380c94f786b955ffc31417ad /gcc | |
parent | d71365427670a791c5b54bfec6e3d41210844a8a (diff) | |
download | gcc-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/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-lambda5.C | 10 |
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>(); } |