From 28ad4e6d83e307b814d76f53795fa5ff61bbdb2f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 7 Apr 2016 15:09:55 -0700 Subject: [PATCH] fix segfault in generic functions See #22 --- src/parser.cpp | 8 ++++++-- test/self_hosted.zig | 12 ++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index df1fe65310..2c3c4e4155 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2861,8 +2861,12 @@ static void clone_subtree_list_ptr(ZigList **dest_ptr, ZigListparent_field = dest; + if (src) { + *dest = ast_clone_subtree(src, next_node_index); + (*dest)->parent_field = dest; + } else { + *dest = nullptr; + } } static void clone_subtree_tld(TopLevelDecl *dest, TopLevelDecl *src, uint32_t *next_node_index) { diff --git a/test/self_hosted.zig b/test/self_hosted.zig index f715fffe2c..847bc604bc 100644 --- a/test/self_hosted.zig +++ b/test/self_hosted.zig @@ -542,6 +542,18 @@ fn generic_function_equality() { } +#attribute("test") +fn generic_malloc_free() { + const a = %%mem_alloc(u8)(10); + mem_free(u8)(a); +} +const some_mem : [100]u8 = undefined; +fn mem_alloc(T: type)(n: isize) -> %[]T { + return (&T)(&some_mem[0])[0...n]; +} +fn mem_free(T: type)(mem: []T) { } + + fn assert(b: bool) { if (!b) unreachable{} }