Skip to content

Commit

Permalink
translate-c: Fix macro define of float constant using scientific nota…
Browse files Browse the repository at this point in the history
…tion

Fixes compiler attempting to use null value when translating macro define of float constant using scientific notation with no decimal point
  • Loading branch information
riverbl authored and andrewrk committed Jan 12, 2022
1 parent a5ac138 commit c4681b4
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 10 deletions.
22 changes: 12 additions & 10 deletions src/translate_c.zig
Original file line number Diff line number Diff line change
Expand Up @@ -5602,16 +5602,18 @@ fn parseCNumLit(c: *Context, m: *MacroCtx) ParseError!Node {
},
.FloatLiteral => |suffix| {
if (suffix != .none) lit_bytes = lit_bytes[0 .. lit_bytes.len - 1];
const dot_index = mem.indexOfScalar(u8, lit_bytes, '.').?;
if (dot_index == 0) {
lit_bytes = try std.fmt.allocPrint(c.arena, "0{s}", .{lit_bytes});
} else if (dot_index + 1 == lit_bytes.len or !std.ascii.isDigit(lit_bytes[dot_index + 1])) {
// If the literal lacks a digit after the `.`, we need to
// add one since `1.` or `1.e10` would be invalid syntax in Zig.
lit_bytes = try std.fmt.allocPrint(c.arena, "{s}0{s}", .{
lit_bytes[0 .. dot_index + 1],
lit_bytes[dot_index + 1 ..],
});

if (mem.indexOfScalar(u8, lit_bytes, '.')) |dot_index| {
if (dot_index == 0) {
lit_bytes = try std.fmt.allocPrint(c.arena, "0{s}", .{lit_bytes});
} else if (dot_index + 1 == lit_bytes.len or !std.ascii.isDigit(lit_bytes[dot_index + 1])) {
// If the literal lacks a digit after the `.`, we need to
// add one since `1.` or `1.e10` would be invalid syntax in Zig.
lit_bytes = try std.fmt.allocPrint(c.arena, "{s}0{s}", .{
lit_bytes[0 .. dot_index + 1],
lit_bytes[dot_index + 1 ..],
});
}
}

if (suffix == .none)
Expand Down
4 changes: 4 additions & 0 deletions test/translate_c.zig
Original file line number Diff line number Diff line change
Expand Up @@ -1135,11 +1135,15 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\#define bar 16.e-2l
\\#define FOO 0.12345
\\#define BAR .12345
\\#define baz 1e1
\\#define BAZ 42e-3f
, &[_][]const u8{
"pub const foo = @as(f32, 3.14);",
"pub const bar = @as(c_longdouble, 16.0e-2);",
"pub const FOO = 0.12345;",
"pub const BAR = 0.12345;",
"pub const baz = 1e1;",
"pub const BAZ = @as(f32, 42e-3);",
});

cases.add("comments",
Expand Down

0 comments on commit c4681b4

Please sign in to comment.