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...@@ -1206,6 +1206,7 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
1206 return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node);1206 return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node);
1207 }1207 }
1208 case CK_FunctionToPointerDecay:1208 case CK_FunctionToPointerDecay:
1209 case CK_ArrayToPointerDecay:
1209 {1210 {
1210 AstNode *target_node = trans_expr(c, true, block, stmt->getSubExpr(), TransRValue);1211 AstNode *target_node = trans_expr(c, true, block, stmt->getSubExpr(), TransRValue);
1211 if (target_node == nullptr)1212 if (target_node == nullptr)
...@@ -1239,9 +1240,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas...@@ -1239,9 +1240,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
1239 case CK_ToUnion:1240 case CK_ToUnion:
1240 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ToUnion");1241 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ToUnion");
1241 return nullptr;1242 return nullptr;
1242 case CK_ArrayToPointerDecay:
1243 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ArrayToPointerDecay");
1244 return nullptr;
1245 case CK_NullToPointer:1243 case CK_NullToPointer:
1246 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_NullToPointer");1244 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_NullToPointer");
1247 return nullptr;1245 return nullptr;
...@@ -1808,6 +1806,22 @@ static AstNode *trans_member_expr(Context *c, AstNode *block, MemberExpr *stmt)...@@ -1808,6 +1806,22 @@ static AstNode *trans_member_expr(Context *c, AstNode *block, MemberExpr *stmt)
1808 return node;1806 return node;
1809}1807}
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
1811static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {1825static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
1812 Stmt::StmtClass sc = stmt->getStmtClass();1826 Stmt::StmtClass sc = stmt->getStmtClass();
1813 switch (sc) {1827 switch (sc) {
...@@ -1841,6 +1855,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -1841,6 +1855,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
1841 return skip_add_to_block_node;1855 return skip_add_to_block_node;
1842 case Stmt::MemberExprClass:1856 case Stmt::MemberExprClass:
1843 return trans_member_expr(c, block, (MemberExpr *)stmt);1857 return trans_member_expr(c, block, (MemberExpr *)stmt);
1858 case Stmt::ArraySubscriptExprClass:
1859 return trans_array_subscript_expr(c, block, (ArraySubscriptExpr *)stmt);
1844 case Stmt::CaseStmtClass:1860 case Stmt::CaseStmtClass:
1845 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");1861 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
1846 return nullptr;1862 return nullptr;
...@@ -1901,9 +1917,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -1901,9 +1917,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
1901 case Stmt::ArrayInitLoopExprClass:1917 case Stmt::ArrayInitLoopExprClass:
1902 emit_warning(c, stmt->getLocStart(), "TODO handle C ArrayInitLoopExprClass");1918 emit_warning(c, stmt->getLocStart(), "TODO handle C ArrayInitLoopExprClass");
1903 return nullptr;1919 return nullptr;
1904 case Stmt::ArraySubscriptExprClass:
1905 emit_warning(c, stmt->getLocStart(), "TODO handle C ArraySubscriptExprClass");
1906 return nullptr;
1907 case Stmt::ArrayTypeTraitExprClass:1920 case Stmt::ArrayTypeTraitExprClass:
1908 emit_warning(c, stmt->getLocStart(), "TODO handle C ArrayTypeTraitExprClass");1921 emit_warning(c, stmt->getLocStart(), "TODO handle C ArrayTypeTraitExprClass");
1909 return nullptr;1922 return nullptr;
test/parsec.zig+13
...@@ -532,4 +532,17 @@ pub fn addCases(cases: &tests.ParseCContext) {...@@ -532,4 +532,17 @@ pub fn addCases(cases: &tests.ParseCContext) {
532 ,532 ,
533 \\pub var array: [100]c_int = undefined;533 \\pub var array: [100]c_int = undefined;
534 );534 );
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
535}548}