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) {...@@ -786,11 +786,13 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
786 }786 }
787 case NodeTypeTryExpr:787 case NodeTypeTryExpr:
788 {788 {
789 const char *var_str = node->data.try_expr.var_is_const ? "const" : "var";789 fprintf(ar->f, "try (");
790 const char *var_name = buf_ptr(node->data.try_expr.var_symbol);790 if (node->data.try_expr.var_symbol) {
791 const char *ptr_str = node->data.try_expr.var_is_ptr ? "*" : "";791 const char *var_str = node->data.try_expr.var_is_const ? "const" : "var";
792 fprintf(ar->f, "try (%s %s%s", var_str, ptr_str, var_name);792 const char *var_name = buf_ptr(node->data.try_expr.var_symbol);
793 fprintf(ar->f, " = ");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 }
794 render_node_grouped(ar, node->data.try_expr.target_node);796 render_node_grouped(ar, node->data.try_expr.target_node);
795 fprintf(ar->f, ") ");797 fprintf(ar->f, ") ");
796 render_node_grouped(ar, node->data.try_expr.then_node);798 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...@@ -8819,7 +8819,8 @@ static TypeTableEntry *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruc
8819 ConstExprValue *array_ptr_val;8819 ConstExprValue *array_ptr_val;
8820 if (array_ptr->value.special != ConstValSpecialRuntime &&8820 if (array_ptr->value.special != ConstValSpecialRuntime &&
8821 (array_ptr_val = const_ptr_pointee(&array_ptr->value)) &&8821 (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))
8823 {8824 {
8824 bool depends_on_compile_var = array_ptr_val->depends_on_compile_var ||8825 bool depends_on_compile_var = array_ptr_val->depends_on_compile_var ||
8825 casted_elem_index->value.depends_on_compile_var;8826 casted_elem_index->value.depends_on_compile_var;
...@@ -8926,14 +8927,17 @@ static TypeTableEntry *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field...@@ -8926,14 +8927,17 @@ static TypeTableEntry *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field
8926 if (!ptr_val)8927 if (!ptr_val)
8927 return ira->codegen->builtin_types.entry_invalid;8928 return ira->codegen->builtin_types.entry_invalid;
89288929
8929 ConstExprValue *struct_val = const_ptr_pointee(ptr_val);8930 if (ptr_val->data.x_ptr.special != ConstPtrSpecialRuntime) {
8930 if (value_is_comptime(struct_val)) {8931 ConstExprValue *struct_val = const_ptr_pointee(ptr_val);
8931 ConstExprValue *field_val = &struct_val->data.x_struct.fields[field->src_index];8932 if (value_is_comptime(struct_val)) {
8932 if (value_is_comptime(field_val)) {8933 ConstExprValue *field_val = &struct_val->data.x_struct.fields[field->src_index];
8933 bool depends_on_compile_var = field_val->depends_on_compile_var ||8934 if (value_is_comptime(field_val)) {
8934 struct_val->depends_on_compile_var || ptr_val->depends_on_compile_var;8935 bool depends_on_compile_var = field_val->depends_on_compile_var ||
8935 return ir_analyze_const_ptr(ira, &field_ptr_instruction->base, field_val,8936 struct_val->depends_on_compile_var || ptr_val->depends_on_compile_var;
8936 field_val->type, depends_on_compile_var, ConstPtrSpecialNone, is_const, is_volatile);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 }
8937 }8941 }
8938 }8942 }
8939 }8943 }