diff --git a/src/codegen.cpp b/src/codegen.cpp index 21389aa89..4a0b90168 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -1567,7 +1567,9 @@ static LLVMValueRef ir_render_asm(CodeGen *g, IrExecutable *executable, IrInstru } static LLVMValueRef gen_non_null_bit(CodeGen *g, TypeTableEntry *maybe_type, LLVMValueRef maybe_handle) { - bool maybe_is_ptr = (maybe_type->id == TypeTableEntryIdPointer || maybe_type->id == TypeTableEntryIdFn); + assert(maybe_type->id == TypeTableEntryIdMaybe); + TypeTableEntry *child_type = maybe_type->data.maybe.child_type; + bool maybe_is_ptr = (child_type->id == TypeTableEntryIdPointer || child_type->id == TypeTableEntryIdFn); if (maybe_is_ptr) { return LLVMBuildICmp(g->builder, LLVMIntNE, maybe_handle, LLVMConstNull(maybe_type->type_ref), ""); } else { diff --git a/test/cases/generics.zig b/test/cases/generics.zig index f75392c20..92dc1fcbf 100644 --- a/test/cases/generics.zig +++ b/test/cases/generics.zig @@ -128,6 +128,17 @@ fn aGenericFn(inline T: type, inline a: T, b: T) -> T { } +fn genericFnWithImplicitCast() { + @setFnTest(this); + + assert(getFirstByte(u8, []u8 {13}) == 13); + assert(getFirstByte(u16, []u16 {0, 13}) == 0); +} +fn getByte(ptr: ?&u8) -> u8 {*??ptr} +fn getFirstByte(inline T: type, mem: []T) -> u8 { + getByte((&u8)(&mem[0])) +} + // TODO const assert = @import("std").debug.assert; fn assert(ok: bool) { if (!ok) diff --git a/test/self_hosted.zig b/test/self_hosted.zig deleted file mode 100644 index 49553b89f..000000000 --- a/test/self_hosted.zig +++ /dev/null @@ -1,11 +0,0 @@ -// TODO not passing -fn genericFnWithImplicitCast() { - @setFnTest(this); - - assert(getFirstByte(u8, []u8 {13}) == 13); - assert(getFirstByte(u16, []u16 {0, 13}) == 0); -} -fn getByte(ptr: ?&u8) -> u8 {*??ptr} -fn getFirstByte(inline T: type, mem: []T) -> u8 { - getByte((&u8)(&mem[0])) -}