From 83a59c4d077ead78a8c0ccecf8d4f7970309bf76 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 13 Apr 2016 12:28:07 -0700 Subject: fix evaluating generic functions in wrong context --- src/parser.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/parser.cpp') 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); -- cgit v1.2.3 From fcedc35551cc6b14756499414e47c33004de3be4 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 14 Apr 2016 10:39:03 -0700 Subject: fix crash with generic function and implicit cast --- src/ast_render.cpp | 8 ++++++-- src/parser.cpp | 6 ++++-- test/run_tests.cpp | 2 +- test/self_hosted.zig | 11 +++++++++++ 4 files changed, 22 insertions(+), 5 deletions(-) (limited to 'src/parser.cpp') diff --git a/src/ast_render.cpp b/src/ast_render.cpp index 59a287b886..6b88579b49 100644 --- a/src/ast_render.cpp +++ b/src/ast_render.cpp @@ -326,9 +326,9 @@ static void render_node(AstRender *ar, AstNode *node) { AstNode *statement = node->data.block.statements.at(i); print_indent(ar); render_node(ar, statement); + fprintf(ar->f, ";\n"); } ar->indent -= ar->indent_size; - fprintf(ar->f, "\n"); print_indent(ar); fprintf(ar->f, "}"); break; @@ -438,7 +438,11 @@ static void render_node(AstRender *ar, AstNode *node) { fprintf(ar->f, ")"); break; case NodeTypeArrayAccessExpr: - zig_panic("TODO"); + render_node(ar, node->data.array_access_expr.array_ref_expr); + fprintf(ar->f, "["); + render_node(ar, node->data.array_access_expr.subscript); + fprintf(ar->f, "]"); + break; case NodeTypeSliceExpr: zig_panic("TODO"); case NodeTypeFieldAccessExpr: diff --git a/src/parser.cpp b/src/parser.cpp index 650a7e614d..0bd2f57830 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2927,6 +2927,7 @@ static void clone_subtree_list(ZigList *dest, ZigList *src dest->resize(src->length); for (int i = 0; i < src->length; i += 1) { dest->at(i) = ast_clone_subtree(src->at(i), next_node_index); + dest->at(i)->parent_field = &dest->at(i); } } @@ -2958,11 +2959,12 @@ AstNode *ast_clone_subtree(AstNode *old_node, uint32_t *next_node_index) { memcpy(new_node, old_node, sizeof(AstNode)); new_node->create_index = *next_node_index; *next_node_index += 1; + new_node->parent_field = nullptr; switch (new_node->type) { case NodeTypeRoot: - clone_subtree_list(&new_node->data.root.top_level_decls, &old_node->data.root.top_level_decls, - next_node_index); + clone_subtree_list(&new_node->data.root.top_level_decls, + &old_node->data.root.top_level_decls, next_node_index); break; case NodeTypeFnProto: clone_subtree_tld(&new_node->data.fn_proto.top_level_decl, &old_node->data.fn_proto.top_level_decl, diff --git a/test/run_tests.cpp b/test/run_tests.cpp index 461ee4172c..30fc1fdcf8 100644 --- a/test/run_tests.cpp +++ b/test/run_tests.cpp @@ -1667,7 +1667,7 @@ extern void (*fn_ptr)(void); )SOURCE", 2, "pub extern var fn_ptr: ?extern fn();", R"SOURCE(pub inline fn foo() { - (??fn_ptr)() + (??fn_ptr)(); })SOURCE"); diff --git a/test/self_hosted.zig b/test/self_hosted.zig index b36627855e..33b1834d96 100644 --- a/test/self_hosted.zig +++ b/test/self_hosted.zig @@ -975,3 +975,14 @@ pub fn vec3(x: f32, y: f32, z: f32) -> Vec3 { .data = []f32 { x, y, z, }, } } + + +#attribute("test") +fn generic_fn_with_implicit_cast() { + assert(get_first_byte(u8)([]u8 {13}) == 13); + assert(get_first_byte(u16)([]u16 {0, 13}) == 0); +} +fn get_byte(ptr: ?&u8) -> u8 {*??ptr} +fn get_first_byte(T: type)(mem: []T) -> u8 { + get_byte((&u8)(&mem[0])) +} -- cgit v1.2.3