authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-04-16 23:23:31+02:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-04-22 22:16:30+02:00
log69bc5fd04ddcd7772852d21c0172c24ac81ebe5c
tree5592891bb02811babb42c4d5a7decc6831b4265d
parentd3dd49c403fb42d003dd2ee6d7917d9ebb7c2569

translate-c: Pointer to/from integral conversion


1 files changed, 38 insertions(+), 8 deletions(-)

src/translate_c.cpp+38-8
...@@ -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 != 01955 // 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;
19742003
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: