diff --git a/lib/std/c/tokenizer.zig b/lib/std/c/tokenizer.zig index 80fd604eb5..a7342ba7f9 100644 --- a/lib/std/c/tokenizer.zig +++ b/lib/std/c/tokenizer.zig @@ -1079,6 +1079,9 @@ pub const Tokenizer = struct { 'x', 'X' => { state = .IntegerLiteralHex; }, + '.' => { + state = .FloatFraction; + }, else => { state = .IntegerSuffix; self.index -= 1; @@ -1261,13 +1264,16 @@ pub const Tokenizer = struct { .UnicodeEscape, .MultiLineComment, .MultiLineCommentAsterisk, - .FloatFraction, - .FloatFractionHex, .FloatExponent, - .FloatExponentDigits, .MacroString, => result.id = .Invalid, + .FloatExponentDigits => result.id = if (counter == 0) .Invalid else .{ .FloatLiteral = .None }, + + .FloatFraction, + .FloatFractionHex, + => result.id = .{ .FloatLiteral = .None }, + .IntegerLiteralOct, .IntegerLiteralBinary, .IntegerLiteralHex, diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 221e4201ca..85ff72c9dc 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -5122,6 +5122,8 @@ fn parseCNumLit(c: *Context, tok: *CToken, source: []const u8, source_loc: ZigCl cast_node.rparen_token = try appendToken(c, .RParen, ")"); return &cast_node.base; } else if (tok.id == .FloatLiteral) { + if (lit_bytes[0] == '.') + lit_bytes = try std.fmt.allocPrint(c.a(), "0{}", .{lit_bytes}); if (tok.id.FloatLiteral == .None) { return transCreateNodeFloat(c, lit_bytes); } @@ -5493,7 +5495,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, // hack to get zig fmt to render a comma in builtin calls _ = try appendToken(c, .Comma, ","); - const ptr_kind = blk:{ + const ptr_kind = blk: { // * token _ = it.prev(); // last token of `node` diff --git a/test/translate_c.zig b/test/translate_c.zig index 6246742c5f..a2eb69100f 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -621,9 +621,13 @@ pub fn addCases(cases: *tests.TranslateCContext) void { cases.add("float suffixes", \\#define foo 3.14f \\#define bar 16.e-2l + \\#define FOO 0.12345 + \\#define BAR .12345 , &[_][]const u8{ "pub const foo = @as(f32, 3.14);", "pub const bar = @as(c_longdouble, 16.e-2);", + "pub const FOO = 0.12345;", + "pub const BAR = 0.12345;", }); cases.add("comments",