From ffac200e66a493907270a02404bcd4ee1898eb3a Mon Sep 17 00:00:00 2001 From: Justus Klausecker Date: Sat, 9 May 2026 12:19:13 +0200 Subject: [PATCH] AstGen: move check for primitive integer type with leading zero Identifiers like `u0_` should be legal but were previously rejected because they were spuriously interpreted as primitive integer type identifiers. Now the integer is first parsed and only if that succeeds it's checked for a leading zero. --- lib/std/zig/AstGen.zig | 16 ++++++++-------- test/behavior/basic.zig | 11 +++++++++++ .../primitive_integer_type_with_leading_zero.zig | 7 +++++++ 3 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 test/cases/compile_errors/primitive_integer_type_with_leading_zero.zig diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index 06621ea29e1ca672a904ebf7e47546f3a4d823a4..b9de0ee6ee2eead54e661e927e3d726033156a29 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -8069,14 +8069,6 @@ fn identifier( if (std.mem.eql(u8, ident_name_raw, "i0")) { return astgen.failNode(ident, "signed integer cannot have bit width 0", .{}); } - if (ident_name_raw[1] == '0') { - assert(ident_name_raw.len >= 3); // `u0` and `i0` handled - return astgen.failNode( - ident, - "primitive integer type '{s}' has leading zero", - .{ident_name_raw}, - ); - } const bit_count = parseBitCount(ident_name_raw[1..]) catch |err| switch (err) { error.Overflow => return astgen.failNode( ident, @@ -8085,6 +8077,14 @@ fn identifier( ), error.InvalidCharacter => break :int_type, }; + if (ident_name_raw[1] == '0') { + assert(ident_name_raw.len >= 3); // `u0` and `i0` handled + return astgen.failNode( + ident, + "primitive integer type '{s}' has leading zero", + .{ident_name_raw}, + ); + } const result = try gz.add(.{ .tag = .int_type, .data = .{ .int_type = .{ diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig index 2c5e6ab9a9c65ca28d72d60b32c0f100e9a4824b..33df2caa3a65b32605426cf085353ad65a0801f5 100644 --- a/test/behavior/basic.zig +++ b/test/behavior/basic.zig @@ -1437,3 +1437,14 @@ test "loading array from struct is not optimized away" { var s = S{}; try s.doTheTest(); } + +test "local variable name begins with primitive integer type" { + const u032_ = 123; + comptime assert(u032_ == 123); + + const u0_ = 456; + comptime assert(u0_ == 456); + + const i0_ = 789; + comptime assert(i0_ == 789); +} diff --git a/test/cases/compile_errors/primitive_integer_type_with_leading_zero.zig b/test/cases/compile_errors/primitive_integer_type_with_leading_zero.zig new file mode 100644 index 0000000000000000000000000000000000000000..8492f3444b316338d2d1ad31472e92a589b673d7 --- /dev/null +++ b/test/cases/compile_errors/primitive_integer_type_with_leading_zero.zig @@ -0,0 +1,7 @@ +export fn entry1() void { + _ = u032; +} + +// error +// +// :2:9: error: primitive integer type 'u032' has leading zero -- 2.54.0