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" } +}