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...@@ -137,6 +137,9 @@ static AstNode *trans_create_node_fn_call_1(Context *c, AstNode *fn_ref_expr, As
137137
138static AstNode *trans_create_node_field_access(Context *c, AstNode *container, Buf *field_name) {138static AstNode *trans_create_node_field_access(Context *c, AstNode *container, Buf *field_name) {
139 AstNode *node = trans_create_node(c, NodeTypeFieldAccessExpr);139 AstNode *node = trans_create_node(c, NodeTypeFieldAccessExpr);
140 if (container->type == NodeTypeSymbol) {
141 assert(container->data.symbol_expr.symbol != nullptr);
142 }
140 node->data.field_access_expr.struct_expr = container;143 node->data.field_access_expr.struct_expr = container;
141 node->data.field_access_expr.field_name = field_name;144 node->data.field_access_expr.field_name = field_name;
142 return node;145 return node;
...@@ -1175,6 +1178,13 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas...@@ -1175,6 +1178,13 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
1175 return nullptr;1178 return nullptr;
1176 return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node);1179 return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node);
1177 }1180 }
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 }
1178 case CK_Dependent:1188 case CK_Dependent:
1179 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_Dependent");1189 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_Dependent");
1180 return nullptr;1190 return nullptr;
...@@ -1205,9 +1215,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas...@@ -1205,9 +1215,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
1205 case CK_ArrayToPointerDecay:1215 case CK_ArrayToPointerDecay:
1206 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ArrayToPointerDecay");1216 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ArrayToPointerDecay");
1207 return nullptr;1217 return nullptr;
1208 case CK_FunctionToPointerDecay:
1209 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_FunctionToPointerDecay");
1210 return nullptr;
1211 case CK_NullToPointer:1218 case CK_NullToPointer:
1212 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_NullToPointer");1219 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_NullToPointer");
1213 return nullptr;1220 return nullptr;
...@@ -1740,6 +1747,25 @@ static AstNode *trans_if_statement(Context *c, AstNode *block, IfStmt *stmt) {...@@ -1740,6 +1747,25 @@ static AstNode *trans_if_statement(Context *c, AstNode *block, IfStmt *stmt) {
1740 return if_node;1747 return if_node;
1741}1748}
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
1743static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {1769static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
1744 Stmt::StmtClass sc = stmt->getStmtClass();1770 Stmt::StmtClass sc = stmt->getStmtClass();
1745 switch (sc) {1771 switch (sc) {
...@@ -1767,6 +1793,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -1767,6 +1793,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
1767 return trans_while_loop(c, block, (WhileStmt *)stmt);1793 return trans_while_loop(c, block, (WhileStmt *)stmt);
1768 case Stmt::IfStmtClass:1794 case Stmt::IfStmtClass:
1769 return trans_if_statement(c, block, (IfStmt *)stmt);1795 return trans_if_statement(c, block, (IfStmt *)stmt);
1796 case Stmt::CallExprClass:
1797 return trans_call_expr(c, result_used, block, (CallExpr *)stmt);
17701798
1771 case Stmt::CaseStmtClass:1799 case Stmt::CaseStmtClass:
1772 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");1800 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...@@ -1906,10 +1934,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
1906 case Stmt::CXXUuidofExprClass:1934 case Stmt::CXXUuidofExprClass:
1907 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXUuidofExprClass");1935 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXUuidofExprClass");
1908 return nullptr;1936 return nullptr;
1909 case Stmt::CallExprClass:
1910 (void)result_used;
1911 emit_warning(c, stmt->getLocStart(), "TODO handle C CallExprClass");
1912 return nullptr;
1913 case Stmt::CUDAKernelCallExprClass:1937 case Stmt::CUDAKernelCallExprClass:
1914 emit_warning(c, stmt->getLocStart(), "TODO handle C CUDAKernelCallExprClass");1938 emit_warning(c, stmt->getLocStart(), "TODO handle C CUDAKernelCallExprClass");
1915 return nullptr;1939 return nullptr;
...@@ -2551,9 +2575,14 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {...@@ -2551,9 +2575,14 @@ static AstNode *resolve_enum_decl(Context *c, const EnumDecl *enum_decl) {
25512575
2552 // in C each enum value is in the global namespace. so we put them there too.2576 // in C each enum value is in the global namespace. so we put them there too.
2553 // at this point we can rely on the enum emitting successfully2577 // at this point we can rely on the enum emitting successfully
2554 AstNode *field_access_node = trans_create_node_field_access(c,2578 if (is_anonymous) {
2555 trans_create_node_symbol(c, full_type_name), field_name);2579 AstNode *lit_node = trans_create_node_unsigned(c, i);
2556 add_global_var(c, enum_val_name, field_access_node);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 }
2557 }2586 }
25582587
2559 if (is_anonymous) {2588 if (is_anonymous) {
test/parsec.zig+20
...@@ -353,4 +353,24 @@ pub fn addCases(cases: &tests.ParseCContext) {...@@ -353,4 +353,24 @@ pub fn addCases(cases: &tests.ParseCContext) {
353 \\ return i;353 \\ return i;
354 \\}354 \\}
355 );355 );
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 );
356}376}