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]>
---
 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 06a7a4a3d59..1900eb924f7 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -2042,6 +2042,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 abb0d48fb66..dc407e06de3 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 3815b8c1c96..a02b01ded28 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.  */
 };
 
-- 
2.39.5 (Apple Git-154)

Reply via email to