Commit 94f977a6c1

Andrew Kelley <superjoe30@gmail.com>
2016-12-28 07:35:13
IR: pass genericFnWithImplicitCast test
1 parent f6ac2fa
Changed files (3)
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 {
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)
test/self_hosted.zig
@@ -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]))
-}