diff options
author | Nina Ranns <dinka.ranns@googlemail.com> | 2024-12-03 14:58:21 +0000 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2024-12-03 14:29:00 -0500 |
commit | 3b0fca5835b92ca7b139ef9f06d16b65510568ef (patch) | |
tree | 5ab6df4844748241f51a07e69218efff57f63e1b /gcc | |
parent | e6e4cb34e30f25adfb57e998663a8a1796b8573c (diff) | |
download | gcc-3b0fca5835b92ca7b139ef9f06d16b65510568ef.zip gcc-3b0fca5835b92ca7b139ef9f06d16b65510568ef.tar.gz gcc-3b0fca5835b92ca7b139ef9f06d16b65510568ef.tar.bz2 |
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.ranns@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/parser.cc | 6 | ||||
-rw-r--r-- | 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 e583649..2995a11 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 0000000..8878de8 --- /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" } +} |