authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-02-05 19:55:37-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-02-05 19:55:37-05:00
logd26bb3ae2e9add11ef350e5d7b040dfbe10539be
tree0a1fe05353903df166f87e9bfb3aaafc89d3ddbd
parent7749ffd797e927f93051060db49b76c595879697

fix assigning to const ptr through struct or index


2 files changed, 20 insertions(+), 14 deletions(-)

src/ast_render.cpp+7-5
......@@ -786,11 +786,13 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
786786 }
787787 case NodeTypeTryExpr:
788788 {
789 const char *var_str = node->data.try_expr.var_is_const ? "const" : "var";
790 const char *var_name = buf_ptr(node->data.try_expr.var_symbol);
791 const char *ptr_str = node->data.try_expr.var_is_ptr ? "*" : "";
792 fprintf(ar->f, "try (%s %s%s", var_str, ptr_str, var_name);
793 fprintf(ar->f, " = ");
789 fprintf(ar->f, "try (");
790 if (node->data.try_expr.var_symbol) {
791 const char *var_str = node->data.try_expr.var_is_const ? "const" : "var";
792 const char *var_name = buf_ptr(node->data.try_expr.var_symbol);
793 const char *ptr_str = node->data.try_expr.var_is_ptr ? "*" : "";
794 fprintf(ar->f, "%s %s%s = ", var_str, ptr_str, var_name);
795 }
794796 render_node_grouped(ar, node->data.try_expr.target_node);
795797 fprintf(ar->f, ") ");
796798 render_node_grouped(ar, node->data.try_expr.then_node);
src/ir.cpp+13-9
......@@ -8819,7 +8819,8 @@ static TypeTableEntry *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruc
88198819 ConstExprValue *array_ptr_val;
88208820 if (array_ptr->value.special != ConstValSpecialRuntime &&
88218821 (array_ptr_val = const_ptr_pointee(&array_ptr->value)) &&
8822 array_ptr_val->special != ConstValSpecialRuntime)
8822 array_ptr_val->special != ConstValSpecialRuntime &&
8823 (array_type->id != TypeTableEntryIdPointer || array_ptr_val->data.x_ptr.special != ConstPtrSpecialRuntime))
88238824 {
88248825 bool depends_on_compile_var = array_ptr_val->depends_on_compile_var ||
88258826 casted_elem_index->value.depends_on_compile_var;
......@@ -8926,14 +8927,17 @@ static TypeTableEntry *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field
89268927 if (!ptr_val)
89278928 return ira->codegen->builtin_types.entry_invalid;
89288929
8929 ConstExprValue *struct_val = const_ptr_pointee(ptr_val);
8930 if (value_is_comptime(struct_val)) {
8931 ConstExprValue *field_val = &struct_val->data.x_struct.fields[field->src_index];
8932 if (value_is_comptime(field_val)) {
8933 bool depends_on_compile_var = field_val->depends_on_compile_var ||
8934 struct_val->depends_on_compile_var || ptr_val->depends_on_compile_var;
8935 return ir_analyze_const_ptr(ira, &field_ptr_instruction->base, field_val,
8936 field_val->type, depends_on_compile_var, ConstPtrSpecialNone, is_const, is_volatile);
8930 if (ptr_val->data.x_ptr.special != ConstPtrSpecialRuntime) {
8931 ConstExprValue *struct_val = const_ptr_pointee(ptr_val);
8932 if (value_is_comptime(struct_val)) {
8933 ConstExprValue *field_val = &struct_val->data.x_struct.fields[field->src_index];
8934 if (value_is_comptime(field_val)) {
8935 bool depends_on_compile_var = field_val->depends_on_compile_var ||
8936 struct_val->depends_on_compile_var || ptr_val->depends_on_compile_var;
8937 return ir_analyze_const_ptr(ira, &field_ptr_instruction->base, field_val,
8938 field_val->type, depends_on_compile_var, ConstPtrSpecialNone,
8939 is_const, is_volatile);
8940 }
89378941 }
89388942 }
89398943 }