Skip to content

Commit c02995a

Browse files
committed
Merge remote-tracking branch 'origin/main' into rebranch
2 parents 72c772e + 309a147 commit c02995a

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

lib/SILGen/SILGenExpr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6189,7 +6189,7 @@ RValue RValueEmitter::visitConsumeExpr(ConsumeExpr *E, SGFContext C) {
61896189
}
61906190
optTemp->finishInitialization(SGF);
61916191

6192-
if (subType.isLoadable(SGF.F)) {
6192+
if (subType.isLoadable(SGF.F) || !SGF.useLoweredAddresses()) {
61936193
ManagedValue value = SGF.B.createLoadTake(E, optTemp->getManagedAddress());
61946194
if (value.getType().isTrivial(SGF.F))
61956195
return RValue(SGF, {value}, subType.getASTType());

test/SILGen/opaque_values_silgen.swift

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ func genericInout<T>(_: inout T) {}
1414

1515
func hasVarArg(_ args: Any...) {}
1616

17+
@_silgen_name("sink")
18+
func sink<T>(_ t: consuming T) {}
19+
@_silgen_name("source")
20+
func source<T>(_ t: T.Type) -> T
21+
1722
// Test array initialization - we are still (somewhat) using addresses
1823
// ---
1924
// CHECK-LABEL: sil [ossa] @$s20opaque_values_silgen10callVarArgyyF : $@convention(thin) () -> () {
@@ -797,5 +802,24 @@ func intIntoAnyHashableLet() {
797802
func consumeExprOfOwnedAddrOnlyValue<T>(_ t: __owned T) {
798803
sink(consume t)
799804
}
800-
@_silgen_name("sink")
801-
func sink<T>(_ t: consuming T) {}
805+
806+
// CHECK-LABEL: sil {{.*}}[ossa] @consumeExprOfLoadExprOfOwnedAddrOnlyLValue : {{.*}} {
807+
// CHECK: [[VAR:%[^,]+]] = alloc_box $<τ_0_0> { var τ_0_0 } <T>
808+
// CHECK: [[VAR_LIFETIME:%[^,]+]] = begin_borrow [lexical] [[VAR]]
809+
// CHECK: [[VAR_ADDR:%[^,]+]] = project_box [[VAR_LIFETIME]]
810+
// CHECK: store {{%[^,]+}} to [init] [[VAR_ADDR]]
811+
// CHECK: [[VAR_ACCESS:%[^,]+]] = begin_access [modify] [unknown] [[VAR_ADDR]]
812+
// CHECK: [[TEMPORARY_ADDR:%[^,]+]] = alloc_stack $T
813+
// CHECK: mark_unresolved_move_addr [[VAR_ACCESS]] to [[TEMPORARY_ADDR]]
814+
// CHECK: [[TEMPORARY:%[^,]+]] = load [take] [[TEMPORARY_ADDR]]
815+
// CHECK: end_access [[VAR_ACCESS]]
816+
// CHECK: [[SINK:%[^,]+]] = function_ref @sink
817+
// CHECK: apply [[SINK]]<T>([[TEMPORARY]])
818+
// CHECK: dealloc_stack [[TEMPORARY_ADDR]]
819+
// CHECK: destroy_value [[VAR]]
820+
// CHECK-LABEL: } // end sil function 'consumeExprOfLoadExprOfOwnedAddrOnlyLValue'
821+
@_silgen_name("consumeExprOfLoadExprOfOwnedAddrOnlyLValue")
822+
func consumeExprOfLoadExprOfOwnedAddrOnlyLValue<T>(_ ty: T.Type) {
823+
var t = source(ty)
824+
sink(consume t)
825+
}

0 commit comments

Comments
 (0)