aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2024-10-30 10:29:49 +0000
committerIain Sandoe <iain@sandoe.co.uk>2024-10-30 13:41:57 +0000
commit673d6b2cbf610508d315526f4963793a343a2070 (patch)
tree7e287ba2f5101d8e277b2d975e08a4dd419f3dde
parente2692b9ea7bde28de2a31a3580ce9dcc25e42fa4 (diff)
downloadgcc-673d6b2cbf610508d315526f4963793a343a2070.zip
gcc-673d6b2cbf610508d315526f4963793a343a2070.tar.gz
gcc-673d6b2cbf610508d315526f4963793a343a2070.tar.bz2
c++, contracts: Only check contracts attributes [PR116607].
The ICE described in the PR is caused by not filtering out non- contract attributes before making the has_active_contract_condition test. Fixed, as suggested by Andrew Pinski, by just using the existing CONTRACT_CHAIN () macro to advance through the list. PR c++/116607 gcc/cp/ChangeLog: * contracts.cc (has_active_contract_condition): Use the CONTRACT_CHAIN macro to advance through the attribute list. gcc/testsuite/ChangeLog: * g++.dg/contracts/pr116607.C: New test. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
-rw-r--r--gcc/cp/contracts.cc2
-rw-r--r--gcc/testsuite/g++.dg/contracts/pr116607.C6
2 files changed, 7 insertions, 1 deletions
diff --git a/gcc/cp/contracts.cc b/gcc/cp/contracts.cc
index 2a55b87..113469b 100644
--- a/gcc/cp/contracts.cc
+++ b/gcc/cp/contracts.cc
@@ -1494,7 +1494,7 @@ contract_active_p (tree contract)
static bool
has_active_contract_condition (tree d, tree_code c)
{
- for (tree as = DECL_CONTRACTS (d) ; as != NULL_TREE; as = TREE_CHAIN (as))
+ for (tree as = DECL_CONTRACTS (d) ; as != NULL_TREE; as = CONTRACT_CHAIN (as))
{
tree contract = TREE_VALUE (TREE_VALUE (as));
if (TREE_CODE (contract) == c && contract_active_p (contract))
diff --git a/gcc/testsuite/g++.dg/contracts/pr116607.C b/gcc/testsuite/g++.dg/contracts/pr116607.C
new file mode 100644
index 0000000..726a5bc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/contracts/pr116607.C
@@ -0,0 +1,6 @@
+// { dg-options "-std=c++20 -fcontracts " }
+struct a {
+ __attribute__((no_sanitize("")))
+ int f(int) [[pre:true]];
+};
+int a::f(int) { return 0; } \ No newline at end of file