On 12/1/25 9:46 PM, Iain Sandoe wrote:
Changes since v1 - rebased onto r16-5785-g3b30d09ac7bbf8 (includes change to default to C++20).--- 8< --- 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.
Let's mention basic.scope.contract in the comment for sk_contract. OK with that tweak.
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 <[email protected]> --- gcc/cp/cp-tree.h | 7 +++++++ gcc/cp/name-lookup.cc | 4 +++- gcc/cp/name-lookup.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index cfdd3220284..01f066976c5 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -2048,6 +2048,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 diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc index 682f2ed49e7..e8361a9b479 100644 --- a/gcc/cp/name-lookup.cc +++ b/gcc/cp/name-lookup.cc @@ -4700,7 +4700,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"); @@ -4791,6 +4792,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; diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h index 859186a2f2c..b30ab7acc83 100644 --- a/gcc/cp/name-lookup.h +++ b/gcc/cp/name-lookup.h @@ -229,6 +229,7 @@ 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. */ sk_count /* Number of scope_kind enumerations. */ };
