Commit b4e42042cf
Changed files (2)
src
src/ir.cpp
@@ -11314,6 +11314,8 @@ static TypeTableEntry *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field
if (ptr_val->data.x_ptr.special != ConstPtrSpecialHardCodedAddr) {
ConstExprValue *struct_val = const_ptr_pointee(ira->codegen, ptr_val);
+ if (type_is_invalid(struct_val->type))
+ return ira->codegen->builtin_types.entry_invalid;
ConstExprValue *field_val = &struct_val->data.x_struct.fields[field->src_index];
TypeTableEntry *ptr_type = get_pointer_to_type_extra(ira->codegen, field_val->type,
is_const, is_volatile, align_bytes,
@@ -11732,6 +11734,9 @@ static TypeTableEntry *ir_analyze_instruction_store_ptr(IrAnalyze *ira, IrInstru
}
ir_add_error(ira, &store_ptr_instruction->base,
buf_sprintf("cannot store runtime value in compile time variable"));
+ ConstExprValue *dest_val = const_ptr_pointee(ira->codegen, &ptr->value);
+ dest_val->type = ira->codegen->builtin_types.entry_invalid;
+
return ira->codegen->builtin_types.entry_invalid;
}
}
test/compile_errors.zig
@@ -2186,4 +2186,49 @@ pub fn addCases(cases: &tests.CompileErrorContext) {
,
".tmp_source.zig:3:5: error: alignstack set twice",
".tmp_source.zig:2:5: note: first set here");
+
+ cases.add("storing runtime value in compile time variable then using it",
+ \\const Mode = @import("builtin").Mode;
+ \\
+ \\fn Free(comptime filename: []const u8) -> TestCase {
+ \\ TestCase {
+ \\ .filename = filename,
+ \\ .problem_type = ProblemType.Free,
+ \\ }
+ \\}
+ \\
+ \\fn LibC(comptime filename: []const u8) -> TestCase {
+ \\ TestCase {
+ \\ .filename = filename,
+ \\ .problem_type = ProblemType.LinkLibC,
+ \\ }
+ \\}
+ \\
+ \\const TestCase = struct {
+ \\ filename: []const u8,
+ \\ problem_type: ProblemType,
+ \\};
+ \\
+ \\const ProblemType = enum {
+ \\ Free,
+ \\ LinkLibC,
+ \\};
+ \\
+ \\export fn entry() {
+ \\ const tests = []TestCase {
+ \\ Free("001"),
+ \\ Free("002"),
+ \\ LibC("078"),
+ \\ Free("116"),
+ \\ Free("117"),
+ \\ };
+ \\
+ \\ for ([]Mode { Mode.Debug, Mode.ReleaseSafe, Mode.ReleaseFast }) |mode| {
+ \\ inline for (tests) |test_case| {
+ \\ const foo = test_case.filename ++ ".zig";
+ \\ }
+ \\ }
+ \\}
+ ,
+ ".tmp_source.zig:37:16: error: cannot store runtime value in compile time variable");
}