authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-21 01:38:16-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-21 01:38:29-04:00
log1360af847e5cdc8f4dc279cf64e9acd4a32d0b86
tree6dac24ab2946a48f058245820c9285948e3efdad
parent67a5a3f3d74c4ca6f241fc67590dbc94210c2948

parse-c: array access expression


2 files changed, 32 insertions(+), 6 deletions(-)

src/parsec.cpp+19-6
......@@ -1206,6 +1206,7 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
12061206 return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node);
12071207 }
12081208 case CK_FunctionToPointerDecay:
1209 case CK_ArrayToPointerDecay:
12091210 {
12101211 AstNode *target_node = trans_expr(c, true, block, stmt->getSubExpr(), TransRValue);
12111212 if (target_node == nullptr)
......@@ -1239,9 +1240,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
12391240 case CK_ToUnion:
12401241 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ToUnion");
12411242 return nullptr;
1242 case CK_ArrayToPointerDecay:
1243 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ArrayToPointerDecay");
1244 return nullptr;
12451243 case CK_NullToPointer:
12461244 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_NullToPointer");
12471245 return nullptr;
......@@ -1808,6 +1806,22 @@ static AstNode *trans_member_expr(Context *c, AstNode *block, MemberExpr *stmt)
18081806 return node;
18091807}
18101808
1809static AstNode *trans_array_subscript_expr(Context *c, AstNode *block, ArraySubscriptExpr *stmt) {
1810 AstNode *container_node = trans_expr(c, true, block, stmt->getBase(), TransRValue);
1811 if (container_node == nullptr)
1812 return nullptr;
1813
1814 AstNode *idx_node = trans_expr(c, true, block, stmt->getIdx(), TransRValue);
1815 if (idx_node == nullptr)
1816 return nullptr;
1817
1818
1819 AstNode *node = trans_create_node(c, NodeTypeArrayAccessExpr);
1820 node->data.array_access_expr.array_ref_expr = container_node;
1821 node->data.array_access_expr.subscript = idx_node;
1822 return node;
1823}
1824
18111825static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
18121826 Stmt::StmtClass sc = stmt->getStmtClass();
18131827 switch (sc) {
......@@ -1841,6 +1855,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
18411855 return skip_add_to_block_node;
18421856 case Stmt::MemberExprClass:
18431857 return trans_member_expr(c, block, (MemberExpr *)stmt);
1858 case Stmt::ArraySubscriptExprClass:
1859 return trans_array_subscript_expr(c, block, (ArraySubscriptExpr *)stmt);
18441860 case Stmt::CaseStmtClass:
18451861 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
18461862 return nullptr;
......@@ -1901,9 +1917,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
19011917 case Stmt::ArrayInitLoopExprClass:
19021918 emit_warning(c, stmt->getLocStart(), "TODO handle C ArrayInitLoopExprClass");
19031919 return nullptr;
1904 case Stmt::ArraySubscriptExprClass:
1905 emit_warning(c, stmt->getLocStart(), "TODO handle C ArraySubscriptExprClass");
1906 return nullptr;
19071920 case Stmt::ArrayTypeTraitExprClass:
19081921 emit_warning(c, stmt->getLocStart(), "TODO handle C ArrayTypeTraitExprClass");
19091922 return nullptr;
test/parsec.zig+13
......@@ -532,4 +532,17 @@ pub fn addCases(cases: &tests.ParseCContext) {
532532 ,
533533 \\pub var array: [100]c_int = undefined;
534534 );
535
536 cases.add("array access",
537 \\int array[100];
538 \\int foo(int index) {
539 \\ return array[index];
540 \\}
541 ,
542 \\pub var array: [100]c_int = undefined;
543 \\export fn foo(index: c_int) -> c_int {
544 \\ return array[index];
545 \\}
546 );
547
535548}