| ... | ... | @@ -1928,12 +1928,6 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra |
| 1928 | 1928 | case ZigClangCK_ConstructorConversion: |
| 1929 | 1929 | emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_ConstructorConversion"); |
| 1930 | 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 | 1931 | case ZigClangCK_PointerToBoolean: |
| 1938 | 1932 | emit_warning(c, bitcast(stmt->getBeginLoc()), "TODO handle C CK_PointerToBoolean"); |
| 1939 | 1933 | return nullptr; |
| ... | ... | @@ -1961,6 +1955,41 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra |
| 1961 | 1955 | // Translate as val != 0 |
| 1962 | 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 | 1993 | case ZigClangCK_IntegralToFloating: |
| 1965 | 1994 | case ZigClangCK_FloatingToIntegral: |
| 1966 | 1995 | { |
| ... | ... | @@ -1972,11 +2001,12 @@ static AstNode *trans_implicit_cast_expr(Context *c, ResultUsed result_used, Tra |
| 1972 | 2001 | if (dest_type_node == nullptr) |
| 1973 | 2002 | return nullptr; |
| 1974 | 2003 | |
| 1975 | | const bool int_to_float = (ZigClangCK)stmt->getCastKind() == ZigClangCK_IntegralToFloating; |
| 1976 | | const char *fn = int_to_float ? "intToFloat" : "floatToInt"; |
| 2004 | char const *fn = (ZigClangCK)stmt->getCastKind() == ZigClangCK_IntegralToFloating ? |
| 2005 | "intToFloat" : "floatToInt"; |
| 1977 | 2006 | AstNode *node = trans_create_node_builtin_fn_call_str(c, fn); |
| 1978 | 2007 | node->data.fn_call_expr.params.append(dest_type_node); |
| 1979 | 2008 | node->data.fn_call_expr.params.append(target_node); |
| 2009 | |
| 1980 | 2010 | return maybe_suppress_result(c, result_used, node); |
| 1981 | 2011 | } |
| 1982 | 2012 | case ZigClangCK_FixedPointCast: |