authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-09-20 22:05:14-07:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-09-20 22:05:14-07:00
logf7cb77a02c2e32e9522b247e4653f1c03a677266
treec370bfefe73a6e0f5b09e49d2944bec1916d59c3
parent2ae789d27cec716c104a9e817a66f59b2ed53f47
parent0d9174750298574cd293869d255ae59e540d0ebb

Merge remote-tracking branch 'origin/c-to-zig' into c-to-zig


3 files changed, 50 insertions(+), 8 deletions(-)

src/ast_render.cpp+2
...@@ -580,10 +580,12 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {...@@ -580,10 +580,12 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
580 break;580 break;
581 case NodeTypePrefixOpExpr:581 case NodeTypePrefixOpExpr:
582 {582 {
583 if (!grouped) fprintf(ar->f, "(");
583 PrefixOp op = node->data.prefix_op_expr.prefix_op;584 PrefixOp op = node->data.prefix_op_expr.prefix_op;
584 fprintf(ar->f, "%s", prefix_op_str(op));585 fprintf(ar->f, "%s", prefix_op_str(op));
585586
586 render_node_ungrouped(ar, node->data.prefix_op_expr.primary_expr);587 render_node_ungrouped(ar, node->data.prefix_op_expr.primary_expr);
588 if (!grouped) fprintf(ar->f, ")");
587 break;589 break;
588 }590 }
589 case NodeTypeAddrOfExpr:591 case NodeTypeAddrOfExpr:
src/parsec.cpp+23-7
...@@ -291,6 +291,10 @@ static AstNode *trans_create_node_inline_fn(Context *c, Buf *fn_name, Buf *var_n...@@ -291,6 +291,10 @@ static AstNode *trans_create_node_inline_fn(Context *c, Buf *fn_name, Buf *var_n
291 return fn_def;291 return fn_def;
292}292}
293293
294static AstNode *trans_create_node_unwrap_null(Context *c, AstNode *child) {
295 return trans_create_node_prefix_op(c, PrefixOpUnwrapMaybe, child);
296}
297
294static AstNode *get_global(Context *c, Buf *name) {298static AstNode *get_global(Context *c, Buf *name) {
295 for (size_t i = 0; i < c->root->data.root.top_level_decls.length; i += 1) {299 for (size_t i = 0; i < c->root->data.root.top_level_decls.length; i += 1) {
296 AstNode *decl_node = c->root->data.root.top_level_decls.items[i];300 AstNode *decl_node = c->root->data.root.top_level_decls.items[i];
...@@ -1760,6 +1764,21 @@ static AstNode *trans_call_expr(Context *c, bool result_used, AstNode *block, Ca...@@ -1760,6 +1764,21 @@ static AstNode *trans_call_expr(Context *c, bool result_used, AstNode *block, Ca
1760 return node;1764 return node;
1761}1765}
17621766
1767static AstNode *trans_member_expr(Context *c, AstNode *block, MemberExpr *stmt) {
1768 AstNode *container_node = trans_expr(c, true, block, stmt->getBase(), TransRValue);
1769 if (container_node == nullptr)
1770 return nullptr;
1771
1772 if (stmt->isArrow()) {
1773 container_node = trans_create_node_unwrap_null(c, container_node);
1774 }
1775
1776 const char *name = decl_name(stmt->getMemberDecl());
1777
1778 AstNode *node = trans_create_node_field_access_str(c, container_node, name);
1779 return node;
1780}
1781
1763static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {1782static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
1764 Stmt::StmtClass sc = stmt->getStmtClass();1783 Stmt::StmtClass sc = stmt->getStmtClass();
1765 switch (sc) {1784 switch (sc) {
...@@ -1789,7 +1808,10 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -1789,7 +1808,10 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
1789 return trans_if_statement(c, block, (IfStmt *)stmt);1808 return trans_if_statement(c, block, (IfStmt *)stmt);
1790 case Stmt::CallExprClass:1809 case Stmt::CallExprClass:
1791 return trans_call_expr(c, result_used, block, (CallExpr *)stmt);1810 return trans_call_expr(c, result_used, block, (CallExpr *)stmt);
17921811 case Stmt::NullStmtClass:
1812 return skip_add_to_block_node;
1813 case Stmt::MemberExprClass:
1814 return trans_member_expr(c, block, (MemberExpr *)stmt);
1793 case Stmt::CaseStmtClass:1815 case Stmt::CaseStmtClass:
1794 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");1816 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
1795 return nullptr;1817 return nullptr;
...@@ -2034,9 +2056,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -2034,9 +2056,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
2034 case Stmt::MaterializeTemporaryExprClass:2056 case Stmt::MaterializeTemporaryExprClass:
2035 emit_warning(c, stmt->getLocStart(), "TODO handle C MaterializeTemporaryExprClass");2057 emit_warning(c, stmt->getLocStart(), "TODO handle C MaterializeTemporaryExprClass");
2036 return nullptr;2058 return nullptr;
2037 case Stmt::MemberExprClass:
2038 emit_warning(c, stmt->getLocStart(), "TODO handle C MemberExprClass");
2039 return nullptr;
2040 case Stmt::NoInitExprClass:2059 case Stmt::NoInitExprClass:
2041 emit_warning(c, stmt->getLocStart(), "TODO handle C NoInitExprClass");2060 emit_warning(c, stmt->getLocStart(), "TODO handle C NoInitExprClass");
2042 return nullptr;2061 return nullptr;
...@@ -2159,9 +2178,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -2159,9 +2178,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
2159 case Stmt::MSDependentExistsStmtClass:2178 case Stmt::MSDependentExistsStmtClass:
2160 emit_warning(c, stmt->getLocStart(), "TODO handle C MSDependentExistsStmtClass");2179 emit_warning(c, stmt->getLocStart(), "TODO handle C MSDependentExistsStmtClass");
2161 return nullptr;2180 return nullptr;
2162 case Stmt::NullStmtClass:
2163 emit_warning(c, stmt->getLocStart(), "TODO handle C NullStmtClass");
2164 return nullptr;
2165 case Stmt::OMPAtomicDirectiveClass:2181 case Stmt::OMPAtomicDirectiveClass:
2166 emit_warning(c, stmt->getLocStart(), "TODO handle C OMPAtomicDirectiveClass");2182 emit_warning(c, stmt->getLocStart(), "TODO handle C OMPAtomicDirectiveClass");
2167 return nullptr;2183 return nullptr;
test/parsec.zig+25-1
...@@ -98,7 +98,7 @@ pub fn addCases(cases: &tests.ParseCContext) {...@@ -98,7 +98,7 @@ pub fn addCases(cases: &tests.ParseCContext) {
98 ,98 ,
99 \\pub const BarB = enum_Bar.B;99 \\pub const BarB = enum_Bar.B;
100 ,100 ,
101 \\pub extern fn func(a: ?&struct_Foo, b: ?&?&enum_Bar);101 \\pub extern fn func(a: ?&struct_Foo, b: ?&(?&enum_Bar));
102 ,102 ,
103 \\pub const Foo = struct_Foo;103 \\pub const Foo = struct_Foo;
104 ,104 ,
...@@ -454,4 +454,28 @@ pub fn addCases(cases: &tests.ParseCContext) {...@@ -454,4 +454,28 @@ pub fn addCases(cases: &tests.ParseCContext) {
454 \\ bar();454 \\ bar();
455 \\}455 \\}
456 );456 );
457
458 cases.add("field access expression",
459 \\struct Foo {
460 \\ int field;
461 \\};
462 \\int read_field(struct Foo *foo) {
463 \\ return foo->field;
464 \\}
465 ,
466 \\pub const struct_Foo = extern struct {
467 \\ field: c_int,
468 \\};
469 \\export fn read_field(foo: ?&struct_Foo) -> c_int {
470 \\ return (??foo).field;
471 \\}
472 );
473
474 cases.add("null statements",
475 \\void foo(void) {
476 \\ ;;;;;
477 \\}
478 ,
479 \\export fn foo() {}
480 );
457}481}