std::unique_ptr<AST::TokenTree> tree = parse_token_tree ();
if (tree == nullptr)
- {
- Error error (t->get_locus (),
- "failed to parse token tree for macro invocation semi "
- "- found %qs",
- t->get_token_description ());
- add_error (std::move (error));
-
- return nullptr;
- }
+ return nullptr;
token_trees.push_back (std::move (tree));
else
{
std::unique_ptr<AST::BlockExpr> block_expr = parse_block_expr ();
- if (block_expr != nullptr)
- body = std::move (block_expr);
+ if (block_expr == nullptr)
+ return nullptr;
+ body = std::move (block_expr);
}
return std::unique_ptr<AST::Function> (
expr = parse_expr ();
if (expr == nullptr)
{
- Error error (lexer.peek_token ()->get_locus (),
- "failed to parse expression in let statement");
- add_error (std::move (error));
-
skip_after_semicolon ();
return nullptr;
}
ExprOrStmt expr_or_stmt = parse_stmt_or_expr ();
if (expr_or_stmt.is_error ())
{
- Error error (
- t->get_locus (),
- "failed to parse statement or expression in block expression");
- add_error (std::move (error));
-
+ skip_after_end_block ();
return nullptr;
}
// parse required block expr
std::unique_ptr<AST::BlockExpr> if_body = parse_block_expr ();
if (if_body == nullptr)
- {
- Error error (lexer.peek_token ()->get_locus (),
- "failed to parse if body block expression in if expression");
- add_error (std::move (error));
-
- // skip somewhere?
- return nullptr;
- }
+ return nullptr;
// branch to parse end or else (and then else, else if, or else if let)
if (lexer.peek_token ()->get_id () != ELSE)
// parse loop body, which is required
std::unique_ptr<AST::BlockExpr> loop_body = parse_block_expr ();
if (loop_body == nullptr)
- {
- Error error (lexer.peek_token ()->get_locus (),
- "could not parse loop body in (infinite) loop expression");
- add_error (std::move (error));
-
- return nullptr;
- }
+ return nullptr;
return std::unique_ptr<AST::LoopExpr> (
new AST::LoopExpr (std::move (loop_body), locus, std::move (label),
// parse null denotation (unary part of expression)
std::unique_ptr<AST::Expr> expr
= null_denotation ({}, null_denotation_restrictions);
+ if (expr == nullptr)
+ return nullptr;
return left_denotations (std::move (expr), right_binding_power,
std::move (outer_attrs), restrictions);
pub fn loopy() {
let mut a = 1;
loop {
- // { dg-error {failed to parse statement or expression in block expression} "" { target *-*-* } .-1 }
if a < 40 {
- // { dg-error {failed to parse statement or expression in block expression} "" { target *-*-* } .-1 }
a + = 1; // { dg-error "found unexpected token '=' in null denotation" }
- // { dg-error {failed to parse statement or expression in block expression} "" { target *-*-* } .-1 }
- // { dg-error {failed to parse if body block expression in if expression} "" { target *-*-* } .-2 }
- // { dg-error {could not parse loop body in \(infinite\) loop expression} "" { target *-*-* } .-3 }
- // { dg-error {unrecognised token 'integer literal' for start of item} "" { target *-*-* } .-4 }
} else {
break;
}