authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-24 19:55:13-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2021-04-24 19:55:13-04:00
log6951889f6ede655d58b95a48bf052260e6a21d06
tree35ce62ba8c50f52ae2d424a7765b29f8fddec24e
parent8530b6b7242ebf43b5cb4ae3a2644593f4961a5e
parentcf98dfbe22548728f247c314e3119c5a5dfceac5
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #8608 from LemonBoy/fix-8602

translate-c: Prevent mistranslation of fp literals

5 files changed, 47 insertions(+), 4 deletions(-)

src/clang.zig+16
...@@ -104,6 +104,16 @@ pub const APFloat = opaque {...@@ -104,6 +104,16 @@ pub const APFloat = opaque {
104 extern fn ZigClangAPFloat_toString(*const APFloat, precision: c_uint, maxPadding: c_uint, truncateZero: bool) [*:0]const u8;104 extern fn ZigClangAPFloat_toString(*const APFloat, precision: c_uint, maxPadding: c_uint, truncateZero: bool) [*:0]const u8;
105};105};
106106
107pub const APFloatBaseSemantics = extern enum {
108 IEEEhalf,
109 BFloat,
110 IEEEsingle,
111 IEEEdouble,
112 x86DoubleExtended,
113 IEEEquad,
114 PPCDoubleDouble,
115};
116
107pub const APInt = opaque {117pub const APInt = opaque {
108 pub const getLimitedValue = ZigClangAPInt_getLimitedValue;118 pub const getLimitedValue = ZigClangAPInt_getLimitedValue;
109 extern fn ZigClangAPInt_getLimitedValue(*const APInt, limit: u64) u64;119 extern fn ZigClangAPInt_getLimitedValue(*const APInt, limit: u64) u64;
...@@ -455,6 +465,12 @@ pub const FileID = opaque {};...@@ -455,6 +465,12 @@ pub const FileID = opaque {};
455pub const FloatingLiteral = opaque {465pub const FloatingLiteral = opaque {
456 pub const getValueAsApproximateDouble = ZigClangFloatingLiteral_getValueAsApproximateDouble;466 pub const getValueAsApproximateDouble = ZigClangFloatingLiteral_getValueAsApproximateDouble;
457 extern fn ZigClangFloatingLiteral_getValueAsApproximateDouble(*const FloatingLiteral) f64;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};
459475
460pub const ForStmt = opaque {476pub const ForStmt = opaque {
src/translate_c.zig+15-2
...@@ -3547,9 +3547,22 @@ fn transCPtrCast(...@@ -3547,9 +3547,22 @@ fn transCPtrCast(
3547 }3547 }
3548}3548}
35493549
3550fn transFloatingLiteral(c: *Context, scope: *Scope, stmt: *const clang.FloatingLiteral, used: ResultUsed) TransError!Node {3550fn 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 // TODO use something more accurate3564 // TODO use something more accurate
3552 var dbl = stmt.getValueAsApproximateDouble();3565 var dbl = expr.getValueAsApproximateDouble();
3553 const is_negative = dbl < 0;3566 const is_negative = dbl < 0;
3554 if (is_negative) dbl = -dbl;3567 if (is_negative) dbl = -dbl;
3555 const str = if (dbl == std.math.floor(dbl))3568 const str = if (dbl == std.math.floor(dbl))
src/zig_clang.cpp+5
...@@ -2528,6 +2528,11 @@ double ZigClangFloatingLiteral_getValueAsApproximateDouble(const ZigClangFloatin...@@ -2528,6 +2528,11 @@ double ZigClangFloatingLiteral_getValueAsApproximateDouble(const ZigClangFloatin
2528 return casted->getValueAsApproximateDouble();2528 return casted->getValueAsApproximateDouble();
2529}2529}
25302530
2531ZigClangAPFloatBase_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
2531enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self) {2536enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self) {
2532 auto casted = reinterpret_cast<const clang::StringLiteral *>(self);2537 auto casted = reinterpret_cast<const clang::StringLiteral *>(self);
2533 return (ZigClangStringLiteral_StringKind)casted->getKind();2538 return (ZigClangStringLiteral_StringKind)casted->getKind();
src/zig_clang.h+11
...@@ -881,6 +881,16 @@ enum ZigClangAPFloat_roundingMode {...@@ -881,6 +881,16 @@ enum ZigClangAPFloat_roundingMode {
881 ZigClangAPFloat_roundingMode_Invalid = -1,881 ZigClangAPFloat_roundingMode_Invalid = -1,
882};882};
883883
884enum 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
884enum ZigClangStringLiteral_StringKind {894enum ZigClangStringLiteral_StringKind {
885 ZigClangStringLiteral_StringKind_Ascii,895 ZigClangStringLiteral_StringKind_Ascii,
886 ZigClangStringLiteral_StringKind_Wide,896 ZigClangStringLiteral_StringKind_Wide,
...@@ -1142,6 +1152,7 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangDeclStmt_getBeginLoc(const st...@@ -1142,6 +1152,7 @@ ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangDeclStmt_getBeginLoc(const st
1142ZIG_EXTERN_C unsigned ZigClangAPFloat_convertToHexString(const struct ZigClangAPFloat *self, char *DST,1152ZIG_EXTERN_C unsigned ZigClangAPFloat_convertToHexString(const struct ZigClangAPFloat *self, char *DST,
1143 unsigned HexDigits, bool UpperCase, enum ZigClangAPFloat_roundingMode RM);1153 unsigned HexDigits, bool UpperCase, enum ZigClangAPFloat_roundingMode RM);
1144ZIG_EXTERN_C double ZigClangFloatingLiteral_getValueAsApproximateDouble(const ZigClangFloatingLiteral *self);1154ZIG_EXTERN_C double ZigClangFloatingLiteral_getValueAsApproximateDouble(const ZigClangFloatingLiteral *self);
1155ZIG_EXTERN_C ZigClangAPFloatBase_Semantics ZigClangFloatingLiteral_getRawSemantics(const ZigClangFloatingLiteral *self);
11451156
1146ZIG_EXTERN_C enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self);1157ZIG_EXTERN_C enum ZigClangStringLiteral_StringKind ZigClangStringLiteral_getKind(const struct ZigClangStringLiteral *self);
1147ZIG_EXTERN_C uint32_t ZigClangStringLiteral_getCodeUnit(const struct ZigClangStringLiteral *self, size_t i);1158ZIG_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,7 +3028,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
3028 \\void call() {3028 \\void call() {
3029 \\ fn_int(3.0f);3029 \\ fn_int(3.0f);
3030 \\ fn_int(3.0);3030 \\ fn_int(3.0);
3031 \\ fn_int(3.0L);
3032 \\ fn_int('ABCD');3031 \\ fn_int('ABCD');
3033 \\ fn_f32(3);3032 \\ fn_f32(3);
3034 \\ fn_f64(3);3033 \\ fn_f64(3);
...@@ -3053,7 +3052,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -3053,7 +3052,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
3053 \\pub export fn call() void {3052 \\pub export fn call() void {
3054 \\ fn_int(@floatToInt(c_int, 3.0));3053 \\ fn_int(@floatToInt(c_int, 3.0));
3055 \\ fn_int(@floatToInt(c_int, 3.0));3054 \\ fn_int(@floatToInt(c_int, 3.0));
3056 \\ fn_int(@floatToInt(c_int, 3.0));
3057 \\ fn_int(@as(c_int, 1094861636));3055 \\ fn_int(@as(c_int, 1094861636));
3058 \\ fn_f32(@intToFloat(f32, @as(c_int, 3)));3056 \\ fn_f32(@intToFloat(f32, @as(c_int, 3)));
3059 \\ fn_f64(@intToFloat(f64, @as(c_int, 3)));3057 \\ fn_f64(@intToFloat(f64, @as(c_int, 3)));