Commit 83a59c4d07

Andrew Kelley <superjoe30@gmail.com>
2016-04-13 21:28:07
fix evaluating generic functions in wrong context
1 parent 3f9632b
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<GenericParamValue>(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);
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);
     }
 }
 
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);