aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2025-08-30 12:14:58 +0100
committerIain Sandoe <iain@sandoe.co.uk>2025-09-02 16:01:33 +0100
commitff9e44ee3189d24127bc754a8563be4615239730 (patch)
treec133f3476ee2bad1995c95242c3dcde89617fc8c
parent2552c73c7cdf9dffc197e6fe59e19181348464b7 (diff)
downloadgcc-ff9e44ee3189d24127bc754a8563be4615239730.zip
gcc-ff9e44ee3189d24127bc754a8563be4615239730.tar.gz
gcc-ff9e44ee3189d24127bc754a8563be4615239730.tar.bz2
c++, contracts: Simplify contracts headers [NFC].
We have contracts-related declarations and macros split between contracts.h and cp-tree.h, and then contracts.h is included in the latter, which means that it is included in all c++ front end files. This patch: - moves all the contracts-related material to contracts.h. - makes some functions that are only used in contracts.cc static. - tries to group the external API for contracts into related topics. - includes contracts.h in the front end sources that need it. gcc/cp/ChangeLog: * constexpr.cc: Include contracts.h * coroutines.cc: Likewise. * cp-gimplify.cc: Likewise. * decl.cc: Likewise. * decl2.cc: Likewise. * mangle.cc: Likewise. * module.cc: Likewise. * pt.cc: Likewise. * search.cc: Likewise. * semantics.cc: Likewise. * contracts.cc (validate_contract_role, setup_default_contract_role, add_contract_role, get_concrete_axiom_semantic, get_default_contract_role): Make static. * cp-tree.h (make_postcondition_variable, grok_contract, finish_contract_condition, find_contract, set_decl_contracts, get_contract_semantic, set_contract_semantic): Move to contracts.h. * contracts.h (get_contract_role, add_contract_role, validate_contract_role, setup_default_contract_role, lookup_concrete_semantic, get_default_contract_role): Remove. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
-rw-r--r--gcc/cp/constexpr.cc1
-rw-r--r--gcc/cp/contracts.cc22
-rw-r--r--gcc/cp/contracts.h98
-rw-r--r--gcc/cp/coroutines.cc1
-rw-r--r--gcc/cp/cp-gimplify.cc1
-rw-r--r--gcc/cp/cp-tree.h45
-rw-r--r--gcc/cp/decl.cc1
-rw-r--r--gcc/cp/decl2.cc1
-rw-r--r--gcc/cp/mangle.cc1
-rw-r--r--gcc/cp/module.cc1
-rw-r--r--gcc/cp/pt.cc1
-rw-r--r--gcc/cp/search.cc1
-rw-r--r--gcc/cp/semantics.cc1
13 files changed, 91 insertions, 84 deletions
diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index 701420c..c3d0524 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -41,6 +41,7 @@ along with GCC; see the file COPYING3. If not see
#include "fold-const.h"
#include "intl.h"
#include "toplev.h"
+#include "contracts.h"
static bool verify_constant (tree, bool, bool *, bool *);
#define VERIFY_CONSTANT(X) \
diff --git a/gcc/cp/contracts.cc b/gcc/cp/contracts.cc
index d0cfd2e..042524d 100644
--- a/gcc/cp/contracts.cc
+++ b/gcc/cp/contracts.cc
@@ -159,7 +159,7 @@ bool valid_configs[CCS_MAYBE + 1][CCS_MAYBE + 1] = {
{ 0, 1, 0, 0, 1, },
};
-void
+static void
validate_contract_role (contract_role *role)
{
gcc_assert (role);
@@ -171,7 +171,7 @@ validate_contract_role (contract_role *role)
"the %<default%> semantic");
}
-contract_semantic
+static contract_semantic
lookup_concrete_semantic (const char *name)
{
if (strcmp (name, "ignore") == 0)
@@ -210,7 +210,9 @@ role_name_equal (contract_role *role, const char *name)
return role_name_equal (role->name, name);
}
-contract_role *
+static void setup_default_contract_role (bool update = true);
+
+static contract_role *
get_contract_role (const char *name)
{
for (int i = 0; i < max_custom_roles; ++i)
@@ -227,12 +229,12 @@ get_contract_role (const char *name)
return NULL;
}
-contract_role *
+static contract_role *
add_contract_role (const char *name,
contract_semantic des,
contract_semantic aus,
contract_semantic axs,
- bool update)
+ bool update = true)
{
for (int i = 0; i < max_custom_roles; ++i)
{
@@ -271,7 +273,7 @@ get_concrete_axiom_semantic ()
return flag_contract_assumption_mode ? CCS_ASSUME : CCS_IGNORE;
}
-void
+static void
setup_default_contract_role (bool update)
{
contract_semantic check = get_concrete_check ();
@@ -491,6 +493,14 @@ handle_OPT_fcontract_semantic_ (const char *arg)
validate_contract_role (role);
}
+/* Returns the default role. */
+
+static contract_role *
+get_default_contract_role ()
+{
+ return get_contract_role ("default");
+}
+
/* Convert a contract CONFIG into a contract_mode. */
static contract_mode
diff --git a/gcc/cp/contracts.h b/gcc/cp/contracts.h
index 7d955f7..ead07d1 100644
--- a/gcc/cp/contracts.h
+++ b/gcc/cp/contracts.h
@@ -131,38 +131,20 @@ struct contract_mode
} u;
};
-extern contract_role *get_contract_role (const char *);
-extern contract_role *add_contract_role (const char *,
- contract_semantic,
- contract_semantic,
- contract_semantic,
- bool = true);
-extern void validate_contract_role (contract_role *);
-extern void setup_default_contract_role (bool = true);
-extern contract_semantic lookup_concrete_semantic (const char *);
-
/* Map a source level semantic or level name to its value, or invalid. */
extern contract_semantic map_contract_semantic (const char *);
extern contract_level map_contract_level (const char *);
/* Check if an attribute is a cxx contract attribute. */
-extern bool cxx_contract_attribute_p (const_tree);
-extern bool cp_contract_assertion_p (const_tree);
-
-/* Returns the default role. */
-
-inline contract_role *
-get_default_contract_role ()
-{
- return get_contract_role ("default");
-}
+extern bool cxx_contract_attribute_p (const_tree);
+extern bool cp_contract_assertion_p (const_tree);
/* Handle various command line arguments related to semantic mapping. */
-extern void handle_OPT_fcontract_build_level_ (const char *);
+extern void handle_OPT_fcontract_build_level_ (const char *);
extern void handle_OPT_fcontract_assumption_mode_ (const char *);
extern void handle_OPT_fcontract_continuation_mode_ (const char *);
-extern void handle_OPT_fcontract_role_ (const char *);
-extern void handle_OPT_fcontract_semantic_ (const char *);
+extern void handle_OPT_fcontract_role_ (const char *);
+extern void handle_OPT_fcontract_semantic_ (const char *);
enum contract_matching_context
{
@@ -277,29 +259,79 @@ enum contract_matching_context
#define DECL_IS_POST_FN_P(NODE) \
(DECL_ABSTRACT_ORIGIN (NODE) && DECL_POST_FN (DECL_ABSTRACT_ORIGIN (NODE)) == NODE)
+/* contracts.cc */
+extern void emit_assertion (tree);
+
extern void remove_contract_attributes (tree);
+extern bool all_attributes_are_contracts_p (tree);
+extern tree finish_contract_attribute (tree, tree);
extern void copy_contract_attributes (tree, tree);
+extern bool diagnose_misapplied_contracts (tree);
extern void remap_contracts (tree, tree, tree, bool);
+extern tree splice_out_contracts (tree);
+extern void inherit_base_contracts (tree, tree);
+
+extern tree make_postcondition_variable (cp_expr);
+extern tree make_postcondition_variable (cp_expr, tree);
extern void maybe_update_postconditions (tree);
extern void rebuild_postconditions (tree);
extern bool check_postcondition_result (tree, tree, location_t);
-extern tree get_precondition_function (tree);
-extern tree get_postcondition_function (tree);
+
+extern tree grok_contract (tree, tree, tree, cp_expr,
+ location_t);
+extern tree finish_contract_condition (cp_expr);
+extern void update_late_contract (tree, tree, tree);
+extern tree invalidate_contract (tree);
extern void duplicate_contracts (tree, tree);
+
extern void match_deferred_contracts (tree);
extern void defer_guarded_contract_match (tree, tree, tree);
-extern bool diagnose_misapplied_contracts (tree);
-extern tree finish_contract_attribute (tree, tree);
-extern tree invalidate_contract (tree);
-extern void update_late_contract (tree, tree, tree);
-extern tree splice_out_contracts (tree);
-extern bool all_attributes_are_contracts_p (tree);
-extern void inherit_base_contracts (tree, tree);
+
+extern tree get_precondition_function (tree);
+extern tree get_postcondition_function (tree);
extern void start_function_contracts (tree);
extern void maybe_apply_function_contracts (tree);
extern void finish_function_contracts (tree);
extern void set_contract_functions (tree, tree, tree);
+
extern tree build_contract_check (tree);
-extern void emit_assertion (tree);
+
+/* Return the first contract in ATTRS, or NULL_TREE if there are none. */
+
+inline tree
+find_contract (tree attrs)
+{
+ while (attrs && !cxx_contract_attribute_p (attrs))
+ attrs = TREE_CHAIN (attrs);
+ return attrs;
+}
+
+inline void
+set_decl_contracts (tree decl, tree contract_attrs)
+{
+ remove_contract_attributes (decl);
+ DECL_ATTRIBUTES (decl) = chainon (DECL_ATTRIBUTES (decl), contract_attrs);
+}
+
+/* Returns the computed semantic of the node. */
+
+inline contract_semantic
+get_contract_semantic (const_tree t)
+{
+ return (contract_semantic) (TREE_LANG_FLAG_3 (CONTRACT_CHECK (t))
+ | (TREE_LANG_FLAG_2 (t) << 1)
+ | (TREE_LANG_FLAG_0 ((t)) << 2));
+}
+
+/* Sets the computed semantic of the node. */
+
+inline void
+set_contract_semantic (tree t, contract_semantic semantic)
+{
+ TREE_LANG_FLAG_3 (CONTRACT_CHECK (t)) = semantic & 0x01;
+ TREE_LANG_FLAG_2 (t) = (semantic & 0x02) >> 1;
+ TREE_LANG_FLAG_0 (t) = (semantic & 0x04) >> 2;
+}
+
#endif /* ! GCC_CP_CONTRACT_H */
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index 690e510..af1c4bc 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see
#include "gcc-rich-location.h"
#include "hash-map.h"
#include "coroutines.h"
+#include "contracts.h"
/* ================= Debug. ================= */
diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc
index 4ff8f36a..39da4ff 100644
--- a/gcc/cp/cp-gimplify.cc
+++ b/gcc/cp/cp-gimplify.cc
@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see
#include "omp-general.h"
#include "opts.h"
#include "gcc-urlifier.h"
+#include "contracts.h"
/* Keep track of forward references to immediate-escalating functions in
case they become consteval. This vector contains ADDR_EXPRs and
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 55e8e07..8520ca0 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -25,7 +25,6 @@ along with GCC; see the file COPYING3. If not see
#include "hard-reg-set.h"
#include "function.h"
#include "tristate.h"
-#include "contracts.h"
/* In order for the format checking to accept the C++ front end
diagnostic framework extensions, you must include this file before
@@ -9110,50 +9109,6 @@ extern tree coro_get_ramp_function (tree);
extern tree co_await_get_resume_call (tree await_expr);
-
-/* contracts.cc */
-extern tree make_postcondition_variable (cp_expr);
-extern tree make_postcondition_variable (cp_expr, tree);
-extern tree grok_contract (tree, tree, tree, cp_expr, location_t);
-extern tree finish_contract_condition (cp_expr);
-
-/* Return the first contract in ATTRS, or NULL_TREE if there are none. */
-
-inline tree
-find_contract (tree attrs)
-{
- while (attrs && !cxx_contract_attribute_p (attrs))
- attrs = TREE_CHAIN (attrs);
- return attrs;
-}
-
-inline void
-set_decl_contracts (tree decl, tree contract_attrs)
-{
- remove_contract_attributes (decl);
- DECL_ATTRIBUTES (decl) = chainon (DECL_ATTRIBUTES (decl), contract_attrs);
-}
-
-/* Returns the computed semantic of the node. */
-
-inline contract_semantic
-get_contract_semantic (const_tree t)
-{
- return (contract_semantic) (TREE_LANG_FLAG_3 (CONTRACT_CHECK (t))
- | (TREE_LANG_FLAG_2 (t) << 1)
- | (TREE_LANG_FLAG_0 ((t)) << 2));
-}
-
-/* Sets the computed semantic of the node. */
-
-inline void
-set_contract_semantic (tree t, contract_semantic semantic)
-{
- TREE_LANG_FLAG_3 (CONTRACT_CHECK (t)) = semantic & 0x01;
- TREE_LANG_FLAG_2 (t) = (semantic & 0x02) >> 1;
- TREE_LANG_FLAG_0 (t) = (semantic & 0x04) >> 2;
-}
-
/* Inline bodies. */
inline tree
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 4b1a335..f088d09 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -60,6 +60,7 @@ along with GCC; see the file COPYING3. If not see
#include "opts.h"
#include "langhooks-def.h" /* For lhd_simulate_record_decl */
#include "coroutines.h"
+#include "contracts.h"
#include "gcc-urlifier.h"
#include "diagnostic-highlight-colors.h"
#include "pretty-print-markup.h"
diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
index c6c9dfc..6499be1 100644
--- a/gcc/cp/decl2.cc
+++ b/gcc/cp/decl2.cc
@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. If not see
#include "omp-general.h"
#include "tree-inline.h"
#include "escaped_string.h"
+#include "contracts.h"
/* Id for dumping the raw trees. */
int raw_dump_id;
diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc
index f48cb22..80be40d 100644
--- a/gcc/cp/mangle.cc
+++ b/gcc/cp/mangle.cc
@@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. If not see
#include "stor-layout.h"
#include "flags.h"
#include "attribs.h"
+#include "contracts.h"
/* Debugging support. */
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 9412f78..0404eae6 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -232,6 +232,7 @@ Classes used:
#include "attribs.h"
#include "intl.h"
#include "langhooks.h"
+#include "contracts.h"
/* This TU doesn't need or want to see the networking. */
#define CODY_NETWORKING 0
#include "mapper-client.h"
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 9b79267..65de1cf 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -49,6 +49,7 @@ along with GCC; see the file COPYING3. If not see
#include "builtins.h"
#include "omp-general.h"
#include "pretty-print-markup.h"
+#include "contracts.h"
/* The type of functions taking a tree, and some additional data, and
returning an int. */
diff --git a/gcc/cp/search.cc b/gcc/cp/search.cc
index cea9f7c..77b5b1d 100644
--- a/gcc/cp/search.cc
+++ b/gcc/cp/search.cc
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see
#include "stringpool.h"
#include "attribs.h"
#include "tree-inline.h"
+#include "contracts.h"
static int is_subobject_of_p (tree, tree);
static tree dfs_lookup_base (tree, void *);
diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
index 58e6f94..1937ace 100644
--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. If not see
#include "predict.h"
#include "memmodel.h"
#include "gimplify.h"
+#include "contracts.h"
/* There routines provide a modular interface to perform many parsing
operations. They may therefore be used during actual parsing, or