Commit 277b9cf878

Andrew Kelley <superjoe30@gmail.com>
2018-05-12 04:41:44
fix comptime code modification of global const
closes #1008
1 parent 6e82107
Changed files (2)
src
test
cases
src/ir.cpp
@@ -8686,6 +8686,10 @@ static void copy_const_val(ConstExprValue *dest, ConstExprValue *src, bool same_
     *dest = *src;
     if (!same_global_refs) {
         dest->global_refs = global_refs;
+        if (dest->type->id == TypeTableEntryIdStruct) {
+            dest->data.x_struct.fields = allocate_nonzero<ConstExprValue>(dest->type->data.structure.src_field_count);
+            memcpy(dest->data.x_struct.fields, src->data.x_struct.fields, sizeof(ConstExprValue) * dest->type->data.structure.src_field_count);
+        }
     }
 }
 
@@ -11670,7 +11674,8 @@ static TypeTableEntry *ir_analyze_instruction_decl_var(IrAnalyze *ira, IrInstruc
         if (var->mem_slot_index != SIZE_MAX) {
             assert(var->mem_slot_index < ira->exec_context.mem_slot_count);
             ConstExprValue *mem_slot = &ira->exec_context.mem_slot_list[var->mem_slot_index];
-            *mem_slot = casted_init_value->value;
+            copy_const_val(mem_slot, &casted_init_value->value,
+                    !is_comptime_var || var->gen_is_const);
 
             if (is_comptime_var || (var_class_requires_const && var->gen_is_const)) {
                 ir_build_const_from(ira, &decl_var_instruction->base);
test/cases/eval.zig
@@ -536,3 +536,20 @@ test "runtime 128 bit integer division" {
     var c = a / b;
     assert(c == 15231399999);
 }
+
+pub const Info = struct {
+    version: u8,
+};
+
+pub const diamond_info = Info {
+    .version = 0,
+};
+
+test "comptime modification of const struct field" {
+    comptime {
+        var res = diamond_info;
+        res.version = 1;
+        assert(diamond_info.version == 0);
+        assert(res.version == 1);
+    }
+}