]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++, contracts: Only check contracts attributes [PR116607].
authorIain Sandoe <iain@sandoe.co.uk>
Wed, 30 Oct 2024 10:29:49 +0000 (10:29 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Wed, 30 Oct 2024 13:41:57 +0000 (13:41 +0000)
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>
gcc/cp/contracts.cc
gcc/testsuite/g++.dg/contracts/pr116607.C [new file with mode: 0644]

index 2a55b87bd0367a9ea8804fc10f99f70eecae0117..113469b49f7ddda8d0e7e9d958e132e11656f163 100644 (file)
@@ -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 (file)
index 0000000..726a5bc
--- /dev/null
@@ -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