Skip to content

fn memoized with incorrect value from parent scope when value is from inline else of a switch #19586

@Jarred-Sumner

Description

@Jarred-Sumner

Zig Version

0.12.0-dev.1828+225fe6ddb

Steps to Reproduce and Observed Behavior

  1. Code
const std = @import("std");
const LogLevel = enum {
    verbose,
    default,
};

pub fn main() void {
    const argv = std.os.argv;
    const last = argv[argv.len - 1];

    std.debug.print("       Last arg: {s}\n", .{last});
    var log_level: LogLevel = .default;
    if (last[0] == '1') {
        log_level = .verbose;
    }

    switch (log_level) {
        inline else => |level| {
            std.debug.print(" before closure: {s}\n", .{@tagName(level)});
            const Closure = struct {
                pub fn run() void {
                    std.debug.print(" within closure: {s}\n", .{@tagName(level)});
                }
            };
            Closure.run();
        },
    }
}
  1. Run:
> zig run repro.zig -- 0
       Last arg: 0
 before closure: default
 within closure: default

> zig run repro.zig -- 1
       Last arg: 1
 before closure: verbose
 within closure: default

Expected Behavior

It should output the following:

> zig run repro.zig -- 0
       Last arg: 0
 before closure: default
 within closure: default

> zig run repro.zig -- 1
       Last arg: 1
 before closure: verbose
 within closure: verbose

It should not choose the last value from the inline else for each invocation. It also shouldn't be a compiler error since log_level is unambiguously comptime-known due to the inline else.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behavior

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions