| ... | @@ -632,6 +632,7 @@ fn transStmt( | ... | @@ -632,6 +632,7 @@ fn transStmt( |
| 632 | .ContinueStmtClass => return try transCreateNodeContinue(rp.c), | 632 | .ContinueStmtClass => return try transCreateNodeContinue(rp.c), |
| 633 | .BreakStmtClass => return transBreak(rp, scope), | 633 | .BreakStmtClass => return transBreak(rp, scope), |
| 634 | .ForStmtClass => return transForLoop(rp, scope, @ptrCast(*const ZigClangForStmt, stmt)), | 634 | .ForStmtClass => return transForLoop(rp, scope, @ptrCast(*const ZigClangForStmt, stmt)), |
| | 635 | .FloatingLiteralClass => return transFloatingLiteral(rp, scope, @ptrCast(*const ZigClangFloatingLiteral, stmt), result_used), |
| 635 | else => { | 636 | else => { |
| 636 | return revertAndWarn( | 637 | return revertAndWarn( |
| 637 | rp, | 638 | rp, |
| ... | @@ -896,16 +897,11 @@ fn transImplicitCastExpr( | ... | @@ -896,16 +897,11 @@ fn transImplicitCastExpr( |
| 896 | const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr); | 897 | const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr); |
| 897 | const sub_expr_node = try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value); | 898 | const sub_expr_node = try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value); |
| 898 | switch (ZigClangImplicitCastExpr_getCastKind(expr)) { | 899 | switch (ZigClangImplicitCastExpr_getCastKind(expr)) { |
| 899 | .BitCast => { | 900 | .BitCast, .FloatingCast, .FloatingToIntegral, .IntegralToFloating, .IntegralCast => { |
| 900 | const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr)); | 901 | const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr)); |
| 901 | const src_type = getExprQualType(c, sub_expr); | 902 | const src_type = getExprQualType(c, sub_expr); |
| 902 | return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node); | 903 | return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node); |
| 903 | }, | 904 | }, |
| 904 | .IntegralCast => { | | |
| 905 | const dest_type = ZigClangExpr_getType(@ptrCast(*const ZigClangExpr, expr)); | | |
| 906 | const src_type = ZigClangExpr_getType(sub_expr); | | |
| 907 | return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node); | | |
| 908 | }, | | |
| 909 | .FunctionToPointerDecay, .ArrayToPointerDecay => { | 905 | .FunctionToPointerDecay, .ArrayToPointerDecay => { |
| 910 | return maybeSuppressResult(rp, scope, result_used, sub_expr_node); | 906 | return maybeSuppressResult(rp, scope, result_used, sub_expr_node); |
| 911 | }, | 907 | }, |
| ... | @@ -1057,6 +1053,30 @@ fn transCCast( | ... | @@ -1057,6 +1053,30 @@ fn transCCast( |
| 1057 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); | 1053 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| 1058 | return &builtin_node.base; | 1054 | return &builtin_node.base; |
| 1059 | } | 1055 | } |
| | 1056 | if (cIsFloating(src_type) and cIsFloating(dst_type)) { |
| | 1057 | const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@floatCast"); |
| | 1058 | try builtin_node.params.push(try transQualType(rp, dst_type, loc)); |
| | 1059 | _ = try appendToken(rp.c, .Comma, ","); |
| | 1060 | try builtin_node.params.push(expr); |
| | 1061 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| | 1062 | return &builtin_node.base; |
| | 1063 | } |
| | 1064 | if (cIsFloating(src_type) and !cIsFloating(dst_type)) { |
| | 1065 | const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@floatToInt"); |
| | 1066 | try builtin_node.params.push(try transQualType(rp, dst_type, loc)); |
| | 1067 | _ = try appendToken(rp.c, .Comma, ","); |
| | 1068 | try builtin_node.params.push(expr); |
| | 1069 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| | 1070 | return &builtin_node.base; |
| | 1071 | } |
| | 1072 | if (!cIsFloating(src_type) and cIsFloating(dst_type)) { |
| | 1073 | const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@intToFloat"); |
| | 1074 | try builtin_node.params.push(try transQualType(rp, dst_type, loc)); |
| | 1075 | _ = try appendToken(rp.c, .Comma, ","); |
| | 1076 | try builtin_node.params.push(expr); |
| | 1077 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| | 1078 | return &builtin_node.base; |
| | 1079 | } |
| 1060 | // TODO: maybe widen to increase size | 1080 | // TODO: maybe widen to increase size |
| 1061 | // TODO: maybe bitcast to change sign | 1081 | // TODO: maybe bitcast to change sign |
| 1062 | // TODO: maybe truncate to reduce size | 1082 | // TODO: maybe truncate to reduce size |
| ... | @@ -1399,6 +1419,16 @@ fn transBreak(rp: RestorePoint, scope: *Scope) TransError!*ast.Node { | ... | @@ -1399,6 +1419,16 @@ fn transBreak(rp: RestorePoint, scope: *Scope) TransError!*ast.Node { |
| 1399 | return &br.base; | 1419 | return &br.base; |
| 1400 | } | 1420 | } |
| 1401 | | 1421 | |
| | 1422 | fn transFloatingLiteral(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangFloatingLiteral, used: ResultUsed) TransError!*ast.Node { |
| | 1423 | // TODO use something more accurate |
| | 1424 | const dbl = ZigClangAPFloat_getValueAsApproximateDouble(stmt); |
| | 1425 | const node = try rp.c.a().create(ast.Node.FloatLiteral); |
| | 1426 | node.* = .{ |
| | 1427 | .token = try appendTokenFmt(rp.c, .FloatLiteral, "{d}", .{dbl}), |
| | 1428 | }; |
| | 1429 | return maybeSuppressResult(rp, scope, used, &node.base); |
| | 1430 | } |
| | 1431 | |
| 1402 | fn maybeSuppressResult( | 1432 | fn maybeSuppressResult( |
| 1403 | rp: RestorePoint, | 1433 | rp: RestorePoint, |
| 1404 | scope: *Scope, | 1434 | scope: *Scope, |
| ... | @@ -1770,6 +1800,20 @@ fn cIsUnsignedInteger(qt: ZigClangQualType) bool { | ... | @@ -1770,6 +1800,20 @@ fn cIsUnsignedInteger(qt: ZigClangQualType) bool { |
| 1770 | }; | 1800 | }; |
| 1771 | } | 1801 | } |
| 1772 | | 1802 | |
| | 1803 | fn cIsFloating(qt: ZigClangQualType) bool { |
| | 1804 | const c_type = qualTypeCanon(qt); |
| | 1805 | if (ZigClangType_getTypeClass(c_type) != .Builtin) return false; |
| | 1806 | const builtin_ty = @ptrCast(*const ZigClangBuiltinType, c_type); |
| | 1807 | return switch (ZigClangBuiltinType_getKind(builtin_ty)) { |
| | 1808 | .Float, |
| | 1809 | .Double, |
| | 1810 | .Float128, |
| | 1811 | .LongDouble, |
| | 1812 | => true, |
| | 1813 | else => false, |
| | 1814 | }; |
| | 1815 | } |
| | 1816 | |
| 1773 | fn transCreateNodeAssign( | 1817 | fn transCreateNodeAssign( |
| 1774 | rp: RestorePoint, | 1818 | rp: RestorePoint, |
| 1775 | scope: *Scope, | 1819 | scope: *Scope, |
| ... | @@ -1964,7 +2008,7 @@ fn transCreateNodeAPInt(c: *Context, int: ?*const ZigClangAPSInt) !*ast.Node { | ... | @@ -1964,7 +2008,7 @@ fn transCreateNodeAPInt(c: *Context, int: ?*const ZigClangAPSInt) !*ast.Node { |
| 1964 | }; | 2008 | }; |
| 1965 | const token = try appendToken(c, .IntegerLiteral, str); | 2009 | const token = try appendToken(c, .IntegerLiteral, str); |
| 1966 | const node = try c.a().create(ast.Node.IntegerLiteral); | 2010 | const node = try c.a().create(ast.Node.IntegerLiteral); |
| 1967 | node.* = ast.Node.IntegerLiteral{ | 2011 | node.* = .{ |
| 1968 | .token = token, | 2012 | .token = token, |
| 1969 | }; | 2013 | }; |
| 1970 | return &node.base; | 2014 | return &node.base; |
| ... | @@ -2027,7 +2071,7 @@ fn transCreateNodeArrayInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.N | ... | @@ -2027,7 +2071,7 @@ fn transCreateNodeArrayInitializer(c: *Context, dot_tok: ast.TokenIndex) !*ast.N |
| 2027 | fn transCreateNodeInt(c: *Context, int: var) !*ast.Node { | 2071 | fn transCreateNodeInt(c: *Context, int: var) !*ast.Node { |
| 2028 | const token = try appendTokenFmt(c, .IntegerLiteral, "{}", .{int}); | 2072 | const token = try appendTokenFmt(c, .IntegerLiteral, "{}", .{int}); |
| 2029 | const node = try c.a().create(ast.Node.IntegerLiteral); | 2073 | const node = try c.a().create(ast.Node.IntegerLiteral); |
| 2030 | node.* = ast.Node.IntegerLiteral{ | 2074 | node.* = .{ |
| 2031 | .token = token, | 2075 | .token = token, |
| 2032 | }; | 2076 | }; |
| 2033 | return &node.base; | 2077 | return &node.base; |