https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117431
Bug ID: 117431
Summary: [contracts] contracts on lambdas are sometime ignored
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: c++
Assignee: iains at gcc dot gnu.org
Reporter: iains at gcc dot gnu.org
Target Milestone: ---
consider:
int foo (int x)
{
auto f1 = [] (int y)
[[pre: y > 0]] { return y * y; };
return f1 (x);
}
int main ()
{
return foo (-2);
}
---
At present, this will no build.
The reason is that the contract parsing is deferred, but never complete for the
lambda. Then, when building the contract check function, contracts which are
deferred are ignored. Net result; we fail to build a pre-check function (and
if we try to build the checks inline, that also fails because the machinery
does no understand deferred_parse trees).
-----
testing the following as a short-term fix:
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index d4c633dd6e78..39be950c97ac 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -12259,6 +12259,14 @@ cp_parser_lambda_body (cp_parser* parser, tree
lambda_expr)
removed the need for that. */
cp_parser_function_body (parser, false);
+ /* We need to parse deferred contract conditions before we try to call
+ finish_function (which will try to emit the contracts). */
+ for (tree a = DECL_ATTRIBUTES (fco); a; a = TREE_CHAIN (a))
+ {
+ if (cxx_contract_attribute_p (a))
+ cp_parser_late_contract_condition (parser, fco, a);
+ }
+
finish_lambda_function (body);
}