| ... | @@ -1928,12 +1928,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra | ... | @@ -1928,12 +1928,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra |
| 1928 | case ZigClangCK_ConstructorConversion: | 1928 | case ZigClangCK_ConstructorConversion: |
| 1929 | emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_ConstructorConversion"); | 1929 | emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_ConstructorConversion"); |
| 1930 | return nullptr; | 1930 | return nullptr; |
| 1931 | case ZigClangCK_IntegralToPointer: | | |
| 1932 | emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_IntegralToPointer"); | | |
| 1933 | return nullptr; | | |
| 1934 | case ZigClangCK_PointerToIntegral: | | |
| 1935 | emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_PointerToIntegral"); | | |
| 1936 | return nullptr; | | |
| 1937 | case ZigClangCK_PointerToBoolean: | 1931 | case ZigClangCK_PointerToBoolean: |
| 1938 | emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_PointerToBoolean"); | 1932 | emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_PointerToBoolean"); |
| 1939 | return nullptr; | 1933 | return nullptr; |
| ... | @@ -1961,6 +1955,41 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra | ... | @@ -1961,6 +1955,41 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra |
| 1961 | // Translate as val != 0 | 1955 | // Translate as val != 0 |
| 1962 | return trans_create_node_bin_op(c, val, BinOpTypeCmpNotEq, zero); | 1956 | return trans_create_node_bin_op(c, val, BinOpTypeCmpNotEq, zero); |
| 1963 | } | 1957 | } |
| | 1958 | case ZigClangCK_PointerToIntegral: |
| | 1959 | { |
| | 1960 | AstNode *target_node = trans_expr(c, ResultUsedYes, scope, bitcast(stmt->getSubExpr()), TransRValue); |
| | 1961 | if (target_node == nullptr) |
| | 1962 | return nullptr; |
| | 1963 | |
| | 1964 | AstNode *dest_type_node = get_expr_type(c, (const ZigClangExpr *)stmt); |
| | 1965 | if (dest_type_node == nullptr) |
| | 1966 | return nullptr; |
| | 1967 | |
| | 1968 | AstNode *val_node = trans_create_node_builtin_fn_call_str(c, "ptrToInt"); |
| | 1969 | val_node->data.fn_call_expr.params.append(target_node); |
| | 1970 | // @ptrToInt always returns a usize |
| | 1971 | AstNode *node = trans_create_node_builtin_fn_call_str(c, "intCast"); |
| | 1972 | node->data.fn_call_expr.params.append(dest_type_node); |
| | 1973 | node->data.fn_call_expr.params.append(val_node); |
| | 1974 | |
| | 1975 | return maybe_suppress_result(c, result_used, node); |
| | 1976 | } |
| | 1977 | case ZigClangCK_IntegralToPointer: |
| | 1978 | { |
| | 1979 | AstNode *target_node = trans_expr(c, ResultUsedYes, scope, bitcast(stmt->getSubExpr()), TransRValue); |
| | 1980 | if (target_node == nullptr) |
| | 1981 | return nullptr; |
| | 1982 | |
| | 1983 | AstNode *dest_type_node = get_expr_type(c, (const ZigClangExpr *)stmt); |
| | 1984 | if (dest_type_node == nullptr) |
| | 1985 | return nullptr; |
| | 1986 | |
| | 1987 | AstNode *node = trans_create_node_builtin_fn_call_str(c, "intToPtr"); |
| | 1988 | node->data.fn_call_expr.params.append(dest_type_node); |
| | 1989 | node->data.fn_call_expr.params.append(target_node); |
| | 1990 | |
| | 1991 | return maybe_suppress_result(c, result_used, node); |
| | 1992 | } |
| 1964 | case ZigClangCK_IntegralToFloating: | 1993 | case ZigClangCK_IntegralToFloating: |
| 1965 | case ZigClangCK_FloatingToIntegral: | 1994 | case ZigClangCK_FloatingToIntegral: |
| 1966 | { | 1995 | { |
| ... | @@ -1972,11 +2001,12 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra | ... | @@ -1972,11 +2001,12 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra |
| 1972 | if (dest_type_node == nullptr) | 2001 | if (dest_type_node == nullptr) |
| 1973 | return nullptr; | 2002 | return nullptr; |
| 1974 | | 2003 | |
| 1975 | const bool int_to_float = (ZigClangCK)stmt->getCastKind() == ZigClangCK_IntegralToFloating; | 2004 | char const *fn = (ZigClangCK)stmt->getCastKind() == ZigClangCK_IntegralToFloating ? |
| 1976 | const char *fn = int_to_float ? "intToFloat" : "floatToInt"; | 2005 | "intToFloat" : "floatToInt"; |
| 1977 | AstNode *node = trans_create_node_builtin_fn_call_str(c, fn); | 2006 | AstNode *node = trans_create_node_builtin_fn_call_str(c, fn); |
| 1978 | node->data.fn_call_expr.params.append(dest_type_node); | 2007 | node->data.fn_call_expr.params.append(dest_type_node); |
| 1979 | node->data.fn_call_expr.params.append(target_node); | 2008 | node->data.fn_call_expr.params.append(target_node); |
| | 2009 | |
| 1980 | return maybe_suppress_result(c, result_used, node); | 2010 | return maybe_suppress_result(c, result_used, node); |
| 1981 | } | 2011 | } |
| 1982 | case ZigClangCK_FixedPointCast: | 2012 | case ZigClangCK_FixedPointCast: |