zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit ffac200e66a493907270a02404bcd4ee1898eb3a (tree)
parent 5537704f6061c7ea9f7bfb6302a380b04978e2ad
Author: Justus Klausecker <justus@klausecker.de>
Date:   Sat,  9 May 2026 12:19:13 +0200

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.

Diffstat:
Mlib/std/zig/AstGen.zig | 16++++++++--------
Mtest/behavior/basic.zig | 11+++++++++++
Atest/cases/compile_errors/primitive_integer_type_with_leading_zero.zig | 7+++++++
3 files changed, 26 insertions(+), 8 deletions(-)

diff --git 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 @@ -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 @@ -0,0 +1,7 @@ +export fn entry1() void { + _ = u032; +} + +// error +// +// :2:9: error: primitive integer type 'u032' has leading zero