authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-13 12:28:07-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-13 12:28:07-07:00
log83a59c4d077ead78a8c0ccecf8d4f7970309bf76
tree956c3b56719601a2c2d437515641166929154960
parent3f9632bb404584db872ed8e2318f770cde8b16ee

fix evaluating generic functions in wrong context


3 files changed, 13 insertions(+), 6 deletions(-)

src/analyze.cpp+1-1
...@@ -4564,7 +4564,7 @@ static TypeTableEntry *analyze_generic_fn_call(CodeGen *g, ImportTableEntry *imp...@@ -4564,7 +4564,7 @@ static TypeTableEntry *analyze_generic_fn_call(CodeGen *g, ImportTableEntry *imp
4564 generic_fn_type_id->generic_param_count = actual_param_count;4564 generic_fn_type_id->generic_param_count = actual_param_count;
4565 generic_fn_type_id->generic_params = allocate<GenericParamValue>(actual_param_count);4565 generic_fn_type_id->generic_params = allocate<GenericParamValue>(actual_param_count);
45664566
4567 BlockContext *child_context = import->block_context;4567 BlockContext *child_context = decl_node->owner->block_context;
4568 for (int i = 0; i < actual_param_count; i += 1) {4568 for (int i = 0; i < actual_param_count; i += 1) {
4569 AstNode *generic_param_decl_node = decl_node->data.fn_proto.generic_params.at(i);4569 AstNode *generic_param_decl_node = decl_node->data.fn_proto.generic_params.at(i);
4570 assert(generic_param_decl_node->type == NodeTypeParamDecl);4570 assert(generic_param_decl_node->type == NodeTypeParamDecl);
src/codegen.cpp+1
...@@ -3033,6 +3033,7 @@ static void gen_const_globals(CodeGen *g) {...@@ -3033,6 +3033,7 @@ static void gen_const_globals(CodeGen *g) {
3033 } else {3033 } else {
3034 expr->const_llvm_val = gen_const_val(g, type_entry, const_val);3034 expr->const_llvm_val = gen_const_val(g, type_entry, const_val);
3035 }3035 }
3036 assert(expr->const_llvm_val);
3036 }3037 }
3037}3038}
30383039
src/parser.cpp+11-5
...@@ -3036,15 +3036,21 @@ AstNode *ast_clone_subtree(AstNode *old_node, uint32_t *next_node_index) {...@@ -3036,15 +3036,21 @@ AstNode *ast_clone_subtree(AstNode *old_node, uint32_t *next_node_index) {
3036 // none3036 // none
3037 break;3037 break;
3038 case NodeTypePrefixOpExpr:3038 case NodeTypePrefixOpExpr:
3039 clone_subtree_field(&new_node->data.prefix_op_expr.primary_expr, old_node->data.prefix_op_expr.primary_expr, next_node_index);3039 clone_subtree_field(&new_node->data.prefix_op_expr.primary_expr,
3040 old_node->data.prefix_op_expr.primary_expr, next_node_index);
3040 break;3041 break;
3041 case NodeTypeFnCallExpr:3042 case NodeTypeFnCallExpr:
3042 clone_subtree_field(&new_node->data.fn_call_expr.fn_ref_expr, old_node->data.fn_call_expr.fn_ref_expr, next_node_index);3043 assert(!old_node->data.fn_call_expr.resolved_expr.has_global_const);
3043 clone_subtree_list(&new_node->data.fn_call_expr.params, &old_node->data.fn_call_expr.params, next_node_index);3044 clone_subtree_field(&new_node->data.fn_call_expr.fn_ref_expr,
3045 old_node->data.fn_call_expr.fn_ref_expr, next_node_index);
3046 clone_subtree_list(&new_node->data.fn_call_expr.params,
3047 &old_node->data.fn_call_expr.params, next_node_index);
3044 break;3048 break;
3045 case NodeTypeArrayAccessExpr:3049 case NodeTypeArrayAccessExpr:
3046 clone_subtree_field(&new_node->data.array_access_expr.array_ref_expr, old_node->data.array_access_expr.array_ref_expr, next_node_index);3050 clone_subtree_field(&new_node->data.array_access_expr.array_ref_expr,
3047 clone_subtree_field(&new_node->data.array_access_expr.subscript, old_node->data.array_access_expr.subscript, next_node_index);3051 old_node->data.array_access_expr.array_ref_expr, next_node_index);
3052 clone_subtree_field(&new_node->data.array_access_expr.subscript,
3053 old_node->data.array_access_expr.subscript, next_node_index);
3048 break;3054 break;
3049 case NodeTypeSliceExpr:3055 case NodeTypeSliceExpr:
3050 clone_subtree_field(&new_node->data.slice_expr.array_ref_expr, old_node->data.slice_expr.array_ref_expr, next_node_index);3056 clone_subtree_field(&new_node->data.slice_expr.array_ref_expr, old_node->data.slice_expr.array_ref_expr, next_node_index);