https://gcc.gnu.org/g:673d6b2cbf610508d315526f4963793a343a2070

commit r15-4778-g673d6b2cbf610508d315526f4963793a343a2070
Author: Iain Sandoe <i...@sandoe.co.uk>
Date:   Wed Oct 30 10:29:49 2024 +0000

    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 <i...@sandoe.co.uk>

Diff:
---
 gcc/cp/contracts.cc                       | 2 +-
 gcc/testsuite/g++.dg/contracts/pr116607.C | 6 ++++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/contracts.cc b/gcc/cp/contracts.cc
index 2a55b87bd036..113469b49f7d 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 000000000000..726a5bcf646d
--- /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

Reply via email to