diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2024-10-30 10:29:49 +0000 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2024-10-30 13:41:57 +0000 |
commit | 673d6b2cbf610508d315526f4963793a343a2070 (patch) | |
tree | 7e287ba2f5101d8e277b2d975e08a4dd419f3dde | |
parent | e2692b9ea7bde28de2a31a3580ce9dcc25e42fa4 (diff) | |
download | gcc-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.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/contracts/pr116607.C | 6 |
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 |