Skip to content

Commit a7235ec

Browse files
[test] Add test isolating incorrect for-each SILGen (SR-8688).
(cherry picked from commit ba78bef)
1 parent 4070b4f commit a7235ec

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

test/SILGen/foreach.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,3 +603,29 @@ func genericFuncWithConversion<T: C>(list : [T]) {
603603
print(item)
604604
}
605605
}
606+
607+
// FIXME SR-8688: Make sure that branch on result of next() precedes optional injection.
608+
//
609+
// CHECK-LABEL: sil hidden [ossa] @$s7foreach32injectForEachElementIntoOptionalyySaySiGF
610+
// CHECK: [[NEXT_RESULT:%.*]] = load [trivial] {{.*}} : $*Optional<Int>
611+
// CHECK: [[PACKED_NEXT_RESULT:%.*]] = enum $Optional<Optional<Int>>, #Optional.some!enumelt, [[NEXT_RESULT]] : $Optional<Int>
612+
// CHECK: switch_enum [[PACKED_NEXT_RESULT]] : $Optional<Optional<Int>>, case #Optional.some!enumelt: [[BB_SOME:bb.*]], case
613+
// CHECK: [[BB_SOME]]([[X_BINDING:%.*]] : $Optional<Int>):
614+
// CHECK: debug_value [[X_BINDING]] : $Optional<Int>, let, name "x"
615+
func injectForEachElementIntoOptional(_ xs: [Int]) {
616+
for x : Int? in xs {}
617+
}
618+
619+
// FIXME SR-8688: Make sure that branch on result of next() precedes optional injection.
620+
// CHECK-LABEL: sil hidden [ossa] @$s7foreach32injectForEachElementIntoOptionalyySayxGlF
621+
// CHECK: [[PACKED_NEXT_RESULT_ADDR:%.*]] = init_enum_data_addr [[PACKED_NEXT_RESULT:%.*]] : $*Optional<Optional<T>>, #Optional.some!enumelt
622+
// CHECK: copy_addr [take] [[NEXT_RESULT:%.*]] to [initialization] [[PACKED_NEXT_RESULT_ADDR:%.*]] : $*Optional<T>
623+
// CHECK: inject_enum_addr [[PACKED_NEXT_RESULT]] : $*Optional<Optional<T>>, #Optional.some!enumelt
624+
// CHECK: switch_enum_addr [[PACKED_NEXT_RESULT]] : $*Optional<Optional<T>>, case #Optional.some!enumelt: [[BB_SOME:bb.*]], case
625+
// CHECK: [[BB_SOME]]:
626+
// CHECK: [[X_BINDING:%.*]] = alloc_stack $Optional<T>, let, name "x"
627+
// CHECK: [[ADDR:%.*]] = unchecked_take_enum_data_addr [[PACKED_NEXT_RESULT]] : $*Optional<Optional<T>>, #Optional.some!enumelt
628+
// CHECK: copy_addr [take] [[ADDR]] to [initialization] [[X_BINDING]] : $*Optional<T>
629+
func injectForEachElementIntoOptional<T>(_ xs: [T]) {
630+
for x : T? in xs {}
631+
}

0 commit comments

Comments
 (0)