authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-14 10:39:03-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-14 10:39:03-07:00
logfcedc35551cc6b14756499414e47c33004de3be4
treefeb34b0985b29f45073ac81e21982a368e0a3542
parent83a59c4d077ead78a8c0ccecf8d4f7970309bf76

fix crash with generic function and implicit cast


4 files changed, 22 insertions(+), 5 deletions(-)

src/ast_render.cpp+6-2
...@@ -326,9 +326,9 @@ static void render_node(AstRender *ar, AstNode *node) {...@@ -326,9 +326,9 @@ static void render_node(AstRender *ar, AstNode *node) {
326 AstNode *statement = node->data.block.statements.at(i);326 AstNode *statement = node->data.block.statements.at(i);
327 print_indent(ar);327 print_indent(ar);
328 render_node(ar, statement);328 render_node(ar, statement);
329 fprintf(ar->f, ";\n");
329 }330 }
330 ar->indent -= ar->indent_size;331 ar->indent -= ar->indent_size;
331 fprintf(ar->f, "\n");
332 print_indent(ar);332 print_indent(ar);
333 fprintf(ar->f, "}");333 fprintf(ar->f, "}");
334 break;334 break;
...@@ -438,7 +438,11 @@ static void render_node(AstRender *ar, AstNode *node) {...@@ -438,7 +438,11 @@ static void render_node(AstRender *ar, AstNode *node) {
438 fprintf(ar->f, ")");438 fprintf(ar->f, ")");
439 break;439 break;
440 case NodeTypeArrayAccessExpr:440 case NodeTypeArrayAccessExpr:
441 zig_panic("TODO");441 render_node(ar, node->data.array_access_expr.array_ref_expr);
442 fprintf(ar->f, "[");
443 render_node(ar, node->data.array_access_expr.subscript);
444 fprintf(ar->f, "]");
445 break;
442 case NodeTypeSliceExpr:446 case NodeTypeSliceExpr:
443 zig_panic("TODO");447 zig_panic("TODO");
444 case NodeTypeFieldAccessExpr:448 case NodeTypeFieldAccessExpr:
src/parser.cpp+4-2
...@@ -2927,6 +2927,7 @@ static void clone_subtree_list(ZigList<AstNode *> *dest, ZigList<AstNode *> *src...@@ -2927,6 +2927,7 @@ static void clone_subtree_list(ZigList<AstNode *> *dest, ZigList<AstNode *> *src
2927 dest->resize(src->length);2927 dest->resize(src->length);
2928 for (int i = 0; i < src->length; i += 1) {2928 for (int i = 0; i < src->length; i += 1) {
2929 dest->at(i) = ast_clone_subtree(src->at(i), next_node_index);2929 dest->at(i) = ast_clone_subtree(src->at(i), next_node_index);
2930 dest->at(i)->parent_field = &dest->at(i);
2930 }2931 }
2931}2932}
29322933
...@@ -2958,11 +2959,12 @@ AstNode *ast_clone_subtree(AstNode *old_node, uint32_t *next_node_index) {...@@ -2958,11 +2959,12 @@ AstNode *ast_clone_subtree(AstNode *old_node, uint32_t *next_node_index) {
2958 memcpy(new_node, old_node, sizeof(AstNode));2959 memcpy(new_node, old_node, sizeof(AstNode));
2959 new_node->create_index = *next_node_index;2960 new_node->create_index = *next_node_index;
2960 *next_node_index += 1;2961 *next_node_index += 1;
2962 new_node->parent_field = nullptr;
29612963
2962 switch (new_node->type) {2964 switch (new_node->type) {
2963 case NodeTypeRoot:2965 case NodeTypeRoot:
2964 clone_subtree_list(&new_node->data.root.top_level_decls, &old_node->data.root.top_level_decls,2966 clone_subtree_list(&new_node->data.root.top_level_decls,
2965 next_node_index);2967 &old_node->data.root.top_level_decls, next_node_index);
2966 break;2968 break;
2967 case NodeTypeFnProto:2969 case NodeTypeFnProto:
2968 clone_subtree_tld(&new_node->data.fn_proto.top_level_decl, &old_node->data.fn_proto.top_level_decl,2970 clone_subtree_tld(&new_node->data.fn_proto.top_level_decl, &old_node->data.fn_proto.top_level_decl,
test/run_tests.cpp+1-1
...@@ -1667,7 +1667,7 @@ extern void (*fn_ptr)(void);...@@ -1667,7 +1667,7 @@ extern void (*fn_ptr)(void);
1667 )SOURCE", 2,1667 )SOURCE", 2,
1668 "pub extern var fn_ptr: ?extern fn();",1668 "pub extern var fn_ptr: ?extern fn();",
1669 R"SOURCE(pub inline fn foo() {1669 R"SOURCE(pub inline fn foo() {
1670 (??fn_ptr)()1670 (??fn_ptr)();
1671})SOURCE");1671})SOURCE");
16721672
16731673
test/self_hosted.zig+11
...@@ -975,3 +975,14 @@ pub fn vec3(x: f32, y: f32, z: f32) -> Vec3 {...@@ -975,3 +975,14 @@ pub fn vec3(x: f32, y: f32, z: f32) -> Vec3 {
975 .data = []f32 { x, y, z, },975 .data = []f32 { x, y, z, },
976 }976 }
977}977}
978
979
980#attribute("test")
981fn generic_fn_with_implicit_cast() {
982 assert(get_first_byte(u8)([]u8 {13}) == 13);
983 assert(get_first_byte(u16)([]u16 {0, 13}) == 0);
984}
985fn get_byte(ptr: ?&u8) -> u8 {*??ptr}
986fn get_first_byte(T: type)(mem: []T) -> u8 {
987 get_byte((&u8)(&mem[0]))
988}