authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-09-20 21:17:41-07:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-09-20 21:17:41-07:00
logbf6d32f8cbaf6fd120962853089123b1ee800b99
tree4bc6bb8deed2471581628170a8f6b036e59db764
parent46fef543f945bb2ddce32073c16b93a153a47754
parentf68d724647b33028310471b5e7a32dd5898ac961

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


2 files changed, 59 insertions(+), 10 deletions(-)

src/parsec.cpp+39-10
......@@ -137,6 +137,9 @@ static AstNode *trans_create_node_fn_call_1(Context *c, AstNode *fn_ref_expr, As
137137
138138static AstNode *trans_create_node_field_access(Context *c, AstNode *container, Buf *field_name) {
139139 AstNode *node = trans_create_node(c, NodeTypeFieldAccessExpr);
140 if (container->type == NodeTypeSymbol) {
141 assert(container->data.symbol_expr.symbol != nullptr);
142 }
140143 node->data.field_access_expr.struct_expr = container;
141144 node->data.field_access_expr.field_name = field_name;
142145 return node;
......@@ -1175,6 +1178,13 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
11751178 return nullptr;
11761179 return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node);
11771180 }
1181 case CK_FunctionToPointerDecay:
1182 {
1183 AstNode *target_node = trans_expr(c, true, block, stmt->getSubExpr(), TransRValue);
1184 if (target_node == nullptr)
1185 return nullptr;
1186 return target_node;
1187 }
11781188 case CK_Dependent:
11791189 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_Dependent");
11801190 return nullptr;
......@@ -1205,9 +1215,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
12051215 case CK_ArrayToPointerDecay:
12061216 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ArrayToPointerDecay");
12071217 return nullptr;
1208 case CK_FunctionToPointerDecay:
1209 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_FunctionToPointerDecay");
1210 return nullptr;
12111218 case CK_NullToPointer:
12121219 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_NullToPointer");
12131220 return nullptr;
......@@ -1740,6 +1747,25 @@ static AstNode *trans_if_statement(Context *c, AstNode *block, IfStmt *stmt) {
17401747 return if_node;
17411748}
17421749
1750static AstNode *trans_call_expr(Context *c, bool result_used, AstNode *block, CallExpr *stmt) {
1751 AstNode *node = trans_create_node(c, NodeTypeFnCallExpr);
1752 node->data.fn_call_expr.fn_ref_expr = trans_expr(c, true, block, stmt->getCallee(), TransRValue);
1753 if (node->data.fn_call_expr.fn_ref_expr == nullptr)
1754 return nullptr;
1755
1756 unsigned num_args = stmt->getNumArgs();
1757 Expr **args = stmt->getArgs();
1758 for (unsigned i = 0; i < num_args; i += 1) {
1759 AstNode *arg_node = trans_expr(c, true, block, args[i], TransRValue);
1760 if (arg_node == nullptr)
1761 return nullptr;
1762
1763 node->data.fn_call_expr.params.append(arg_node);
1764 }
1765
1766 return node;
1767}
1768
17431769static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
17441770 Stmt::StmtClass sc = stmt->getStmtClass();
17451771 switch (sc) {
......@@ -1767,6 +1793,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
17671793 return trans_while_loop(c, block, (WhileStmt *)stmt);
17681794 case Stmt::IfStmtClass:
17691795 return trans_if_statement(c, block, (IfStmt *)stmt);
1796 case Stmt::CallExprClass:
1797 return trans_call_expr(c, result_used, block, (CallExpr *)stmt);
17701798
17711799 case Stmt::CaseStmtClass:
17721800 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
......@@ -1906,10 +1934,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
19061934 case Stmt::CXXUuidofExprClass:
19071935 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXUuidofExprClass");
19081936 return nullptr;
1909 case Stmt::CallExprClass:
1910 (void)result_used;
1911 emit_warning(c, stmt->getLocStart(), "TODO handle C CallExprClass");
1912 return nullptr;
19131937 case Stmt::CUDAKernelCallExprClass:
19141938 emit_warning(c, stmt->getLocStart(), "TODO handle C CUDAKernelCallExprClass");
19151939 return nullptr;
......@@ -2551,9 +2575,14 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {
25512575
25522576 // in C each enum value is in the global namespace. so we put them there too.
25532577 // at this point we can rely on the enum emitting successfully
2554 AstNode *field_access_node = trans_create_node_field_access(c,
2555 trans_create_node_symbol(c, full_type_name), field_name);
2556 add_global_var(c, enum_val_name, field_access_node);
2578 if (is_anonymous) {
2579 AstNode *lit_node = trans_create_node_unsigned(c, i);
2580 add_global_var(c, enum_val_name, lit_node);
2581 } else {
2582 AstNode *field_access_node = trans_create_node_field_access(c,
2583 trans_create_node_symbol(c, full_type_name), field_name);
2584 add_global_var(c, enum_val_name, field_access_node);
2585 }
25572586 }
25582587
25592588 if (is_anonymous) {
test/parsec.zig+20
......@@ -353,4 +353,24 @@ pub fn addCases(cases: &tests.ParseCContext) {
353353 \\ return i;
354354 \\}
355355 );
356
357 cases.add("anonymous enum",
358 \\enum {
359 \\ One,
360 \\ Two,
361 \\};
362 ,
363 \\pub const One = 0;
364 \\pub const Two = 1;
365 );
366
367 cases.add("function call",
368 \\static void bar(void) { }
369 \\void foo(void) { bar(); }
370 ,
371 \\pub fn bar() {}
372 \\export fn foo() {
373 \\ bar();
374 \\}
375 );
356376}