| author | |
| committer | |
| log | 7c3896e6cd20a51e63a018fd2e05ea3c552b7401 |
| tree | 00900f2c69d30bec5965610d19966a1e17214980 |
| parent | 4ec6d174adc038741f1274d157f5253752eb8d51 |
When trying to retrieve 80bit fp values from clang using
getValueAsApproximateDouble we'd eventually hit the ceiling value and
return infinity, an invalid value for a fp literal.
Add some logic to prevent this error and warn the user.
Closes #86024 files changed, 47 insertions(+), 2 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); |