https://gcc.gnu.org/g:3b0fca5835b92ca7b139ef9f06d16b65510568ef

commit r15-5903-g3b0fca5835b92ca7b139ef9f06d16b65510568ef
Author: Nina Ranns <dinka.ra...@googlemail.com>
Date:   Tue Dec 3 14:58:21 2024 +0000

    c++/contracts: ICE with contract assert on non-empty statement [PR 117579]
    
    Contract assert is an attribute on an empty statement. Currently we assert
    that the statement is empty before emitting the assertion. This has been
    changed to a conditional check that the statement is empty before the
    assertion is emitted.
    
            PR c++/117579
    
    gcc/cp/ChangeLog:
    
            * parser.cc (cp_parser_statement): Replace assertion with a
            conditional check that the statement containing a contract assert
            is empty.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/contracts/pr117579.C: New test.
    
    Signed-off-by: Nina Ranns <dinka.ra...@gmail.com>
    Reviewed-by: Jason Merrill <ja...@redhat.com>

Diff:
---
 gcc/cp/parser.cc                          | 6 ++++--
 gcc/testsuite/g++.dg/contracts/pr117579.C | 9 +++++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index e583649bc937..2995a11c60fe 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -13164,8 +13164,10 @@ cp_parser_statement (cp_parser* parser, tree 
in_statement_expr,
       if (cp_contract_assertion_p (std_attrs))
        {
          /* Add the assertion as a statement in the current block.  */
-         gcc_assert (!statement || statement == error_mark_node);
-         emit_assertion (std_attrs);
+         if (!statement)
+           emit_assertion (std_attrs);
+         /* We already checked that the contract assertion is followed by
+          a semicolon.  */
          std_attrs = NULL_TREE;
        }
     }
diff --git a/gcc/testsuite/g++.dg/contracts/pr117579.C 
b/gcc/testsuite/g++.dg/contracts/pr117579.C
new file mode 100644
index 000000000000..8878de8f23d4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/contracts/pr117579.C
@@ -0,0 +1,9 @@
+// Check that contract assertion on a non-empty statement doesn't cause an
+// ICE.
+// { dg-options "-std=c++2a -fcontracts " }
+
+void f();
+int main ()
+{
+  [[assert: true]] f(); // { dg-error "assertions must be followed by" }
+}

Reply via email to