From 83a59c4d077ead78a8c0ccecf8d4f7970309bf76 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 13 Apr 2016 12:28:07 -0700 Subject: [PATCH] fix evaluating generic functions in wrong context --- src/analyze.cpp | 2 +- src/codegen.cpp | 1 + src/parser.cpp | 16 +++++++++++----- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index f24d538ad8..244bdc5fc6 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -4564,7 +4564,7 @@ static TypeTableEntry *analyze_generic_fn_call(CodeGen *g, ImportTableEntry *imp generic_fn_type_id->generic_param_count = actual_param_count; generic_fn_type_id->generic_params = allocate(actual_param_count); - BlockContext *child_context = import->block_context; + BlockContext *child_context = decl_node->owner->block_context; for (int i = 0; i < actual_param_count; i += 1) { AstNode *generic_param_decl_node = decl_node->data.fn_proto.generic_params.at(i); assert(generic_param_decl_node->type == NodeTypeParamDecl); diff --git a/src/codegen.cpp b/src/codegen.cpp index 4a1ea84a05..70648d252f 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -3033,6 +3033,7 @@ static void gen_const_globals(CodeGen *g) { } else { expr->const_llvm_val = gen_const_val(g, type_entry, const_val); } + assert(expr->const_llvm_val); } } diff --git a/src/parser.cpp b/src/parser.cpp index 3c9bdaa78c..650a7e614d 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -3036,15 +3036,21 @@ AstNode *ast_clone_subtree(AstNode *old_node, uint32_t *next_node_index) { // none break; case NodeTypePrefixOpExpr: - clone_subtree_field(&new_node->data.prefix_op_expr.primary_expr, old_node->data.prefix_op_expr.primary_expr, next_node_index); + clone_subtree_field(&new_node->data.prefix_op_expr.primary_expr, + old_node->data.prefix_op_expr.primary_expr, next_node_index); break; case NodeTypeFnCallExpr: - clone_subtree_field(&new_node->data.fn_call_expr.fn_ref_expr, old_node->data.fn_call_expr.fn_ref_expr, next_node_index); - clone_subtree_list(&new_node->data.fn_call_expr.params, &old_node->data.fn_call_expr.params, next_node_index); + assert(!old_node->data.fn_call_expr.resolved_expr.has_global_const); + clone_subtree_field(&new_node->data.fn_call_expr.fn_ref_expr, + old_node->data.fn_call_expr.fn_ref_expr, next_node_index); + clone_subtree_list(&new_node->data.fn_call_expr.params, + &old_node->data.fn_call_expr.params, next_node_index); break; case NodeTypeArrayAccessExpr: - clone_subtree_field(&new_node->data.array_access_expr.array_ref_expr, old_node->data.array_access_expr.array_ref_expr, next_node_index); - clone_subtree_field(&new_node->data.array_access_expr.subscript, old_node->data.array_access_expr.subscript, next_node_index); + clone_subtree_field(&new_node->data.array_access_expr.array_ref_expr, + old_node->data.array_access_expr.array_ref_expr, next_node_index); + clone_subtree_field(&new_node->data.array_access_expr.subscript, + old_node->data.array_access_expr.subscript, next_node_index); break; case NodeTypeSliceExpr: clone_subtree_field(&new_node->data.slice_expr.array_ref_expr, old_node->data.slice_expr.array_ref_expr, next_node_index);