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)