Skip to content

Commit 534bb6b

Browse files
author
Joe Shajrawi
committed
conditional checked cast instruction for opaque value types: add support for generic types + change docs per review
1 parent e02de50 commit 534bb6b

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed

docs/SIL.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4492,8 +4492,8 @@ unconditional_checked_cast_value
44924492
sil-instruction ::= 'unconditional_checked_cast_value' sil-operand 'to' sil-type
44934493

44944494
%1 = unconditional_checked_cast_value %0 : $A to $B
4495-
// $A must be not be an address
4496-
// $B must be an opaque value
4495+
// $A must not be an address
4496+
// $B must not be an address
44974497
// %1 will be of type $B
44984498

44994499
Performs a checked conversion, causing a runtime failure if the

lib/SILGen/SILGenPoly.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2213,7 +2213,7 @@ void ResultPlanner::planTupleFromDirectResult(AbstractionPattern innerOrigType,
22132213
planScalarIntoDirectResult(
22142214
newInnerOrigType, innerSubstType.getElementType(eltIndex),
22152215
newOuterOrigType, outerSubstTupleType.getElementType(eltIndex),
2216-
planData, outerResult.first, eltResult);
2216+
planData, eltResult, outerResult.first);
22172217
}
22182218
}
22192219

test/SILGen/opaque_values_silgen.swift

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,30 @@ func s220_____openExistBox(_ x: Error) -> String {
359359
// CHECK: bb6:
360360
// CHECK: return %{{.*}} : $()
361361
// CHECK-LABEL: } // end sil function '_T020opaque_values_silgen21s230______condFromAnyyypF'
362+
func s230______condFromAny(_ x: Any) {
363+
if let f = x as? (Int, (Int, (Int, Int)), Int) -> (Int, (Int, (Int, Int)), Int) {
364+
_ = f(24, (4,(2, 42)), 42)
365+
}
366+
}
367+
368+
// Tests conditional value casts and correspondingly generated reabstraction thunk, with <T> types
369+
// ---
370+
// CHECK-LABEL: sil hidden @_T020opaque_values_silgen21s240_____condTFromAnyyyp_xtlF : $@convention(thin) <T> (@in Any, @in T) -> () {
371+
// CHECK: bb0([[ARG0:%.*]] : $Any, [[ARG1:%.*]] : $T):
372+
// CHECK: [[BORROWED_ARG:%.*]] = begin_borrow [[ARG0]]
373+
// CHECK: [[COPY__ARG:%.*]] = copy_value [[BORROWED_ARG]]
374+
// CHECK: checked_cast_value_br [[COPY__ARG]] : $Any to $@callee_owned (@in (Int, T)) -> @out (Int, T), bb2, bb1
375+
// CHECK: bb2([[THUNK_PARAM:%.*]] : $@callee_owned (@in (Int, T)) -> @out (Int, T)):
376+
// CHECK: [[THUNK_REF:%.*]] = function_ref @{{.*}} : $@convention(thin) <τ_0_0> (Int, @in τ_0_0, @owned @callee_owned (@in (Int, τ_0_0)) -> @out (Int, τ_0_0)) -> (Int, @out τ_0_0)
377+
// CHECK: partial_apply [[THUNK_REF]]<T>([[THUNK_PARAM]])
378+
// CHECK: bb6:
379+
// CHECK: return %{{.*}} : $()
380+
// CHECK-LABEL: } // end sil function '_T020opaque_values_silgen21s240_____condTFromAnyyyp_xtlF'
381+
func s240_____condTFromAny<T>(_ x: Any, _ y: T) {
382+
if let f = x as? (Int, T) -> (Int, T) {
383+
f(42, y)
384+
}
385+
}
362386
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @{{.*}} : $@convention(thin) (Int, Int, Int, Int, Int, @owned @callee_owned (@in (Int, (Int, (Int, Int)), Int)) -> @out (Int, (Int, (Int, Int)), Int)) -> (Int, Int, Int, Int, Int)
363387
// CHECK: bb0([[ARG0:%.*]] : $Int, [[ARG1:%.*]] : $Int, [[ARG2:%.*]] : $Int, [[ARG3:%.*]] : $Int, [[ARG4:%.*]] : $Int, [[ARG5:%.*]] : $@callee_owned (@in (Int, (Int, (Int, Int)), Int)) -> @out (Int, (Int, (Int, Int)), Int)):
364388
// CHECK: [[TUPLE_TO_APPLY0:%.*]] = tuple ([[ARG2]] : $Int, [[ARG3]] : $Int)
@@ -375,11 +399,21 @@ func s220_____openExistBox(_ x: Error) -> String {
375399
// CHECK: [[RET_VAL_TUPLE:%.*]] = tuple ([[RET_VAL0]] : $Int, [[RET_VAL1]] : $Int, [[RET_VAL2]] : $Int, [[RET_VAL3]] : $Int, [[RET_VAL4]] : $Int)
376400
// CHECK: return [[RET_VAL_TUPLE]] : $(Int, Int, Int, Int, Int)
377401
// CHECK-LABEL: } // end sil function '{{.*}}'
378-
func s230______condFromAny(_ x: Any) {
379-
if let f = x as? (Int, (Int, (Int, Int)), Int) -> (Int, (Int, (Int, Int)), Int) {
380-
_ = f(24, (4,(2, 42)), 42)
381-
}
382-
}
402+
403+
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @{{.*}} : $@convention(thin) <T> (Int, @in T, @owned @callee_owned (@in (Int, T)) -> @out (Int, T)) -> (Int, @out T) {
404+
// CHECK: bb0([[ARG0:%.*]] : $Int, [[ARG1:%.*]] : $T, [[ARG2:%.*]] : $@callee_owned (@in (Int, T)) -> @out (Int, T)):
405+
// CHECK: [[TUPLE_TO_APPLY:%.*]] = tuple ([[ARG0]] : $Int, [[ARG1]] : $T)
406+
// CHECK: [[TUPLE_APPLY:%.*]] = apply [[ARG2]]([[TUPLE_TO_APPLY]]) : $@callee_owned (@in (Int, T)) -> @out (Int, T)
407+
// CHECK: [[TUPLE_BORROW:%.*]] = begin_borrow [[TUPLE_APPLY]] : $(Int, T)
408+
// CHECK: [[RET_VAL0:%.*]] = tuple_extract [[TUPLE_BORROW]] : $(Int, T), 0
409+
// CHECK: [[TUPLE_EXTRACT:%.*]] = tuple_extract [[TUPLE_BORROW]] : $(Int, T), 1
410+
// CHECK: [[RET_VAL1:%.*]] = copy_value [[TUPLE_EXTRACT]] : $T
411+
// CHECK: end_borrow [[TUPLE_BORROW]] from [[TUPLE_APPLY]] : $(Int, T), $(Int, T)
412+
// CHECK: destroy_value [[TUPLE_APPLY]] : $(Int, T)
413+
// CHECK: [[RET_VAL_TUPLE:%.*]] = tuple ([[RET_VAL0]] : $Int, [[RET_VAL1]] : $T)
414+
// CHECK: return [[RET_VAL_TUPLE]] : $(Int, T)
415+
// CHECK-LABEL: } // end sil function '{{.*}}'
416+
383417

384418
// Tests LogicalPathComponent's writeback for opaque value types
385419
// ---

0 commit comments

Comments
 (0)