Commit 1b81e406f0

Jimmi Holst Christensen <jhc@liab.dk>
2018-04-10 13:43:20
std.zig: fixed compiler errors
1 parent 34af38e
Changed files (2)
std/zig/ast.zig
@@ -297,7 +297,7 @@ pub const NodeErrorSetDecl = struct {
     pub fn iterate(self: &NodeErrorSetDecl, index: usize) ?&Node {
         var i = index;
 
-        if (i < self.decls.len) return self.decls.at(i);
+        if (i < self.decls.len) return &self.decls.at(i).base;
         i -= self.decls.len;
 
         return null;
@@ -550,14 +550,6 @@ pub const NodeFnProto = struct {
             i -= 1;
         }
 
-        switch (self.call_convetion) {
-            CallConvetion.Async => |attr| {
-                if (i < 1) return &attr.base;
-                i -= 1;
-            },
-            else => {},
-        }
-
         return null;
     }
 
@@ -814,7 +806,7 @@ pub const NodeSwitch = struct {
         if (i < 1) return self.expr;
         i -= 1;
 
-        if (i < self.cases.len) return self.cases.at(i);
+        if (i < self.cases.len) return &self.cases.at(i).base;
         i -= self.cases.len;
 
         return null;
@@ -842,7 +834,7 @@ pub const NodeSwitchCase = struct {
         i -= self.items.len;
 
         if (self.payload) |payload| {
-            if (i < 1) return payload;
+            if (i < 1) return &payload.base;
             i -= 1;
         }
 
@@ -1093,6 +1085,13 @@ pub const NodeInfixOp = struct {
         i -= 1;
 
         switch (self.op) {
+            InfixOp.Catch => |maybe_payload| {
+                if (maybe_payload) |payload| {
+                    if (i < 1) return &payload.base;
+                    i -= 1;
+                }
+            },
+
             InfixOp.Add,
             InfixOp.AddWrap,
             InfixOp.ArrayCat,
@@ -1208,9 +1207,9 @@ pub const NodePrefixOp = struct {
             PrefixOp.BoolNot,
             PrefixOp.Cancel,
             PrefixOp.Deref,
+            PrefixOp.MaybeType,
             PrefixOp.Negation,
             PrefixOp.NegationWrap,
-            PrefixOp.Return,
             PrefixOp.Try,
             PrefixOp.Resume,
             PrefixOp.UnwrapMaybe => {},
std/zig/parser.zig
@@ -1421,7 +1421,7 @@ pub const Parser = struct {
                                     }
                                 });
                                 dest_ptr.store(&node.base);
-                                stack.append(State { .Expression = DestPtr { .Field = &node.rhs } }) catch unreachable;
+                                stack.append(State { .TypeExprBegin = DestPtr { .Field = &node.rhs } }) catch unreachable;
                                 try stack.append(State { .AddrOfModifiers = &node.op.SliceType });
                                 continue;
                             }
@@ -1432,7 +1432,7 @@ pub const Parser = struct {
                                 .ArrayType = undefined,
                             });
                             dest_ptr.store(&node.base);
-                            stack.append(State { .Expression = DestPtr { .Field = &node.rhs } }) catch unreachable;
+                            stack.append(State { .TypeExprBegin = DestPtr { .Field = &node.rhs } }) catch unreachable;
                             try stack.append(State { .ExpectToken = Token.Id.RBracket });
                             try stack.append(State { .Expression = DestPtr { .Field = &node.op.ArrayType } });
 
@@ -4222,756 +4222,760 @@ 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 "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 "1" {
+    try testCanonical(@embedFile("../array_list.zig"));
 }