fix inline loop behavior with variable result loc

This commit is contained in:
Andrew Kelley 2019-06-18 17:43:05 -04:00
parent e27da17ff2
commit 79671efd3a
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
2 changed files with 27 additions and 22 deletions

View File

@ -15157,9 +15157,14 @@ static void ir_reset_result(ResultLoc *result_loc) {
}
break;
}
case ResultLocIdVar: {
IrInstructionAllocaSrc *alloca_src =
reinterpret_cast<IrInstructionAllocaSrc *>(result_loc->source_instruction);
alloca_src->base.child = nullptr;
break;
}
case ResultLocIdPeer:
case ResultLocIdNone:
case ResultLocIdVar:
case ResultLocIdReturn:
case ResultLocIdInstruction:
case ResultLocIdBitCast:

View File

@ -190,16 +190,16 @@ fn testTryToTrickEvalWithRuntimeIf(b: bool) usize {
}
}
//test "inlined loop has array literal with elided runtime scope on first iteration but not second iteration" {
// var runtime = [1]i32{3};
// comptime var i: usize = 0;
// inline while (i < 2) : (i += 1) {
// const result = if (i == 0) [1]i32{2} else runtime;
// }
// comptime {
// expect(i == 2);
// }
//}
test "inlined loop has array literal with elided runtime scope on first iteration but not second iteration" {
var runtime = [1]i32{3};
comptime var i: usize = 0;
inline while (i < 2) : (i += 1) {
const result = if (i == 0) [1]i32{2} else runtime;
}
comptime {
expect(i == 2);
}
}
fn max(comptime T: type, a: T, b: T) T {
if (T == bool) {
@ -668,9 +668,9 @@ fn loopNTimes(comptime n: usize) void {
inline while (i < n) : (i += 1) {}
}
//test "variable inside inline loop that has different types on different iterations" {
// testVarInsideInlineLoop(true, u32(42));
//}
test "variable inside inline loop that has different types on different iterations" {
testVarInsideInlineLoop(true, u32(42));
}
fn testVarInsideInlineLoop(args: ...) void {
comptime var i = 0;
@ -681,14 +681,14 @@ fn testVarInsideInlineLoop(args: ...) void {
}
}
//test "inline for with same type but different values" {
// var res: usize = 0;
// inline for ([_]type{ [2]u8, [1]u8, [2]u8 }) |T| {
// var a: T = undefined;
// res += a.len;
// }
// expect(res == 5);
//}
test "inline for with same type but different values" {
var res: usize = 0;
inline for ([_]type{ [2]u8, [1]u8, [2]u8 }) |T| {
var a: T = undefined;
res += a.len;
}
expect(res == 5);
}
test "refer to the type of a generic function" {
const Func = fn (type) void;