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) {
580580 break;
581581 case NodeTypePrefixOpExpr:
582582 {
583 if (!grouped) fprintf(ar->f, "(");
583584 PrefixOp op = node->data.prefix_op_expr.prefix_op;
584585 fprintf(ar->f, "%s", prefix_op_str(op));
585586
586587 render_node_ungrouped(ar, node->data.prefix_op_expr.primary_expr);
588 if (!grouped) fprintf(ar->f, ")");
587589 break;
588590 }
589591 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
291291 return fn_def;
292292}
293293
294static AstNode *trans_create_node_unwrap_null(Context *c, AstNode *child) {
295 return trans_create_node_prefix_op(c, PrefixOpUnwrapMaybe, child);
296}
297
294298static AstNode *get_global(Context *c, Buf *name) {
295299 for (size_t i = 0; i < c->root->data.root.top_level_decls.length; i += 1) {
296300 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
17601764 return node;
17611765}
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
17631782static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
17641783 Stmt::StmtClass sc = stmt->getStmtClass();
17651784 switch (sc) {
......@@ -1789,7 +1808,10 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
17891808 return trans_if_statement(c, block, (IfStmt *)stmt);
17901809 case Stmt::CallExprClass:
17911810 return trans_call_expr(c, result_used, block, (CallExpr *)stmt);
1792
1811 case Stmt::NullStmtClass:
1812 return skip_add_to_block_node;
1813 case Stmt::MemberExprClass:
1814 return trans_member_expr(c, block, (MemberExpr *)stmt);
17931815 case Stmt::CaseStmtClass:
17941816 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
17951817 return nullptr;
......@@ -2034,9 +2056,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
20342056 case Stmt::MaterializeTemporaryExprClass:
20352057 emit_warning(c, stmt->getLocStart(), "TODO handle C MaterializeTemporaryExprClass");
20362058 return nullptr;
2037 case Stmt::MemberExprClass:
2038 emit_warning(c, stmt->getLocStart(), "TODO handle C MemberExprClass");
2039 return nullptr;
20402059 case Stmt::NoInitExprClass:
20412060 emit_warning(c, stmt->getLocStart(), "TODO handle C NoInitExprClass");
20422061 return nullptr;
......@@ -2159,9 +2178,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
21592178 case Stmt::MSDependentExistsStmtClass:
21602179 emit_warning(c, stmt->getLocStart(), "TODO handle C MSDependentExistsStmtClass");
21612180 return nullptr;
2162 case Stmt::NullStmtClass:
2163 emit_warning(c, stmt->getLocStart(), "TODO handle C NullStmtClass");
2164 return nullptr;
21652181 case Stmt::OMPAtomicDirectiveClass:
21662182 emit_warning(c, stmt->getLocStart(), "TODO handle C OMPAtomicDirectiveClass");
21672183 return nullptr;
test/parsec.zig+25-1
......@@ -98,7 +98,7 @@ pub fn addCases(cases: &tests.ParseCContext) {
9898 ,
9999 \\pub const BarB = enum_Bar.B;
100100 ,
101 \\pub extern fn func(a: ?&struct_Foo, b: ?&?&enum_Bar);
101 \\pub extern fn func(a: ?&struct_Foo, b: ?&(?&enum_Bar));
102102 ,
103103 \\pub const Foo = struct_Foo;
104104 ,
......@@ -454,4 +454,28 @@ pub fn addCases(cases: &tests.ParseCContext) {
454454 \\ bar();
455455 \\}
456456 );
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 );
457481}