Merge pull request #10732 from gottesmm/callee_unowned_can_accept_unowned
diff --git a/lib/SIL/SILOwnershipVerifier.cpp b/lib/SIL/SILOwnershipVerifier.cpp
index 59c7e6d..8b445f6 100644
--- a/lib/SIL/SILOwnershipVerifier.cpp
+++ b/lib/SIL/SILOwnershipVerifier.cpp
@@ -824,7 +824,10 @@
case ParameterConvention::Indirect_InoutAliasable:
llvm_unreachable("Illegal convention for callee");
case ParameterConvention::Direct_Unowned:
- return {compatibleWithOwnership(ValueOwnershipKind::Trivial), false};
+ if (isAddressOrTrivialType())
+ return {compatibleWithOwnership(ValueOwnershipKind::Trivial), false};
+ // We accept unowned, owned, and guaranteed in unowned positions.
+ return {true, false};
case ParameterConvention::Direct_Owned:
return {compatibleWithOwnership(ValueOwnershipKind::Owned), true};
case ParameterConvention::Direct_Guaranteed:
diff --git a/test/SIL/ownership-verifier/use_verifier.sil b/test/SIL/ownership-verifier/use_verifier.sil
index 72d95b6..e5b1249 100644
--- a/test/SIL/ownership-verifier/use_verifier.sil
+++ b/test/SIL/ownership-verifier/use_verifier.sil
@@ -334,6 +334,14 @@
return %9999 : $()
}
+sil @block_invoke_test : $@convention(thin) (@owned @convention(block) () -> ()) -> () {
+bb0(%0 : @owned $@convention(block) () -> ()):
+ apply %0() : $@convention(block) () -> ()
+ destroy_value %0 : $@convention(block) () -> ()
+ %9999 = tuple()
+ return %9999 : $()
+}
+
//////////////////////
// Terminator Tests //
//////////////////////