c++, contracts: Add a contract scope per basic.scope.contract.

This adds a scope for contract assertions as per the standard section
referenced.  Split out here because it is the only part of the implementation
that touches the name lookup files.

gcc/cp/ChangeLog:

	* cp-tree.h (processing_contract_condition): New.
	* name-lookup.cc (cp_binding_level_descriptor): Add contract scope.
	(begin_scope): Likewise.
	* name-lookup.h (enum scope_kind): Add sk_contract.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
This commit is contained in:
Iain Sandoe
2025-10-31 11:02:13 +00:00
parent 4e1f6865ac
commit 918aa3fe87
3 changed files with 12 additions and 1 deletions

View File

@@ -2154,6 +2154,13 @@ extern GTY(()) struct saved_scope *scope_chain;
#define processing_explicit_instantiation scope_chain->x_processing_explicit_instantiation
#define processing_omp_trait_property_expr scope_chain->x_processing_omp_trait_property_expr
/* Nonzero if we are parsing the expression of a contract condition. These
expressions appear outside the parameter list (like a trailing return
type), but are potentially evaluated. */
#define processing_contract_condition \
(scope_chain->bindings->kind == sk_contract)
#define in_discarded_stmt scope_chain->discarded_stmt
#define in_consteval_if_p scope_chain->consteval_if_p
#define in_expansion_stmt scope_chain->expansion_stmt

View File

@@ -4747,7 +4747,8 @@ cp_binding_level_descriptor (cp_binding_level *scope)
"template-explicit-spec-scope",
"transaction-scope",
"openmp-scope",
"lambda-scope"
"lambda-scope",
"contract-check-scope"
};
static_assert (ARRAY_SIZE (scope_kind_names) == sk_count,
"must keep names aligned with scope_kind enum");
@@ -4838,6 +4839,7 @@ begin_scope (scope_kind kind, tree entity)
case sk_scoped_enum:
case sk_transaction:
case sk_omp:
case sk_contract:
case sk_stmt_expr:
case sk_lambda:
scope->keep = keep_next_level_flag;

View File

@@ -229,6 +229,8 @@ enum scope_kind {
sk_transaction, /* A synchronized or atomic statement. */
sk_omp, /* An OpenMP structured block. */
sk_lambda, /* A lambda scope. */
sk_contract, /* A C++26 contract-assertion scope.
[basic.scope.contract] */
sk_count /* Number of scope_kind enumerations. */
};