| ... | @@ -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 |
| 137 | | 137 | |
| 138 | static AstNode *trans_create_node_field_access(Context *c, AstNode *container, Buf *field_name) { | 138 | static 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 | } |
| 1742 | | 1749 | |
| | 1750 | static 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 | |
| 1743 | static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { | 1769 | static 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); |
| 1770 | | 1798 | |
| 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) { |
| 2551 | | 2575 | |
| 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 successfully | 2577 | // 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 | } |
| 2558 | | 2587 | |
| 2559 | if (is_anonymous) { | 2588 | if (is_anonymous) { |