diff options
author | Jakub Jelinek <jakub@redhat.com> | 2022-05-04 10:07:36 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2022-05-04 10:07:36 +0200 |
commit | 1c8e9bed9b9d46d479b83ae05b334543f66961fb (patch) | |
tree | f45aed122c2a325abe074685a84c1a80ffb21159 /gcc/cp/lambda.cc | |
parent | 3771486daa1e904ceae6f3e135b28e58af33849f (diff) | |
download | gcc-1c8e9bed9b9d46d479b83ae05b334543f66961fb.zip gcc-1c8e9bed9b9d46d479b83ae05b334543f66961fb.tar.gz gcc-1c8e9bed9b9d46d479b83ae05b334543f66961fb.tar.bz2 |
c++: Don't emit deprecated warnings or unavailable errors on lambda declarations
On the following testcase, we emit deprecated warnings or unavailable errors
even on merge declarations of those lambdas (the dg-bogus directives), while
IMHO we should emit them only when something actually calls those lambdas.
The following patch temporarily disables that diagnostics during
maybe_add_lambda_conv_op.
PR2173R1 also says that ambiguity between attribute-specifier-seq at the
end of requires-clause and attribute-specifier-seq from lambda-expression
should be resolved to attribute-specifier-seq for the latter. Do we need
to do anything about that? I mean, can a valid requires-clause end with
an attribute-specifier-seq? Say operator int [[]] is valid primary
expression, but requires operator int [[]] isn't valid, nor is
requires operator int, no?
2022-05-04 Jakub Jelinek <jakub@redhat.com>
* lambda.cc: Include decl.h.
(maybe_add_lambda_conv_op): Temporarily override deprecated_state to
UNAVAILABLE_DEPRECATED_SUPPRESS.
* g++.dg/cpp23/lambda-attr1.C: New test.
* g++.dg/cpp23/lambda-attr2.C: New test.
Diffstat (limited to 'gcc/cp/lambda.cc')
-rw-r--r-- | gcc/cp/lambda.cc | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc index 10834d6..afac53b 100644 --- a/gcc/cp/lambda.cc +++ b/gcc/cp/lambda.cc @@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see #include "toplev.h" #include "gimplify.h" #include "target.h" +#include "decl.h" /* Constructor for a lambda expression. */ @@ -1192,9 +1193,14 @@ maybe_add_lambda_conv_op (tree type) } } else - call = build_call_a (callop, - direct_argvec->length (), - direct_argvec->address ()); + { + /* Don't warn on deprecated or unavailable lambda declarations, unless + the lambda is actually called. */ + auto du = make_temp_override (deprecated_state, + UNAVAILABLE_DEPRECATED_SUPPRESS); + call = build_call_a (callop, direct_argvec->length (), + direct_argvec->address ()); + } CALL_FROM_THUNK_P (call) = 1; SET_EXPR_LOCATION (call, UNKNOWN_LOCATION); |