https://gcc.gnu.org/g:918aa3fe87f8966e53941dfafa403b1b77cab2dc
commit r16-7085-g918aa3fe87f8966e53941dfafa403b1b77cab2dc Author: Iain Sandoe <[email protected]> Date: Fri Oct 31 11:02:13 2025 +0000 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 <[email protected]> Diff: --- gcc/cp/cp-tree.h | 7 +++++++ gcc/cp/name-lookup.cc | 4 +++- gcc/cp/name-lookup.h | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 0f6df4b0ca74..2046818301f8 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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 diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc index 16aae34ee287..823e28bef76f 100644 --- a/gcc/cp/name-lookup.cc +++ b/gcc/cp/name-lookup.cc @@ -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; diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h index 4c0ca435762b..4c167cd135c4 100644 --- a/gcc/cp/name-lookup.h +++ b/gcc/cp/name-lookup.h @@ -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. */ };
