diff --git a/src/parsec.cpp b/src/parsec.cpp index 7626812fa..bfe718195 100644 --- a/src/parsec.cpp +++ b/src/parsec.cpp @@ -1206,6 +1206,7 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node); } case CK_FunctionToPointerDecay: + case CK_ArrayToPointerDecay: { AstNode *target_node = trans_expr(c, true, block, stmt->getSubExpr(), TransRValue); if (target_node == nullptr) @@ -1239,9 +1240,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas case CK_ToUnion: emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ToUnion"); return nullptr; - case CK_ArrayToPointerDecay: - emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ArrayToPointerDecay"); - return nullptr; case CK_NullToPointer: emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_NullToPointer"); return nullptr; @@ -1808,6 +1806,22 @@ static AstNode *trans_member_expr(Context *c, AstNode *block, MemberExpr *stmt) return node; } +static AstNode *trans_array_subscript_expr(Context *c, AstNode *block, ArraySubscriptExpr *stmt) { + AstNode *container_node = trans_expr(c, true, block, stmt->getBase(), TransRValue); + if (container_node == nullptr) + return nullptr; + + AstNode *idx_node = trans_expr(c, true, block, stmt->getIdx(), TransRValue); + if (idx_node == nullptr) + return nullptr; + + + AstNode *node = trans_create_node(c, NodeTypeArrayAccessExpr); + node->data.array_access_expr.array_ref_expr = container_node; + node->data.array_access_expr.subscript = idx_node; + return node; +} + static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { Stmt::StmtClass sc = stmt->getStmtClass(); switch (sc) { @@ -1841,6 +1855,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s return skip_add_to_block_node; case Stmt::MemberExprClass: return trans_member_expr(c, block, (MemberExpr *)stmt); + case Stmt::ArraySubscriptExprClass: + return trans_array_subscript_expr(c, block, (ArraySubscriptExpr *)stmt); case Stmt::CaseStmtClass: emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass"); return nullptr; @@ -1901,9 +1917,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s case Stmt::ArrayInitLoopExprClass: emit_warning(c, stmt->getLocStart(), "TODO handle C ArrayInitLoopExprClass"); return nullptr; - case Stmt::ArraySubscriptExprClass: - emit_warning(c, stmt->getLocStart(), "TODO handle C ArraySubscriptExprClass"); - return nullptr; case Stmt::ArrayTypeTraitExprClass: emit_warning(c, stmt->getLocStart(), "TODO handle C ArrayTypeTraitExprClass"); return nullptr; diff --git a/test/parsec.zig b/test/parsec.zig index e2b0c6f22..482736713 100644 --- a/test/parsec.zig +++ b/test/parsec.zig @@ -532,4 +532,17 @@ pub fn addCases(cases: &tests.ParseCContext) { , \\pub var array: [100]c_int = undefined; ); + + cases.add("array access", + \\int array[100]; + \\int foo(int index) { + \\ return array[index]; + \\} + , + \\pub var array: [100]c_int = undefined; + \\export fn foo(index: c_int) -> c_int { + \\ return array[index]; + \\} + ); + }