Commit 9f92042da9

Andrew Kelley <superjoe30@gmail.com>
2017-05-02 04:37:34
allow undefined to be resolved with other types
closes #295
1 parent cff5358
Changed files (4)
src/ir.cpp
@@ -6156,6 +6156,11 @@ static TypeTableEntry *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_nod
         {
             prev_inst = cur_inst;
             continue;
+        } else if (cur_type->id == TypeTableEntryIdUndefLit) {
+            continue;
+        } else if (prev_type->id == TypeTableEntryIdUndefLit) {
+            prev_inst = cur_inst;
+            continue;
         } else if (prev_type->id == TypeTableEntryIdNumLitInt ||
                     prev_type->id == TypeTableEntryIdNumLitFloat)
         {
std/os/child_process.zig
@@ -105,37 +105,21 @@ pub const ChildProcess = struct {
         maybe_cwd: ?[]const u8, env_map: &const BufMap,
         stdin: StdIo, stdout: StdIo, stderr: StdIo, allocator: &Allocator) -> %ChildProcess
     {
-        // TODO issue #295
-        //const stdin_pipe = if (stdin == StdIo.Pipe) %return makePipe() else undefined;
-        var stdin_pipe: [2]i32 = undefined;
-        if (stdin == StdIo.Pipe)
-            stdin_pipe = %return makePipe();
+        const stdin_pipe = if (stdin == StdIo.Pipe) %return makePipe() else undefined;
         %defer if (stdin == StdIo.Pipe) { destroyPipe(stdin_pipe); };
 
-        // TODO issue #295
-        //const stdout_pipe = if (stdout == StdIo.Pipe) %return makePipe() else undefined;
-        var stdout_pipe: [2]i32 = undefined;
-        if (stdout == StdIo.Pipe) 
-            stdout_pipe = %return makePipe();
+        const stdout_pipe = if (stdout == StdIo.Pipe) %return makePipe() else undefined;
         %defer if (stdout == StdIo.Pipe) { destroyPipe(stdout_pipe); };
 
-        // TODO issue #295
-        //const stderr_pipe = if (stderr == StdIo.Pipe) %return makePipe() else undefined;
-        var stderr_pipe: [2]i32 = undefined;
-        if (stderr == StdIo.Pipe) 
-            stderr_pipe = %return makePipe();
+        const stderr_pipe = if (stderr == StdIo.Pipe) %return makePipe() else undefined;
         %defer if (stderr == StdIo.Pipe) { destroyPipe(stderr_pipe); };
 
         const any_ignore = (stdin == StdIo.Ignore or stdout == StdIo.Ignore or stderr == StdIo.Ignore);
-        // TODO issue #295
-        //const dev_null_fd = if (any_ignore) {
-        //    %return os.posixOpen("/dev/null", posix.O_RDWR, 0, null)
-        //} else {
-        //    undefined
-        //};
-        var dev_null_fd: i32 = undefined;
-        if (any_ignore)
-            dev_null_fd = %return os.posixOpen("/dev/null", posix.O_RDWR, 0, null);
+        const dev_null_fd = if (any_ignore) {
+            %return os.posixOpen("/dev/null", posix.O_RDWR, 0, null)
+        } else {
+            undefined
+        };
 
         // This pipe is used to communicate errors between the time of fork
         // and execve from the child process to the parent process.
test/cases/cast.zig
@@ -195,3 +195,14 @@ fn peerTypeEmptyArrayAndSliceAndError(a: bool, slice: []u8) -> %[]u8 {
 
     return slice[0...1];
 }
+
+test "resolve undefined with integer" {
+    testResolveUndefWithInt(true, 1234);
+    comptime testResolveUndefWithInt(true, 1234);
+}
+fn testResolveUndefWithInt(b: bool, x: i32) {
+    const value = if (b) x else undefined;
+    if (b) {
+        assert(value == x);
+    }
+}
test/cases/try.zig
@@ -47,13 +47,10 @@ fn failIfTrue(ok: bool) -> %void {
     }
 }
 
-// TODO
-//fn tryThenNotExecutedWithAssignment() {
-//    @setFnTest(this);
-//
-//    try (failIfTrue(true)) {
-//        unreachable;
-//    } else |err| {
-//        assert(err == error.ItBroke);
-//    }
-//}
+test "try then not executed with assignment" {
+    try (failIfTrue(true)) {
+        unreachable;
+    } else |err| {
+        assert(err == error.ItBroke);
+    }
+}