aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/lambda.cc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-05-04 10:07:36 +0200
committerJakub Jelinek <jakub@redhat.com>2022-05-04 10:07:36 +0200
commit1c8e9bed9b9d46d479b83ae05b334543f66961fb (patch)
treef45aed122c2a325abe074685a84c1a80ffb21159 /gcc/cp/lambda.cc
parent3771486daa1e904ceae6f3e135b28e58af33849f (diff)
downloadgcc-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.cc12
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);