- ast_block *block;
- block = new ast_block(parser_ctx(parser));
- if (!block)
- return nullptr;
- if (!parse_block_into(parser, block)) {
- delete block;
- return nullptr;
+ bool result = true;
+ std::unique_ptr<ast_block> block(new ast_block(parser_ctx(parser)));
+ if (parser->tok == '{') {
+ if (!parse_block_into(parser, block.get())) {
+ return false;
+ }
+ } else {
+ parser_enterblock(parser);
+
+ ast_expression* expression = nullptr;
+ if (!parse_statement(parser, block.get(), &expression, false)) {
+ result = false;
+ }
+
+ if (expression && !block->addExpr(expression)) {
+ result = false;
+ }
+
+ if (!parser_leaveblock(parser)) {
+ return false;
+ }