aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNina Ranns <dinka.ranns@googlemail.com>2024-12-03 14:58:21 +0000
committerJason Merrill <jason@redhat.com>2024-12-03 14:29:00 -0500
commit3b0fca5835b92ca7b139ef9f06d16b65510568ef (patch)
tree5ab6df4844748241f51a07e69218efff57f63e1b /gcc
parente6e4cb34e30f25adfb57e998663a8a1796b8573c (diff)
downloadgcc-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.cc6
-rw-r--r--gcc/testsuite/g++.dg/contracts/pr117579.C9
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" }
+}