#target=x86_64-linux-selfhosted
//#target=x86_64-windows-selfhosted
#target=x86_64-linux-cbe
#target=x86_64-windows-cbe
#target=x86_64-linux-llvm
//#target=wasm32-wasi-selfhosted
#update=initial version
#file=main.zig
const S = @This();
x: u8,
pub fn main(init: std.process.Init) !void {
    var stdout_writer = std.Io.File.stdout().writerStreaming(init.io, &.{});
    printFieldCount(&stdout_writer.interface) catch |err| switch (err) {
        error.WriteFailed => return stdout_writer.err.?,
    };
    printOneField(&stdout_writer.interface) catch |err| switch (err) {
        error.WriteFailed => return stdout_writer.err.?,
    };
}
fn printFieldCount(w: *Writer) Writer.Error!void {
    try w.print("{d} ", .{@typeInfo(S).@"struct".fields.len});
}
fn printOneField(w: *Writer) Writer.Error!void {
    const val: S = .{ .x = 100 };
    try w.print("{d}\n", .{val.x});
}
const std = @import("std");
const Writer = std.Io.Writer;
#expect_stdout="1 100\n"

#update=add a field
#file=main.zig
const S = @This();
x: u8,
y: u16 = 200,
pub fn main(init: std.process.Init) !void {
    var stdout_writer = std.Io.File.stdout().writerStreaming(init.io, &.{});
    printFieldCount(&stdout_writer.interface) catch |err| switch (err) {
        error.WriteFailed => return stdout_writer.err.?,
    };
    printOneField(&stdout_writer.interface) catch |err| switch (err) {
        error.WriteFailed => return stdout_writer.err.?,
    };
}
fn printFieldCount(w: *Writer) Writer.Error!void {
    try w.print("{d} ", .{@typeInfo(S).@"struct".fields.len});
}
fn printOneField(w: *Writer) Writer.Error!void {
    const val: S = .{ .x = 100 };
    try w.print("{d}\n", .{val.x});
}
const std = @import("std");
const Writer = std.Io.Writer;
#expect_stdout="2 100\n"

#update=remove all fields
#file=main.zig
const S = @This();
pub fn main(init: std.process.Init) !void {
    var stdout_writer = std.Io.File.stdout().writerStreaming(init.io, &.{});
    printFieldCount(&stdout_writer.interface) catch |err| switch (err) {
        error.WriteFailed => return stdout_writer.err.?,
    };
    printOneField(&stdout_writer.interface) catch |err| switch (err) {
        error.WriteFailed => return stdout_writer.err.?,
    };
}
fn printFieldCount(w: *Writer) Writer.Error!void {
    try w.print("{d} ", .{@typeInfo(S).@"struct".fields.len});
}
fn printOneField(w: *Writer) Writer.Error!void {
    const val: S = .{ .x = 100 };
    try w.print("{d}\n", .{val.x});
}
const std = @import("std");
const Writer = std.Io.Writer;
#expect_error=main.zig:15:24: error: no field named 'x' in struct 'main'
#expect_error=main.zig:1:1: note: struct declared here

#update=remove reference to non-existent field
#file=main.zig
const S = @This();
pub fn main(init: std.process.Init) !void {
    var stdout_writer = std.Io.File.stdout().writerStreaming(init.io, &.{});
    printFieldCount(&stdout_writer.interface) catch |err| switch (err) {
        error.WriteFailed => return stdout_writer.err.?,
    };
    printOneField(&stdout_writer.interface) catch |err| switch (err) {
        error.WriteFailed => return stdout_writer.err.?,
    };
}
fn printFieldCount(w: *Writer) Writer.Error!void {
    try w.print("{d} ", .{@typeInfo(S).@"struct".fields.len});
}
fn printOneField(w: *Writer) Writer.Error!void {
    //const val: S = .{ .x = 100 };
    //try w.print("{d}\n", .{val.x});
    try w.writeAll("<no fields>\n");
}
const std = @import("std");
const Writer = std.Io.Writer;
#expect_stdout="0 <no fields>\n"
