| ... | @@ -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 | } |
| 1721 | | 1725 | |
| | 1726 | static 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 | |
| 1722 | static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { | 1745 | static 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; |