diff --git a/Userland/Libraries/LibCpp/AST.cpp b/Userland/Libraries/LibCpp/AST.cpp index 5ae64b30a4..f81e65ef88 100644 --- a/Userland/Libraries/LibCpp/AST.cpp +++ b/Userland/Libraries/LibCpp/AST.cpp @@ -394,8 +394,11 @@ NonnullRefPtrVector Statement::declarations() const NonnullRefPtrVector ForStatement::declarations() const { - auto declarations = m_init->declarations(); - declarations.append(m_body->declarations()); + NonnullRefPtrVector declarations; + if (m_init) + declarations.append(m_init->declarations()); + if (m_body) + declarations.append(m_body->declarations()); return declarations; } diff --git a/Userland/Libraries/LibCpp/Parser.cpp b/Userland/Libraries/LibCpp/Parser.cpp index 6c77bcf956..c4afb9ccf0 100644 --- a/Userland/Libraries/LibCpp/Parser.cpp +++ b/Userland/Libraries/LibCpp/Parser.cpp @@ -1204,13 +1204,20 @@ NonnullRefPtr Parser::parse_for_statement(ASTNode& parent) auto for_statement = create_ast_node(parent, position(), {}); consume(Token::Type::Keyword); consume(Token::Type::LeftParen); - for_statement->m_init = parse_variable_declaration(*for_statement); + if (peek().type() != Token::Type::Semicolon) + for_statement->m_init = parse_variable_declaration(*for_statement, false); consume(Token::Type::Semicolon); - for_statement->m_test = parse_expression(*for_statement); + + if (peek().type() != Token::Type::Semicolon) + for_statement->m_test = parse_expression(*for_statement); consume(Token::Type::Semicolon); - for_statement->m_update = parse_expression(*for_statement); + + if (peek().type() != Token::Type::RightParen) + for_statement->m_update = parse_expression(*for_statement); consume(Token::Type::RightParen); + for_statement->m_body = parse_statement(*for_statement); + for_statement->set_end(for_statement->m_body->end()); return for_statement; }