Commit 1360af847e
Changed files (2)
src
test
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;
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];
+ \\}
+ );
+
}