zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 95d9835898052835ce767be2fcc0e4344a704b96 (tree)
parent a4aca787229e3b0b3dc992b747cc72a561c2078c
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Thu, 30 May 2019 23:25:37 -0400

no-copy semantics for nested if

```zig
export fn entry() void {
    var c = true;
    var x = if (c) u8(4) else if (c) u16(100) else u32(10);
}
```

```llvm
define void @entry() #2 !dbg !35 {
Entry:
  %c = alloca i1, align 1
  %x = alloca i32, align 4
  store i1 true, i1* %c, align 1, !dbg !44
  call void @llvm.dbg.declare(metadata i1* %c, metadata !39, metadata !DIExpression()), !dbg !45
  %0 = load i1, i1* %c, align 1, !dbg !46
  br i1 %0, label %Then2, label %Else, !dbg !46

Else:                                             ; preds = %Entry
  %1 = load i1, i1* %c, align 1, !dbg !47
  br i1 %1, label %Then, label %Else1, !dbg !47

Then:                                             ; preds = %Else
  br label %EndIf, !dbg !48

Else1:                                            ; preds = %Else
  br label %EndIf, !dbg !48

Then2:                                            ; preds = %Entry
  br label %EndIf3, !dbg !49

EndIf:                                            ; preds = %Else1, %Then
  %2 = phi i32 [ 100, %Then ], [ 10, %Else1 ], !dbg !48
  br label %EndIf3, !dbg !49

EndIf3:                                           ; preds = %EndIf, %Then2
  %3 = phi i32 [ 4, %Then2 ], [ %2, %EndIf ], !dbg !49
  store i32 %3, i32* %x, align 4, !dbg !49
  call void @llvm.dbg.declare(metadata i32* %x, metadata !42, metadata !DIExpression()), !dbg !50
  ret void, !dbg !51
}
```

Diffstat:
Msrc/ir.cpp | 3++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/ir.cpp b/src/ir.cpp @@ -14328,13 +14328,14 @@ static ZigType *ir_result_loc_expected_type(IrAnalyze *ira, ResultLoc *result_lo switch (result_loc->id) { case ResultLocIdInvalid: case ResultLocIdPeerParent: - case ResultLocIdPeer: zig_unreachable(); case ResultLocIdNone: case ResultLocIdVar: return nullptr; case ResultLocIdReturn: return ira->explicit_return_type; + case ResultLocIdPeer: + return reinterpret_cast<ResultLocPeer*>(result_loc)->parent->resolved_type; } zig_unreachable(); }