authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-21 00:02:18-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-21 00:02:18-04:00
logf68d724647b33028310471b5e7a32dd5898ac961
tree47bf0627012645ca3b070b753d519972ec1dc26e
parent38059e6f97ae62aab9d3ca2f386eca1a1186a930

parse-c: support function calls


2 files changed, 38 insertions(+), 7 deletions(-)

src/parsec.cpp+28-7
......@@ -1178,6 +1178,13 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
11781178 return nullptr;
11791179 return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node);
11801180 }
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 }
11811188 case CK_Dependent:
11821189 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_Dependent");
11831190 return nullptr;
......@@ -1208,9 +1215,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
12081215 case CK_ArrayToPointerDecay:
12091216 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ArrayToPointerDecay");
12101217 return nullptr;
1211 case CK_FunctionToPointerDecay:
1212 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_FunctionToPointerDecay");
1213 return nullptr;
12141218 case CK_NullToPointer:
12151219 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_NullToPointer");
12161220 return nullptr;
......@@ -1719,6 +1723,25 @@ static AstNode *trans_while_loop(Context *c, AstNode *block, WhileStmt *stmt) {
17191723 return while_node;
17201724}
17211725
1726static AstNode *trans_call_expr(Context *c, bool result_used, AstNode *block, CallExpr *stmt) {
1727 AstNode *node = trans_create_node(c, NodeTypeFnCallExpr);
1728 node->data.fn_call_expr.fn_ref_expr = trans_expr(c, true, block, stmt->getCallee(), TransRValue);
1729 if (node->data.fn_call_expr.fn_ref_expr == nullptr)
1730 return nullptr;
1731
1732 unsigned num_args = stmt->getNumArgs();
1733 Expr **args = stmt->getArgs();
1734 for (unsigned i = 0; i < num_args; i += 1) {
1735 AstNode *arg_node = trans_expr(c, true, block, args[i], TransRValue);
1736 if (arg_node == nullptr)
1737 return nullptr;
1738
1739 node->data.fn_call_expr.params.append(arg_node);
1740 }
1741
1742 return node;
1743}
1744
17221745static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
17231746 Stmt::StmtClass sc = stmt->getStmtClass();
17241747 switch (sc) {
......@@ -1744,6 +1767,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
17441767 return trans_local_declaration(c, block, (DeclStmt *)stmt);
17451768 case Stmt::WhileStmtClass:
17461769 return trans_while_loop(c, block, (WhileStmt *)stmt);
1770 case Stmt::CallExprClass:
1771 return trans_call_expr(c, result_used, block, (CallExpr *)stmt);
17471772 case Stmt::CaseStmtClass:
17481773 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
17491774 return nullptr;
......@@ -1882,10 +1907,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
18821907 case Stmt::CXXUuidofExprClass:
18831908 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXUuidofExprClass");
18841909 return nullptr;
1885 case Stmt::CallExprClass:
1886 (void)result_used;
1887 emit_warning(c, stmt->getLocStart(), "TODO handle C CallExprClass");
1888 return nullptr;
18891910 case Stmt::CUDAKernelCallExprClass:
18901911 emit_warning(c, stmt->getLocStart(), "TODO handle C CUDAKernelCallExprClass");
18911912 return nullptr;
test/parsec.zig+10
......@@ -363,4 +363,14 @@ pub fn addCases(cases: &tests.ParseCContext) {
363363 \\pub const One = 0;
364364 \\pub const Two = 1;
365365 );
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 );
366376}