diff --git a/src/Sema.zig b/src/Sema.zig index e397a6659a09b203ea22282284b7bad0de38472b..7060128e6db24562e5ae03e4122184edc425d9df 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -2274,15 +2274,20 @@ pub fn resolveFinalDeclValue( src: LazySrcLoc, air_ref: Air.Inst.Ref, ) CompileError!Value { + const zcu = sema.pt.zcu; + const val = try sema.resolveValueAllowVariables(air_ref) orelse { return sema.failWithNeededComptime(block, src, .{ .needed_comptime_reason = "global variable initializer must be comptime-known", }); }; if (val.isGenericPoison()) return error.GenericPoison; - if (val.canMutateComptimeVarState(sema.pt.zcu)) { + + const init_val: Value = if (val.getVariable(zcu)) |v| .fromInterned(v.init) else val; + if (init_val.canMutateComptimeVarState(zcu)) { return sema.fail(block, src, "global variable contains reference to comptime var", .{}); } + return val; } diff --git a/test/cases/compile_errors/comptime_var_referenced_by_decl.zig b/test/cases/compile_errors/comptime_var_referenced_by_decl.zig index a5dce623edbd1d01b757aaad6e3d37deffdad4f0..e11af45df3156394540fd3398c08564deb9c846b 100644 --- a/test/cases/compile_errors/comptime_var_referenced_by_decl.zig +++ b/test/cases/compile_errors/comptime_var_referenced_by_decl.zig @@ -38,6 +38,12 @@ export const g: *const *const u32 = g: { break :g &aggregate[0]; }; +// Mutable globals should have the same restrictions as const globals. +export var h: *[1]u32 = h: { + var x: [1]u32 = .{123}; + break :h &x; +}; + // error // // :1:27: error: global variable contains reference to comptime var @@ -47,3 +53,4 @@ export const g: *const *const u32 = g: { // :22:24: error: global variable contains reference to comptime var // :28:33: error: global variable contains reference to comptime var // :34:40: error: global variable contains reference to comptime var +// :42:28: error: global variable contains reference to comptime var