diff --git a/lib/SILGen/SILGenExpr.cpp b/lib/SILGen/SILGenExpr.cpp index e03262cbe7c..880c05a731c 100644 --- a/lib/SILGen/SILGenExpr.cpp +++ b/lib/SILGen/SILGenExpr.cpp @@ -6199,7 +6199,7 @@ RValue RValueEmitter::visitConsumeExpr(ConsumeExpr *E, SGFContext C) { return RValue(SGF, {optTemp->getManagedAddress()}, subType.getASTType()); } - if (subType.isLoadable(SGF.F)) { + if (subType.isLoadable(SGF.F) || !SGF.useLoweredAddresses()) { ManagedValue mv = SGF.emitRValue(subExpr).getAsSingleValue(SGF, subExpr); if (mv.getType().isTrivial(SGF.F)) return RValue(SGF, {mv}, subType.getASTType()); diff --git a/test/SILGen/opaque_values_silgen.swift b/test/SILGen/opaque_values_silgen.swift index 1dd5acb2088..ca49f04c66e 100644 --- a/test/SILGen/opaque_values_silgen.swift +++ b/test/SILGen/opaque_values_silgen.swift @@ -782,3 +782,20 @@ func intIntoAnyHashableVar() { func intIntoAnyHashableLet() { let anyHashable: AnyHashable = 0 } + +// CHECK-LABEL: sil {{.*}}[ossa] @consumeExprOfOwnedAddrOnlyValue : {{.*}} { +// CHECK: bb0([[T:%[^,]+]] : +// CHECK: [[T_LIFETIME:%[^,]+]] = begin_borrow [[T]] +// CHECK: [[T_COPY:%[^,]+]] = copy_value [[T_LIFETIME]] +// CHECK: [[T_MOVE:%[^,]+]] = move_value [allows_diagnostics] [[T_COPY]] +// CHECK: [[SINK:%[^,]+]] = function_ref @sink +// CHECK: apply [[SINK]]([[T_MOVE]]) +// CHECK: end_borrow [[T_LIFETIME]] +// CHECK: destroy_value [[T]] +// CHECK-LABEL: } // end sil function 'consumeExprOfOwnedAddrOnlyValue' +@_silgen_name("consumeExprOfOwnedAddrOnlyValue") +func consumeExprOfOwnedAddrOnlyValue(_ t: __owned T) { + sink(consume t) +} +@_silgen_name("sink") +func sink(_ t: consuming T) {}