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...@@ -1178,6 +1178,13 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
1178 return nullptr;1178 return nullptr;
1179 return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node);1179 return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node);
1180 }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 }
1181 case CK_Dependent:1188 case CK_Dependent:
1182 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");
1183 return nullptr;1190 return nullptr;
...@@ -1208,9 +1215,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas...@@ -1208,9 +1215,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
1208 case CK_ArrayToPointerDecay:1215 case CK_ArrayToPointerDecay:
1209 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");
1210 return nullptr;1217 return nullptr;
1211 case CK_FunctionToPointerDecay:
1212 emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_FunctionToPointerDecay");
1213 return nullptr;
1214 case CK_NullToPointer:1218 case CK_NullToPointer:
1215 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");
1216 return nullptr;1220 return nullptr;
...@@ -1719,6 +1723,25 @@ static AstNode *trans_while_loop(Context *c, AstNode *block, WhileStmt *stmt) {...@@ -1719,6 +1723,25 @@ static AstNode *trans_while_loop(Context *c, AstNode *block, WhileStmt *stmt) {
1719 return while_node;1723 return while_node;
1720}1724}
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
1722static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {1745static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
1723 Stmt::StmtClass sc = stmt->getStmtClass();1746 Stmt::StmtClass sc = stmt->getStmtClass();
1724 switch (sc) {1747 switch (sc) {
...@@ -1744,6 +1767,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -1744,6 +1767,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
1744 return trans_local_declaration(c, block, (DeclStmt *)stmt);1767 return trans_local_declaration(c, block, (DeclStmt *)stmt);
1745 case Stmt::WhileStmtClass:1768 case Stmt::WhileStmtClass:
1746 return trans_while_loop(c, block, (WhileStmt *)stmt);1769 return trans_while_loop(c, block, (WhileStmt *)stmt);
1770 case Stmt::CallExprClass:
1771 return trans_call_expr(c, result_used, block, (CallExpr *)stmt);
1747 case Stmt::CaseStmtClass:1772 case Stmt::CaseStmtClass:
1748 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");1773 emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
1749 return nullptr;1774 return nullptr;
...@@ -1882,10 +1907,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s...@@ -1882,10 +1907,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
1882 case Stmt::CXXUuidofExprClass:1907 case Stmt::CXXUuidofExprClass:
1883 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXUuidofExprClass");1908 emit_warning(c, stmt->getLocStart(), "TODO handle C CXXUuidofExprClass");
1884 return nullptr;1909 return nullptr;
1885 case Stmt::CallExprClass:
1886 (void)result_used;
1887 emit_warning(c, stmt->getLocStart(), "TODO handle C CallExprClass");
1888 return nullptr;
1889 case Stmt::CUDAKernelCallExprClass:1910 case Stmt::CUDAKernelCallExprClass:
1890 emit_warning(c, stmt->getLocStart(), "TODO handle C CUDAKernelCallExprClass");1911 emit_warning(c, stmt->getLocStart(), "TODO handle C CUDAKernelCallExprClass");
1891 return nullptr;1912 return nullptr;
test/parsec.zig+10
...@@ -363,4 +363,14 @@ pub fn addCases(cases: &tests.ParseCContext) {...@@ -363,4 +363,14 @@ pub fn addCases(cases: &tests.ParseCContext) {
363 \\pub const One = 0;363 \\pub const One = 0;
364 \\pub const Two = 1;364 \\pub const Two = 1;
365 );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 );
366}376}