| author | |
| committer | |
| log | 6951889f6ede655d58b95a48bf052260e6a21d06 |
| tree | 35ce62ba8c50f52ae2d424a7765b29f8fddec24e |
| parent | 8530b6b7242ebf43b5cb4ae3a2644593f4961a5e |
| parent | cf98dfbe22548728f247c314e3119c5a5dfceac5 |
| signature |
translate-c: Prevent mistranslation of fp literals5 files changed, 47 insertions(+), 4 deletions(-)
src/clang.zig+16| ... | ... | @@ -104,6 +104,16 @@ pub const APFloat = opaque { |
| 104 | 104 | extern fn ZigClangAPFloat_toString(*const APFloat, precision: c_uint, maxPadding: c_uint, truncateZero: bool) [*:0]const u8; |
| 105 | 105 | }; |
| 106 | 106 | |
| 107 | pub const APFloatBaseSemantics = extern enum { | |
| 108 | IEEEhalf, | |
| 109 | BFloat, | |
| 110 | IEEEsingle, | |
| 111 | IEEEdouble, | |
| 112 | x86DoubleExtended, | |
| 113 | IEEEquad, | |
| 114 | PPCDoubleDouble, | |
| 115 | }; | |
| 116 | ||
| 107 | 117 | pub const APInt = opaque { |
| 108 | 118 | pub const getLimitedValue = ZigClangAPInt_getLimitedValue; |
| 109 | 119 | extern fn ZigClangAPInt_getLimitedValue(*const APInt, limit: u64) u64; |
| ... | ... | @@ -455,6 +465,12 @@ pub const FileID = opaque {}; |
| 455 | 465 | pub const FloatingLiteral = opaque { |
| 456 | 466 | pub const getValueAsApproximateDouble = ZigClangFloatingLiteral_getValueAsApproximateDouble; |
| 457 | 467 | extern fn ZigClangFloatingLiteral_getValueAsApproximateDouble(*const FloatingLiteral) f64; |
| 468 | ||
| 469 | pub const getBeginLoc = ZigClangIntegerLiteral_getBeginLoc; | |
| 470 | extern fn ZigClangIntegerLiteral_getBeginLoc(*const FloatingLiteral) SourceLocation; | |
| 471 | ||
| 472 | pub const getRawSemantics = ZigClangFloatingLiteral_getRawSemantics; | |
| 473 | extern fn ZigClangFloatingLiteral_getRawSemantics(*const FloatingLiteral) APFloatBaseSemantics; | |
| 458 | 474 | }; |
| 459 | 475 | |
| 460 | 476 | pub const ForStmt = opaque { |
src/translate_c.zig+15-2| ... | ... | @@ -3547,9 +3547,22 @@ fn transCPtrCast( |
| 3547 | 3547 | } |
| 3548 | 3548 | } |
| 3549 | 3549 | |
| 3550 | fn transFloatingLiteral(c: *Context, scope: *Scope, stmt: *const clang.FloatingLiteral, used: ResultUsed) TransError!Node { | |
| 3550 | fn transFloatingLiteral(c: *Context, scope: *Scope, expr: *const clang.FloatingLiteral, used: ResultUsed) TransError!Node { | |
| 3551 | switch (expr.getRawSemantics()) { | |
| 3552 | .IEEEhalf, // f16 | |
| 3553 | .IEEEsingle, // f32 | |
| 3554 | .IEEEdouble, // f64 | |
| 3555 | => {}, | |
| 3556 | else => |format| return fail( | |
| 3557 | c, | |
| 3558 | error.UnsupportedTranslation, | |
| 3559 | expr.getBeginLoc(), | |
| 3560 | "unsupported floating point constant format {}", | |
| 3561 | .{format}, | |
| 3562 | ), | |
| 3563 | } | |
| 3551 | 3564 | // TODO use something more accurate |
| 3552 | var dbl = stmt.getValueAsApproximateDouble(); | |
| 3565 | var dbl = expr.getValueAsApproximateDouble(); | |
| 3553 | 3566 | const is_negative = dbl < 0; |
| 3554 | 3567 | if (is_negative) dbl = -dbl; |
| 3555 | 3568 | const str = if (dbl == std.math.floor(dbl)) |
src/zig_clang.cpp+5| ... | ... | @@ -2528,6 +2528,11 @@ double ZigClangFloatingLiteral_getValueAsApproximateDouble(const ZigClangFloatin |
| 2528 | 2528 | return casted->getValueAsApproximateDouble(); |
| 2529 | 2529 | } |
| 2530 | 2530 | |
| 2531 | ZigClangAPFloatBase_Semantics ZigClangFloatingLiteral_getRawSemantics(const ZigClangFloatingLiteral *self) { | |
| 2532 | auto casted = reinterpret_cast<const clang::FloatingLiteral *>(self); | |
| 2533 | return static_cast<ZigClangAPFloatBase_Semantics>(casted->getRawSemantics()); | |
| 2534 | } | |
| 2535 | ||
| 2531 | 2536 | enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self) { |
| 2532 | 2537 | auto casted = reinterpret_cast<const clang::StringLiteral *>(self); |
| 2533 | 2538 | return (ZigClangStringLiteral_StringKind)casted->getKind(); |
src/zig_clang.h+11| ... | ... | @@ -881,6 +881,16 @@ enum ZigClangAPFloat_roundingMode { |
| 881 | 881 | ZigClangAPFloat_roundingMode_Invalid = -1, |
| 882 | 882 | }; |
| 883 | 883 | |
| 884 | enum ZigClangAPFloatBase_Semantics { | |
| 885 | ZigClangAPFloatBase_Semantics_IEEEhalf, | |
| 886 | ZigClangAPFloatBase_Semantics_BFloat, | |
| 887 | ZigClangAPFloatBase_Semantics_IEEEsingle, | |
| 888 | ZigClangAPFloatBase_Semantics_IEEEdouble, | |
| 889 | ZigClangAPFloatBase_Semantics_x87DoubleExtended, | |
| 890 | ZigClangAPFloatBase_Semantics_IEEEquad, | |
| 891 | ZigClangAPFloatBase_Semantics_PPCDoubleDouble, | |
| 892 | }; | |
| 893 | ||
| 884 | 894 | enum ZigClangStringLiteral_StringKind { |
| 885 | 895 | ZigClangStringLiteral_StringKind_Ascii, |
| 886 | 896 | ZigClangStringLiteral_StringKind_Wide, |
| ... | ... | @@ -1142,6 +1152,7 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangDeclStmt_getBeginLoc(const st |
| 1142 | 1152 | ZIG_EXTERN_C unsigned ZigClangAPFloat_convertToHexString(const struct ZigClangAPFloat *self, char *DST, |
| 1143 | 1153 | unsigned HexDigits, bool UpperCase, enum ZigClangAPFloat_roundingMode RM); |
| 1144 | 1154 | ZIG_EXTERN_C double ZigClangFloatingLiteral_getValueAsApproximateDouble(const ZigClangFloatingLiteral *self); |
| 1155 | ZIG_EXTERN_C ZigClangAPFloatBase_Semantics ZigClangFloatingLiteral_getRawSemantics(const ZigClangFloatingLiteral *self); | |
| 1145 | 1156 | |
| 1146 | 1157 | ZIG_EXTERN_C enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self); |
| 1147 | 1158 | ZIG_EXTERN_C uint32_t ZigClangStringLiteral_getCodeUnit(const struct ZigClangStringLiteral *self, size_t i); |
test/translate_c.zig-2| ... | ... | @@ -3028,7 +3028,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void { |
| 3028 | 3028 | \\void call() { |
| 3029 | 3029 | \\ fn_int(3.0f); |
| 3030 | 3030 | \\ fn_int(3.0); |
| 3031 | \\ fn_int(3.0L); | |
| 3032 | 3031 | \\ fn_int('ABCD'); |
| 3033 | 3032 | \\ fn_f32(3); |
| 3034 | 3033 | \\ fn_f64(3); |
| ... | ... | @@ -3053,7 +3052,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void { |
| 3053 | 3052 | \\pub export fn call() void { |
| 3054 | 3053 | \\ fn_int(@floatToInt(c_int, 3.0)); |
| 3055 | 3054 | \\ fn_int(@floatToInt(c_int, 3.0)); |
| 3056 | \\ fn_int(@floatToInt(c_int, 3.0)); | |
| 3057 | 3055 | \\ fn_int(@as(c_int, 1094861636)); |
| 3058 | 3056 | \\ fn_f32(@intToFloat(f32, @as(c_int, 3))); |
| 3059 | 3057 | \\ fn_f64(@intToFloat(f64, @as(c_int, 3))); |