Commit 706e0d739e
Changed files (1)
std
zig
std/zig/parser.zig
@@ -1119,12 +1119,6 @@ pub const Parser = struct {
},
State.TypeExprBegin => |dest_ptr| {
- const token = self.getNextToken();
- if (token.id == Token.Id.Keyword_var) {
- @panic("TODO param with type var");
- }
- self.putBackToken(token);
-
stack.append(State { .TypeExprEnd = dest_ptr }) catch unreachable;
try stack.append(State { .PrefixOpExpression = dest_ptr });
continue;
@@ -1160,9 +1154,6 @@ pub const Parser = struct {
try stack.append(State { .AddrOfModifiers = &node.op.AddrOf });
}
continue;
- //Token.Id.Keyword_await => {
- // @panic("TODO: await");
- //},
} else {
self.putBackToken(token);
stack.append(State { .SuffixOpExpressionBegin = dest_ptr }) catch unreachable;
@@ -1408,7 +1399,6 @@ pub const Parser = struct {
continue;
},
Token.Id.LBracket => {
- // TODO: option("align" "(" Expression option(":" Integer ":" Integer) ")")) option("const") option("volatile")
const rbracket_token = self.getNextToken();
if (rbracket_token.id == Token.Id.RBracket) {
const node = try self.createPrefixOp(arena, token, ast.NodePrefixOp.PrefixOp{
@@ -4222,760 +4212,765 @@ fn testCanonical(source: []const u8) !void {
}
}
-//test "zig fmt: get stdout or fail" {
-// try testCanonical(
-// \\const std = @import("std");
-// \\
-// \\pub fn main() !void {
-// \\ // If this program is run without stdout attached, exit with an error.
-// \\ // another comment
-// \\ var stdout_file = try std.io.getStdOut;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: preserve spacing" {
-// try testCanonical(
-// \\const std = @import("std");
-// \\
-// \\pub fn main() !void {
-// \\ var stdout_file = try std.io.getStdOut;
-// \\ var stdout_file = try std.io.getStdOut;
-// \\
-// \\ var stdout_file = try std.io.getStdOut;
-// \\ var stdout_file = try std.io.getStdOut;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: return types" {
-// try testCanonical(
-// \\pub fn main() !void {}
-// \\pub fn main() var {}
-// \\pub fn main() i32 {}
-// \\
-// );
-//}
-//
-//test "zig fmt: imports" {
-// try testCanonical(
-// \\const std = @import("std");
-// \\const std = @import();
-// \\
-// );
-//}
-//
-//test "zig fmt: global declarations" {
-// try testCanonical(
-// \\const a = b;
-// \\pub const a = b;
-// \\var a = b;
-// \\pub var a = b;
-// \\const a: i32 = b;
-// \\pub const a: i32 = b;
-// \\var a: i32 = b;
-// \\pub var a: i32 = b;
-// \\extern const a: i32 = b;
-// \\pub extern const a: i32 = b;
-// \\extern var a: i32 = b;
-// \\pub extern var a: i32 = b;
-// \\extern "a" const a: i32 = b;
-// \\pub extern "a" const a: i32 = b;
-// \\extern "a" var a: i32 = b;
-// \\pub extern "a" var a: i32 = b;
-// \\
-// );
-//}
-//
-//test "zig fmt: extern declaration" {
-// try testCanonical(
-// \\extern var foo: c_int;
-// \\
-// );
-//}
-//
-//test "zig fmt: alignment" {
-// try testCanonical(
-// \\var foo: c_int align(1);
-// \\
-// );
-//}
-//
-//test "zig fmt: C main" {
-// try testCanonical(
-// \\fn main(argc: c_int, argv: &&u8) c_int {
-// \\ const a = b;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: return" {
-// try testCanonical(
-// \\fn foo(argc: c_int, argv: &&u8) c_int {
-// \\ return 0;
-// \\}
-// \\
-// \\fn bar() void {
-// \\ return;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: pointer attributes" {
-// try testCanonical(
-// \\extern fn f1(s: &align(&u8) u8) c_int;
-// \\extern fn f2(s: &&align(1) &const &volatile u8) c_int;
-// \\extern fn f3(s: &align(1) const &align(1) volatile &const volatile u8) c_int;
-// \\extern fn f4(s: &align(1) const volatile u8) c_int;
-// \\
-// );
-//}
-//
-//test "zig fmt: slice attributes" {
-// try testCanonical(
-// \\extern fn f1(s: &align(&u8) u8) c_int;
-// \\extern fn f2(s: &&align(1) &const &volatile u8) c_int;
-// \\extern fn f3(s: &align(1) const &align(1) volatile &const volatile u8) c_int;
-// \\extern fn f4(s: &align(1) const volatile u8) c_int;
-// \\
-// );
-//}
-//
-//test "zig fmt: test declaration" {
-// try testCanonical(
-// \\test "test name" {
-// \\ const a = 1;
-// \\ var b = 1;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: infix operators" {
-// try testCanonical(
-// \\test "infix operators" {
-// \\ var i = undefined;
-// \\ i = 2;
-// \\ i *= 2;
-// \\ i |= 2;
-// \\ i ^= 2;
-// \\ i <<= 2;
-// \\ i >>= 2;
-// \\ i &= 2;
-// \\ i *= 2;
-// \\ i *%= 2;
-// \\ i -= 2;
-// \\ i -%= 2;
-// \\ i += 2;
-// \\ i +%= 2;
-// \\ i /= 2;
-// \\ i %= 2;
-// \\ _ = i == i;
-// \\ _ = i != i;
-// \\ _ = i != i;
-// \\ _ = i.i;
-// \\ _ = i || i;
-// \\ _ = i!i;
-// \\ _ = i ** i;
-// \\ _ = i ++ i;
-// \\ _ = i ?? i;
-// \\ _ = i % i;
-// \\ _ = i / i;
-// \\ _ = i *% i;
-// \\ _ = i * i;
-// \\ _ = i -% i;
-// \\ _ = i - i;
-// \\ _ = i +% i;
-// \\ _ = i + i;
-// \\ _ = i << i;
-// \\ _ = i >> i;
-// \\ _ = i & i;
-// \\ _ = i ^ i;
-// \\ _ = i | i;
-// \\ _ = i >= i;
-// \\ _ = i <= i;
-// \\ _ = i > i;
-// \\ _ = i < i;
-// \\ _ = i and i;
-// \\ _ = i or i;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: precedence" {
-// try testCanonical(
-// \\test "precedence" {
-// \\ a!b();
-// \\ (a!b)();
-// \\ !a!b;
-// \\ !(a!b);
-// \\ !a{ };
-// \\ !(a{ });
-// \\ a + b{ };
-// \\ (a + b){ };
-// \\ a << b + c;
-// \\ (a << b) + c;
-// \\ a & b << c;
-// \\ (a & b) << c;
-// \\ a ^ b & c;
-// \\ (a ^ b) & c;
-// \\ a | b ^ c;
-// \\ (a | b) ^ c;
-// \\ a == b | c;
-// \\ (a == b) | c;
-// \\ a and b == c;
-// \\ (a and b) == c;
-// \\ a or b and c;
-// \\ (a or b) and c;
-// \\ (a or b) and c;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: prefix operators" {
-// try testCanonical(
-// \\test "prefix operators" {
-// \\ try return --%~??!*&0;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: call expression" {
-// try testCanonical(
-// \\test "test calls" {
-// \\ a();
-// \\ a(1);
-// \\ a(1, 2);
-// \\ a(1, 2) + a(1, 2);
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: var args" {
-// try testCanonical(
-// \\fn print(args: ...) void {}
-// \\
-// );
-//}
-//
-//test "zig fmt: extern function" {
-// try testCanonical(
-// \\extern fn puts(s: &const u8) c_int;
-// \\extern "c" fn puts(s: &const u8) c_int;
-// \\
-// );
-//}
-//
-//test "zig fmt: multiline string" {
-// try testCanonical(
-// \\const s =
-// \\ \\ something
-// \\ \\ something else
-// \\ ;
-// \\
-// );
-//}
-//
-//test "zig fmt: values" {
-// try testCanonical(
-// \\test "values" {
-// \\ 1;
-// \\ 1.0;
-// \\ "string";
-// \\ c"cstring";
-// \\ 'c';
-// \\ true;
-// \\ false;
-// \\ null;
-// \\ undefined;
-// \\ error;
-// \\ this;
-// \\ unreachable;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: indexing" {
-// try testCanonical(
-// \\test "test index" {
-// \\ a[0];
-// \\ a[0 + 5];
-// \\ a[0..];
-// \\ a[0..5];
-// \\ a[a[0]];
-// \\ a[a[0..]];
-// \\ a[a[0..5]];
-// \\ a[a[0]..];
-// \\ a[a[0..5]..];
-// \\ a[a[0]..a[0]];
-// \\ a[a[0..5]..a[0]];
-// \\ a[a[0..5]..a[0..5]];
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: struct declaration" {
-// try testCanonical(
-// \\const S = struct {
-// \\ const Self = this;
-// \\ f1: u8,
-// \\
-// \\ fn method(self: &Self) Self {
-// \\ return *self;
-// \\ }
-// \\
-// \\ f2: u8
-// \\};
-// \\
-// \\const Ps = packed struct {
-// \\ a: u8,
-// \\ b: u8,
-// \\
-// \\ c: u8
-// \\};
-// \\
-// \\const Es = extern struct {
-// \\ a: u8,
-// \\ b: u8,
-// \\
-// \\ c: u8
-// \\};
-// \\
-// );
-//}
-//
-//test "zig fmt: enum declaration" {
-// try testCanonical(
-// \\const E = enum {
-// \\ Ok,
-// \\ SomethingElse = 0
-// \\};
-// \\
-// \\const E2 = enum(u8) {
-// \\ Ok,
-// \\ SomethingElse = 255,
-// \\ SomethingThird
-// \\};
-// \\
-// \\const Ee = extern enum {
-// \\ Ok,
-// \\ SomethingElse,
-// \\ SomethingThird
-// \\};
-// \\
-// \\const Ep = packed enum {
-// \\ Ok,
-// \\ SomethingElse,
-// \\ SomethingThird
-// \\};
-// \\
-// );
-//}
-//
-//test "zig fmt: union declaration" {
-// try testCanonical(
-// \\const U = union {
-// \\ Int: u8,
-// \\ Float: f32,
-// \\ None,
-// \\ Bool: bool
-// \\};
-// \\
-// \\const Ue = union(enum) {
-// \\ Int: u8,
-// \\ Float: f32,
-// \\ None,
-// \\ Bool: bool
-// \\};
-// \\
-// \\const E = enum {
-// \\ Int,
-// \\ Float,
-// \\ None,
-// \\ Bool
-// \\};
-// \\
-// \\const Ue2 = union(E) {
-// \\ Int: u8,
-// \\ Float: f32,
-// \\ None,
-// \\ Bool: bool
-// \\};
-// \\
-// \\const Eu = extern union {
-// \\ Int: u8,
-// \\ Float: f32,
-// \\ None,
-// \\ Bool: bool
-// \\};
-// \\
-// );
-//}
-//
-//test "zig fmt: error set declaration" {
-// try testCanonical(
-// \\const E = error {
-// \\ A,
-// \\ B,
-// \\
-// \\ C
-// \\};
-// \\
-// );
-//}
-//
-//test "zig fmt: arrays" {
-// try testCanonical(
-// \\test "test array" {
-// \\ const a: [2]u8 = [2]u8{ 1, 2 };
-// \\ const a: [2]u8 = []u8{ 1, 2 };
-// \\ const a: [0]u8 = []u8{ };
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: container initializers" {
-// try testCanonical(
-// \\const a1 = []u8{ };
-// \\const a2 = []u8{ 1, 2, 3, 4 };
-// \\const s1 = S{ };
-// \\const s2 = S{ .a = 1, .b = 2 };
-// \\
-// );
-//}
-//
-//test "zig fmt: catch" {
-// try testCanonical(
-// \\test "catch" {
-// \\ const a: error!u8 = 0;
-// \\ _ = a catch return;
-// \\ _ = a catch |err| return;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: blocks" {
-// try testCanonical(
-// \\test "blocks" {
-// \\ {
-// \\ const a = 0;
-// \\ const b = 0;
-// \\ }
-// \\
-// \\ blk: {
-// \\ const a = 0;
-// \\ const b = 0;
-// \\ }
-// \\
-// \\ const r = blk: {
-// \\ const a = 0;
-// \\ const b = 0;
-// \\ };
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: switch" {
-// try testCanonical(
-// \\test "switch" {
-// \\ switch (0) {
-// \\ 0 => {},
-// \\ 1 => unreachable,
-// \\ 2, 3 => {},
-// \\ 4 ... 7 => {},
-// \\ 1 + 4 * 3 + 22 => {},
-// \\ else => {
-// \\ const a = 1;
-// \\ const b = a;
-// \\ }
-// \\ }
-// \\
-// \\ const res = switch (0) {
-// \\ 0 => 0,
-// \\ 1 => 2,
-// \\ else => 4
-// \\ };
-// \\
-// \\ const Union = union(enum) {
-// \\ Int: i64,
-// \\ Float: f64
-// \\ };
-// \\
-// \\ const u = Union{ .Int = 0 };
-// \\ switch (u) {
-// \\ Union.Int => |int| {},
-// \\ Union.Float => |*float| unreachable
-// \\ }
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: while" {
-// try testCanonical(
-// \\test "while" {
-// \\ while (10 < 1) {
-// \\ unreachable;
-// \\ }
-// \\
-// \\ while (10 < 1)
-// \\ unreachable;
-// \\
-// \\ var i: usize = 0;
-// \\ while (i < 10) : (i += 1) {
-// \\ continue;
-// \\ }
-// \\
-// \\ i = 0;
-// \\ while (i < 10) : (i += 1)
-// \\ continue;
-// \\
-// \\ i = 0;
-// \\ var j: usize = 0;
-// \\ while (i < 10) : ({
-// \\ i += 1;
-// \\ j += 1;
-// \\ }) {
-// \\ continue;
-// \\ }
-// \\
-// \\ var a: ?u8 = 2;
-// \\ while (a) |v| : (a = null) {
-// \\ continue;
-// \\ }
-// \\
-// \\ while (a) |v| : (a = null)
-// \\ unreachable;
-// \\
-// \\ label: while (10 < 0) {
-// \\ unreachable;
-// \\ }
-// \\
-// \\ const res = while (0 < 10) {
-// \\ break 7;
-// \\ } else {
-// \\ unreachable;
-// \\ };
-// \\
-// \\ var a: error!u8 = 0;
-// \\ while (a) |v| {
-// \\ a = error.Err;
-// \\ } else |err| {
-// \\ i = 1;
-// \\ }
-// \\
-// \\ comptime var k: usize = 0;
-// \\ inline while (i < 10) : (i += 1)
-// \\ j += 2;
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: for" {
-// try testCanonical(
-// \\test "for" {
-// \\ const a = []u8{ 1, 2, 3 };
-// \\ for (a) |v| {
-// \\ continue;
-// \\ }
-// \\
-// \\ for (a) |v|
-// \\ continue;
-// \\
-// \\ for (a) |*v|
-// \\ continue;
-// \\
-// \\ for (a) |v, i| {
-// \\ continue;
-// \\ }
-// \\
-// \\ for (a) |v, i|
-// \\ continue;
-// \\
-// \\ const res = for (a) |v, i| {
-// \\ break v;
-// \\ } else {
-// \\ unreachable;
-// \\ };
-// \\
-// \\ var num: usize = 0;
-// \\ inline for (a) |v, i| {
-// \\ num += v;
-// \\ num += i;
-// \\ }
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: if" {
-// try testCanonical(
-// \\test "if" {
-// \\ if (10 < 0) {
-// \\ unreachable;
-// \\ }
-// \\
-// \\ if (10 < 0) unreachable;
-// \\
-// \\ if (10 < 0) {
-// \\ unreachable;
-// \\ } else {
-// \\ const a = 20;
-// \\ }
-// \\
-// \\ if (10 < 0) {
-// \\ unreachable;
-// \\ } else if (5 < 0) {
-// \\ unreachable;
-// \\ } else {
-// \\ const a = 20;
-// \\ }
-// \\
-// \\ const is_world_broken = if (10 < 0) true else false;
-// \\
-// \\ const a: ?u8 = 10;
-// \\ const b: ?u8 = null;
-// \\ if (a) |v| {
-// \\ const some = v;
-// \\ } else if (b) |*v| {
-// \\ unreachable;
-// \\ } else {
-// \\ const some = 10;
-// \\ }
-// \\
-// \\ const non_null_a = if (a) |v| v else 0;
-// \\
-// \\ const a_err: error!u8 = 0;
-// \\ if (a_err) |v| {
-// \\ const p = v;
-// \\ } else |err| {
-// \\ unreachable;
-// \\ }
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: defer" {
-// try testCanonical(
-// \\test "defer" {
-// \\ var i: usize = 0;
-// \\ defer i = 1;
-// \\ defer {
-// \\ i += 2;
-// \\ i *= i;
-// \\ }
-// \\
-// \\ errdefer i += 3;
-// \\ errdefer {
-// \\ i += 2;
-// \\ i /= i;
-// \\ }
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: comptime" {
-// try testCanonical(
-// \\fn a() u8 {
-// \\ return 5;
-// \\}
-// \\
-// \\fn b(comptime i: u8) u8 {
-// \\ return i;
-// \\}
-// \\
-// \\const av = comptime a();
-// \\const av2 = comptime blk: {
-// \\ var res = a();
-// \\ res *= b(2);
-// \\ break :blk res;
-// \\};
-// \\
-// \\comptime {
-// \\ _ = a();
-// \\}
-// \\
-// \\test "comptime" {
-// \\ const av3 = comptime a();
-// \\ const av4 = comptime blk: {
-// \\ var res = a();
-// \\ res *= a();
-// \\ break :blk res;
-// \\ };
-// \\
-// \\ comptime var i = 0;
-// \\ comptime {
-// \\ i = a();
-// \\ i += b(i);
-// \\ }
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: fn type" {
-// try testCanonical(
-// \\fn a(i: u8) u8 {
-// \\ return i + 1;
-// \\}
-// \\
-// \\const a: fn(u8) u8 = undefined;
-// \\const b: extern fn(u8) u8 = undefined;
-// \\const c: nakedcc fn(u8) u8 = undefined;
-// \\const ap: fn(u8) u8 = a;
-// \\
-// );
-//}
-//
-//test "zig fmt: inline asm" {
-// try testCanonical(
-// \\pub fn syscall1(number: usize, arg1: usize) usize {
-// \\ return asm volatile ("syscall"
-// \\ : [ret] "={rax}" (-> usize)
-// \\ : [number] "{rax}" (number),
-// \\ [arg1] "{rdi}" (arg1)
-// \\ : "rcx", "r11");
-// \\}
-// \\
-// );
-//}
-//
-//test "zig fmt: coroutines" {
-// try testCanonical(
-// \\async fn simpleAsyncFn() void {
-// \\ x += 1;
-// \\ suspend;
-// \\ x += 1;
-// \\ suspend |p| {}
-// \\ const p = async simpleAsyncFn() catch unreachable;
-// \\ await p;
-// \\}
-// \\
-// \\test "coroutine suspend, resume, cancel" {
-// \\ const p = try async<std.debug.global_allocator> testAsyncSeq();
-// \\ resume p;
-// \\ cancel p;
-// \\}
-// \\
-// );
-//}
+test "zig fmt: get stdout or fail" {
+ try testCanonical(
+ \\const std = @import("std");
+ \\
+ \\pub fn main() !void {
+ \\ // If this program is run without stdout attached, exit with an error.
+ \\ // another comment
+ \\ var stdout_file = try std.io.getStdOut;
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: preserve spacing" {
+ try testCanonical(
+ \\const std = @import("std");
+ \\
+ \\pub fn main() !void {
+ \\ var stdout_file = try std.io.getStdOut;
+ \\ var stdout_file = try std.io.getStdOut;
+ \\
+ \\ var stdout_file = try std.io.getStdOut;
+ \\ var stdout_file = try std.io.getStdOut;
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: return types" {
+ try testCanonical(
+ \\pub fn main() !void {}
+ \\pub fn main() var {}
+ \\pub fn main() i32 {}
+ \\
+ );
+}
+
+test "zig fmt: imports" {
+ try testCanonical(
+ \\const std = @import("std");
+ \\const std = @import();
+ \\
+ );
+}
+
+test "zig fmt: global declarations" {
+ try testCanonical(
+ \\const a = b;
+ \\pub const a = b;
+ \\var a = b;
+ \\pub var a = b;
+ \\const a: i32 = b;
+ \\pub const a: i32 = b;
+ \\var a: i32 = b;
+ \\pub var a: i32 = b;
+ \\extern const a: i32 = b;
+ \\pub extern const a: i32 = b;
+ \\extern var a: i32 = b;
+ \\pub extern var a: i32 = b;
+ \\extern "a" const a: i32 = b;
+ \\pub extern "a" const a: i32 = b;
+ \\extern "a" var a: i32 = b;
+ \\pub extern "a" var a: i32 = b;
+ \\
+ );
+}
+
+test "zig fmt: extern declaration" {
+ try testCanonical(
+ \\extern var foo: c_int;
+ \\
+ );
+}
+
+test "zig fmt: alignment" {
+ try testCanonical(
+ \\var foo: c_int align(1);
+ \\
+ );
+}
+
+test "zig fmt: C main" {
+ try testCanonical(
+ \\fn main(argc: c_int, argv: &&u8) c_int {
+ \\ const a = b;
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: return" {
+ try testCanonical(
+ \\fn foo(argc: c_int, argv: &&u8) c_int {
+ \\ return 0;
+ \\}
+ \\
+ \\fn bar() void {
+ \\ return;
+ \\}
+ \\
+ );
+}
-test "1" {
- try testCanonical(@embedFile("../array_list.zig"));
+test "zig fmt: pointer attributes" {
+ try testCanonical(
+ \\extern fn f1(s: &align(&u8) u8) c_int;
+ \\extern fn f2(s: &&align(1) &const &volatile u8) c_int;
+ \\extern fn f3(s: &align(1) const &align(1) volatile &const volatile u8) c_int;
+ \\extern fn f4(s: &align(1) const volatile u8) c_int;
+ \\
+ );
}
+
+test "zig fmt: slice attributes" {
+ try testCanonical(
+ \\extern fn f1(s: &align(&u8) u8) c_int;
+ \\extern fn f2(s: &&align(1) &const &volatile u8) c_int;
+ \\extern fn f3(s: &align(1) const &align(1) volatile &const volatile u8) c_int;
+ \\extern fn f4(s: &align(1) const volatile u8) c_int;
+ \\
+ );
+}
+
+test "zig fmt: test declaration" {
+ try testCanonical(
+ \\test "test name" {
+ \\ const a = 1;
+ \\ var b = 1;
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: infix operators" {
+ try testCanonical(
+ \\test "infix operators" {
+ \\ var i = undefined;
+ \\ i = 2;
+ \\ i *= 2;
+ \\ i |= 2;
+ \\ i ^= 2;
+ \\ i <<= 2;
+ \\ i >>= 2;
+ \\ i &= 2;
+ \\ i *= 2;
+ \\ i *%= 2;
+ \\ i -= 2;
+ \\ i -%= 2;
+ \\ i += 2;
+ \\ i +%= 2;
+ \\ i /= 2;
+ \\ i %= 2;
+ \\ _ = i == i;
+ \\ _ = i != i;
+ \\ _ = i != i;
+ \\ _ = i.i;
+ \\ _ = i || i;
+ \\ _ = i!i;
+ \\ _ = i ** i;
+ \\ _ = i ++ i;
+ \\ _ = i ?? i;
+ \\ _ = i % i;
+ \\ _ = i / i;
+ \\ _ = i *% i;
+ \\ _ = i * i;
+ \\ _ = i -% i;
+ \\ _ = i - i;
+ \\ _ = i +% i;
+ \\ _ = i + i;
+ \\ _ = i << i;
+ \\ _ = i >> i;
+ \\ _ = i & i;
+ \\ _ = i ^ i;
+ \\ _ = i | i;
+ \\ _ = i >= i;
+ \\ _ = i <= i;
+ \\ _ = i > i;
+ \\ _ = i < i;
+ \\ _ = i and i;
+ \\ _ = i or i;
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: precedence" {
+ try testCanonical(
+ \\test "precedence" {
+ \\ a!b();
+ \\ (a!b)();
+ \\ !a!b;
+ \\ !(a!b);
+ \\ !a{ };
+ \\ !(a{ });
+ \\ a + b{ };
+ \\ (a + b){ };
+ \\ a << b + c;
+ \\ (a << b) + c;
+ \\ a & b << c;
+ \\ (a & b) << c;
+ \\ a ^ b & c;
+ \\ (a ^ b) & c;
+ \\ a | b ^ c;
+ \\ (a | b) ^ c;
+ \\ a == b | c;
+ \\ (a == b) | c;
+ \\ a and b == c;
+ \\ (a and b) == c;
+ \\ a or b and c;
+ \\ (a or b) and c;
+ \\ (a or b) and c;
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: prefix operators" {
+ try testCanonical(
+ \\test "prefix operators" {
+ \\ try return --%~??!*&0;
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: call expression" {
+ try testCanonical(
+ \\test "test calls" {
+ \\ a();
+ \\ a(1);
+ \\ a(1, 2);
+ \\ a(1, 2) + a(1, 2);
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: var args" {
+ try testCanonical(
+ \\fn print(args: ...) void {}
+ \\
+ );
+}
+
+test "zig fmt: extern function" {
+ try testCanonical(
+ \\extern fn puts(s: &const u8) c_int;
+ \\extern "c" fn puts(s: &const u8) c_int;
+ \\
+ );
+}
+
+test "zig fmt: multiline string" {
+ try testCanonical(
+ \\const s =
+ \\ \\ something
+ \\ \\ something else
+ \\ ;
+ \\
+ );
+}
+
+test "zig fmt: values" {
+ try testCanonical(
+ \\test "values" {
+ \\ 1;
+ \\ 1.0;
+ \\ "string";
+ \\ c"cstring";
+ \\ 'c';
+ \\ true;
+ \\ false;
+ \\ null;
+ \\ undefined;
+ \\ error;
+ \\ this;
+ \\ unreachable;
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: indexing" {
+ try testCanonical(
+ \\test "test index" {
+ \\ a[0];
+ \\ a[0 + 5];
+ \\ a[0..];
+ \\ a[0..5];
+ \\ a[a[0]];
+ \\ a[a[0..]];
+ \\ a[a[0..5]];
+ \\ a[a[0]..];
+ \\ a[a[0..5]..];
+ \\ a[a[0]..a[0]];
+ \\ a[a[0..5]..a[0]];
+ \\ a[a[0..5]..a[0..5]];
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: struct declaration" {
+ try testCanonical(
+ \\const S = struct {
+ \\ const Self = this;
+ \\ f1: u8,
+ \\
+ \\ fn method(self: &Self) Self {
+ \\ return *self;
+ \\ }
+ \\
+ \\ f2: u8
+ \\};
+ \\
+ \\const Ps = packed struct {
+ \\ a: u8,
+ \\ b: u8,
+ \\
+ \\ c: u8
+ \\};
+ \\
+ \\const Es = extern struct {
+ \\ a: u8,
+ \\ b: u8,
+ \\
+ \\ c: u8
+ \\};
+ \\
+ );
+}
+
+test "zig fmt: enum declaration" {
+ try testCanonical(
+ \\const E = enum {
+ \\ Ok,
+ \\ SomethingElse = 0
+ \\};
+ \\
+ \\const E2 = enum(u8) {
+ \\ Ok,
+ \\ SomethingElse = 255,
+ \\ SomethingThird
+ \\};
+ \\
+ \\const Ee = extern enum {
+ \\ Ok,
+ \\ SomethingElse,
+ \\ SomethingThird
+ \\};
+ \\
+ \\const Ep = packed enum {
+ \\ Ok,
+ \\ SomethingElse,
+ \\ SomethingThird
+ \\};
+ \\
+ );
+}
+
+test "zig fmt: union declaration" {
+ try testCanonical(
+ \\const U = union {
+ \\ Int: u8,
+ \\ Float: f32,
+ \\ None,
+ \\ Bool: bool
+ \\};
+ \\
+ \\const Ue = union(enum) {
+ \\ Int: u8,
+ \\ Float: f32,
+ \\ None,
+ \\ Bool: bool
+ \\};
+ \\
+ \\const E = enum {
+ \\ Int,
+ \\ Float,
+ \\ None,
+ \\ Bool
+ \\};
+ \\
+ \\const Ue2 = union(E) {
+ \\ Int: u8,
+ \\ Float: f32,
+ \\ None,
+ \\ Bool: bool
+ \\};
+ \\
+ \\const Eu = extern union {
+ \\ Int: u8,
+ \\ Float: f32,
+ \\ None,
+ \\ Bool: bool
+ \\};
+ \\
+ );
+}
+
+test "zig fmt: error set declaration" {
+ try testCanonical(
+ \\const E = error {
+ \\ A,
+ \\ B,
+ \\
+ \\ C
+ \\};
+ \\
+ );
+}
+
+test "zig fmt: arrays" {
+ try testCanonical(
+ \\test "test array" {
+ \\ const a: [2]u8 = [2]u8{ 1, 2 };
+ \\ const a: [2]u8 = []u8{ 1, 2 };
+ \\ const a: [0]u8 = []u8{ };
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: container initializers" {
+ try testCanonical(
+ \\const a1 = []u8{ };
+ \\const a2 = []u8{ 1, 2, 3, 4 };
+ \\const s1 = S{ };
+ \\const s2 = S{ .a = 1, .b = 2 };
+ \\
+ );
+}
+
+test "zig fmt: catch" {
+ try testCanonical(
+ \\test "catch" {
+ \\ const a: error!u8 = 0;
+ \\ _ = a catch return;
+ \\ _ = a catch |err| return;
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: blocks" {
+ try testCanonical(
+ \\test "blocks" {
+ \\ {
+ \\ const a = 0;
+ \\ const b = 0;
+ \\ }
+ \\
+ \\ blk: {
+ \\ const a = 0;
+ \\ const b = 0;
+ \\ }
+ \\
+ \\ const r = blk: {
+ \\ const a = 0;
+ \\ const b = 0;
+ \\ };
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: switch" {
+ try testCanonical(
+ \\test "switch" {
+ \\ switch (0) {
+ \\ 0 => {},
+ \\ 1 => unreachable,
+ \\ 2, 3 => {},
+ \\ 4 ... 7 => {},
+ \\ 1 + 4 * 3 + 22 => {},
+ \\ else => {
+ \\ const a = 1;
+ \\ const b = a;
+ \\ }
+ \\ }
+ \\
+ \\ const res = switch (0) {
+ \\ 0 => 0,
+ \\ 1 => 2,
+ \\ else => 4
+ \\ };
+ \\
+ \\ const Union = union(enum) {
+ \\ Int: i64,
+ \\ Float: f64
+ \\ };
+ \\
+ \\ const u = Union{ .Int = 0 };
+ \\ switch (u) {
+ \\ Union.Int => |int| {},
+ \\ Union.Float => |*float| unreachable
+ \\ }
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: while" {
+ try testCanonical(
+ \\test "while" {
+ \\ while (10 < 1) {
+ \\ unreachable;
+ \\ }
+ \\
+ \\ while (10 < 1)
+ \\ unreachable;
+ \\
+ \\ var i: usize = 0;
+ \\ while (i < 10) : (i += 1) {
+ \\ continue;
+ \\ }
+ \\
+ \\ i = 0;
+ \\ while (i < 10) : (i += 1)
+ \\ continue;
+ \\
+ \\ i = 0;
+ \\ var j: usize = 0;
+ \\ while (i < 10) : ({
+ \\ i += 1;
+ \\ j += 1;
+ \\ }) {
+ \\ continue;
+ \\ }
+ \\
+ \\ var a: ?u8 = 2;
+ \\ while (a) |v| : (a = null) {
+ \\ continue;
+ \\ }
+ \\
+ \\ while (a) |v| : (a = null)
+ \\ unreachable;
+ \\
+ \\ label: while (10 < 0) {
+ \\ unreachable;
+ \\ }
+ \\
+ \\ const res = while (0 < 10) {
+ \\ break 7;
+ \\ } else {
+ \\ unreachable;
+ \\ };
+ \\
+ \\ var a: error!u8 = 0;
+ \\ while (a) |v| {
+ \\ a = error.Err;
+ \\ } else |err| {
+ \\ i = 1;
+ \\ }
+ \\
+ \\ comptime var k: usize = 0;
+ \\ inline while (i < 10) : (i += 1)
+ \\ j += 2;
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: for" {
+ try testCanonical(
+ \\test "for" {
+ \\ const a = []u8{ 1, 2, 3 };
+ \\ for (a) |v| {
+ \\ continue;
+ \\ }
+ \\
+ \\ for (a) |v|
+ \\ continue;
+ \\
+ \\ for (a) |*v|
+ \\ continue;
+ \\
+ \\ for (a) |v, i| {
+ \\ continue;
+ \\ }
+ \\
+ \\ for (a) |v, i|
+ \\ continue;
+ \\
+ \\ const res = for (a) |v, i| {
+ \\ break v;
+ \\ } else {
+ \\ unreachable;
+ \\ };
+ \\
+ \\ var num: usize = 0;
+ \\ inline for (a) |v, i| {
+ \\ num += v;
+ \\ num += i;
+ \\ }
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: if" {
+ try testCanonical(
+ \\test "if" {
+ \\ if (10 < 0) {
+ \\ unreachable;
+ \\ }
+ \\
+ \\ if (10 < 0) unreachable;
+ \\
+ \\ if (10 < 0) {
+ \\ unreachable;
+ \\ } else {
+ \\ const a = 20;
+ \\ }
+ \\
+ \\ if (10 < 0) {
+ \\ unreachable;
+ \\ } else if (5 < 0) {
+ \\ unreachable;
+ \\ } else {
+ \\ const a = 20;
+ \\ }
+ \\
+ \\ const is_world_broken = if (10 < 0) true else false;
+ \\
+ \\ const a: ?u8 = 10;
+ \\ const b: ?u8 = null;
+ \\ if (a) |v| {
+ \\ const some = v;
+ \\ } else if (b) |*v| {
+ \\ unreachable;
+ \\ } else {
+ \\ const some = 10;
+ \\ }
+ \\
+ \\ const non_null_a = if (a) |v| v else 0;
+ \\
+ \\ const a_err: error!u8 = 0;
+ \\ if (a_err) |v| {
+ \\ const p = v;
+ \\ } else |err| {
+ \\ unreachable;
+ \\ }
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: defer" {
+ try testCanonical(
+ \\test "defer" {
+ \\ var i: usize = 0;
+ \\ defer i = 1;
+ \\ defer {
+ \\ i += 2;
+ \\ i *= i;
+ \\ }
+ \\
+ \\ errdefer i += 3;
+ \\ errdefer {
+ \\ i += 2;
+ \\ i /= i;
+ \\ }
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: comptime" {
+ try testCanonical(
+ \\fn a() u8 {
+ \\ return 5;
+ \\}
+ \\
+ \\fn b(comptime i: u8) u8 {
+ \\ return i;
+ \\}
+ \\
+ \\const av = comptime a();
+ \\const av2 = comptime blk: {
+ \\ var res = a();
+ \\ res *= b(2);
+ \\ break :blk res;
+ \\};
+ \\
+ \\comptime {
+ \\ _ = a();
+ \\}
+ \\
+ \\test "comptime" {
+ \\ const av3 = comptime a();
+ \\ const av4 = comptime blk: {
+ \\ var res = a();
+ \\ res *= a();
+ \\ break :blk res;
+ \\ };
+ \\
+ \\ comptime var i = 0;
+ \\ comptime {
+ \\ i = a();
+ \\ i += b(i);
+ \\ }
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: fn type" {
+ try testCanonical(
+ \\fn a(i: u8) u8 {
+ \\ return i + 1;
+ \\}
+ \\
+ \\const a: fn(u8) u8 = undefined;
+ \\const b: extern fn(u8) u8 = undefined;
+ \\const c: nakedcc fn(u8) u8 = undefined;
+ \\const ap: fn(u8) u8 = a;
+ \\
+ );
+}
+
+test "zig fmt: inline asm" {
+ try testCanonical(
+ \\pub fn syscall1(number: usize, arg1: usize) usize {
+ \\ return asm volatile ("syscall"
+ \\ : [ret] "={rax}" (-> usize)
+ \\ : [number] "{rax}" (number),
+ \\ [arg1] "{rdi}" (arg1)
+ \\ : "rcx", "r11");
+ \\}
+ \\
+ );
+}
+
+test "zig fmt: coroutines" {
+ try testCanonical(
+ \\async fn simpleAsyncFn() void {
+ \\ x += 1;
+ \\ suspend;
+ \\ x += 1;
+ \\ suspend |p| {}
+ \\ const p = async simpleAsyncFn() catch unreachable;
+ \\ await p;
+ \\}
+ \\
+ \\test "coroutine suspend, resume, cancel" {
+ \\ const p = try async<std.debug.global_allocator> testAsyncSeq();
+ \\ resume p;
+ \\ cancel p;
+ \\}
+ \\
+ );
+}
+
+//{
+// var it = self.link_libs.iterator();
+// while (true) {
+// const entry = it.next() ?? break;
+// zig_args.append("--library") catch unreachable;
+// zig_args.append(entry.key) catch unreachable;
+// }
+//}