ziglang / zig

General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software.
https://ziglang.org
MIT License
33.78k stars 2.47k forks source link

@fieldParentPtr can cause unnecessary "struct depends on itself" error #7679

Open daurnimator opened 3 years ago

daurnimator commented 3 years ago
./uring-nonblock-fifo-async.zig:143:16: error: struct 'Client' depends on itself
const Client = struct {
               ^
./uring-nonblock-fifo-async.zig:347:22: note: referenced here
            sqe.fd = @fieldParentPtr(Client, "writer", self).fd;
                     ^
./uring-nonblock-fifo-async.zig:329:35: note: while checking if 'Writer.write' is async
                    try self.flush(ring);
                                  ^
./uring-nonblock-fifo-async.zig:248:41: note: when analyzing type '@Frame(Reader.run)' here
                        try Writer.write(client, ring, HTTP_RESPONSE);
                                        ^
./uring-nonblock-fifo-async.zig:195:19: note: while checking if 'Client.run' is async
        Reader.run(self, ring) catch |err| switch (err) {
                  ^
./uring-nonblock-fifo-async.zig:151:5: note: while checking this field
    frame: @Frame(run),
    ^
./uring-nonblock-fifo-async.zig:172:19: note: referenced here
        self.* = .{
                  ^
./uring-nonblock-fifo-async.zig:118:57: note: referenced here
            const client = Client.init(self, client_fd) catch |err| {
                                                        ^
./uring-nonblock-fifo-async.zig:15:17: note: referenced here
        try ring.poll();
                ^
./uring-nonblock-fifo-async.zig:67:26: note: referenced here
        while (self.queue.popFirst()) |node| {
                         ^
./uring-nonblock-fifo-async.zig:72:27: note: referenced here
        _ = try self.inner.submit_and_wait(1);
                          ^
/home/daurnimator/src/zig/lib/std/os/linux/io_uring.zig:166:29: note: referenced here
        var submitted = self.flush_sq();
                            ^
/home/daurnimator/src/zig/lib/std/os/linux/io_uring.zig:168:17: note: referenced here
        if (self.sq_ring_needs_enter(submitted, &flags) or wait_nr > 0) {
                ^
/home/daurnimator/src/zig/lib/std/os/linux/io_uring.zig:169:51: note: referenced here
            if (wait_nr > 0 or (self.flags & linux.IORING_SETUP_IOPOLL) != 0) {
                                                  ^
/home/daurnimator/src/zig/lib/std/os/linux/io_uring.zig:170:31: note: referenced here
                flags |= linux.IORING_ENTER_GETEVENTS;
                              ^
/home/daurnimator/src/zig/lib/std/os/linux/io_uring.zig:172:28: note: referenced here
            return try self.enter(submitted, wait_nr, flags);
                           ^
/home/daurnimator/src/zig/lib/std/os/linux/io_uring.zig:181:26: note: referenced here
        const res = linux.io_uring_enter(self.fd, to_submit, min_complete, flags, null);
                         ^
/home/daurnimator/src/zig/lib/std/os/linux/io_uring.zig:191:18: note: referenced here
            linux.EBADFD => return error.FileDescriptorInBadState,
                 ^
/home/daurnimator/src/zig/lib/std/os/linux/io_uring.zig:194:18: note: referenced here
            linux.EBUSY => return error.CompletionQueueOvercommitted,
                 ^
/home/daurnimator/src/zig/lib/std/os/linux/io_uring.zig:201:18: note: referenced here
            linux.ENXIO => return error.RingShuttingDown,
                 ^
/home/daurnimator/src/zig/lib/std/os/linux/io_uring.zig:204:18: note: referenced here
            linux.EOPNOTSUPP => return error.OpcodeNotSupported,
                 ^
./uring-nonblock-fifo-async.zig:73:13: note: referenced here
        self.flushCompletions();
            ^
/home/daurnimator/src/zig/lib/std/start.zig:346:20: note: referenced here
                std.log.err("{s}", .{@errorName(err)});
                   ^
/home/daurnimator/src/zig/lib/std/log.zig:237:21: note: referenced here
pub const default = scoped(.default);
                    ^
/home/daurnimator/src/zig/lib/std/log.zig:257:17: note: referenced here
pub const err = default.err;
                ^
/home/daurnimator/src/zig/lib/std/log.zig:257:24: note: referenced here
pub const err = default.err;
                       ^
/home/daurnimator/src/zig/lib/std/start.zig:346:24: note: referenced here
                std.log.err("{s}", .{@errorName(err)});
                       ^

Found while working on https://gist.github.com/daurnimator/699320cda828303671a21d15bb4a3753#file-uring-nonblock-fifo-async-zig

RetroDev256 commented 1 week ago

As far as I can tell, This issue cannot be reproduced without async, so while we can have the same error in stage1, stage2 cannot have a test for it.