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.  */
 };

Reply via email to