parse-c: support function calls

This commit is contained in:
Andrew Kelley 2017-09-21 00:02:18 -04:00
parent 38059e6f97
commit f68d724647
2 changed files with 38 additions and 7 deletions

View File

@ -1178,6 +1178,13 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
return nullptr;
return trans_c_cast(c, stmt->getExprLoc(), stmt->getType(), target_node);
}
case CK_FunctionToPointerDecay:
{
AstNode *target_node = trans_expr(c, true, block, stmt->getSubExpr(), TransRValue);
if (target_node == nullptr)
return nullptr;
return target_node;
}
case CK_Dependent:
emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_Dependent");
return nullptr;
@ -1208,9 +1215,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCas
case CK_ArrayToPointerDecay:
emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_ArrayToPointerDecay");
return nullptr;
case CK_FunctionToPointerDecay:
emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_FunctionToPointerDecay");
return nullptr;
case CK_NullToPointer:
emit_warning(c, stmt->getLocStart(), "TODO handle C translation cast CK_NullToPointer");
return nullptr;
@ -1719,6 +1723,25 @@ static AstNode *trans_while_loop(Context *c, AstNode *block, WhileStmt *stmt) {
return while_node;
}
static AstNode *trans_call_expr(Context *c, bool result_used, AstNode *block, CallExpr *stmt) {
AstNode *node = trans_create_node(c, NodeTypeFnCallExpr);
node->data.fn_call_expr.fn_ref_expr = trans_expr(c, true, block, stmt->getCallee(), TransRValue);
if (node->data.fn_call_expr.fn_ref_expr == nullptr)
return nullptr;
unsigned num_args = stmt->getNumArgs();
Expr **args = stmt->getArgs();
for (unsigned i = 0; i < num_args; i += 1) {
AstNode *arg_node = trans_expr(c, true, block, args[i], TransRValue);
if (arg_node == nullptr)
return nullptr;
node->data.fn_call_expr.params.append(arg_node);
}
return node;
}
static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) {
Stmt::StmtClass sc = stmt->getStmtClass();
switch (sc) {
@ -1744,6 +1767,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
return trans_local_declaration(c, block, (DeclStmt *)stmt);
case Stmt::WhileStmtClass:
return trans_while_loop(c, block, (WhileStmt *)stmt);
case Stmt::CallExprClass:
return trans_call_expr(c, result_used, block, (CallExpr *)stmt);
case Stmt::CaseStmtClass:
emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass");
return nullptr;
@ -1882,10 +1907,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s
case Stmt::CXXUuidofExprClass:
emit_warning(c, stmt->getLocStart(), "TODO handle C CXXUuidofExprClass");
return nullptr;
case Stmt::CallExprClass:
(void)result_used;
emit_warning(c, stmt->getLocStart(), "TODO handle C CallExprClass");
return nullptr;
case Stmt::CUDAKernelCallExprClass:
emit_warning(c, stmt->getLocStart(), "TODO handle C CUDAKernelCallExprClass");
return nullptr;

View File

@ -363,4 +363,14 @@ pub fn addCases(cases: &tests.ParseCContext) {
\\pub const One = 0;
\\pub const Two = 1;
);
cases.add("function call",
\\static void bar(void) { }
\\void foo(void) { bar(); }
,
\\pub fn bar() {}
\\export fn foo() {
\\ bar();
\\}
);
}