diff --git a/lib/SIL/Verifier/SILVerifier.cpp b/lib/SIL/Verifier/SILVerifier.cpp index 36f734207c8..0dd0ba5a726 100644 --- a/lib/SIL/Verifier/SILVerifier.cpp +++ b/lib/SIL/Verifier/SILVerifier.cpp @@ -3391,6 +3391,8 @@ public: void checkRetainValueInst(RetainValueInst *I) { require(I->getOperand()->getType().isObject(), "Source value should be an object value"); + require(!I->getOperand()->getType().isMoveOnly(), + "retain value operand type must be copyable"); require(!F.hasOwnership(), "retain_value is only in functions with unqualified ownership"); } diff --git a/test/SILOptimizer/simplify_retain_value.sil b/test/SILOptimizer/simplify_retain_value.sil index 501066a5927..2f86a760112 100644 --- a/test/SILOptimizer/simplify_retain_value.sil +++ b/test/SILOptimizer/simplify_retain_value.sil @@ -19,17 +19,6 @@ struct WithDeinit : ~Copyable { deinit } -struct Outer : ~Copyable { - var wd: WithDeinit -} - -enum EnumWithDeinit: ~Copyable { - case A(Int64) - case B - - deinit -} - struct TwoEnums { var u1: U var u2: U @@ -62,16 +51,6 @@ bb0(%0 : $Builtin.Int8, %1 : $Builtin.NativeObject): return %4 : $(Builtin.Int8, Builtin.NativeObject) } -// CHECK-LABEL: sil @dont_remove_struct_with_deinit_field -// CHECK: retain_value %0 -// CHECK: } // end sil function 'dont_remove_struct_with_deinit_field' -sil @dont_remove_struct_with_deinit_field : $@convention(thin) (Outer) -> () { -bb0(%0 : $Outer): - retain_value %0 : $Outer - %2 = tuple () - return %2 : $() -} - // CHECK-LABEL: sil @struct_with_two_trivial_enums // CHECK-NOT: retain_value // CHECK: } // end sil function 'struct_with_two_trivial_enums' @@ -138,18 +117,6 @@ bb0(%0 : $@thin U.Type, %1 : $C): return %6 : $(U, U, U) } -// CHECK-LABEL: sil @dont_replace_payload_of_enum_with_deinit -// CHECK: %1 = enum -// CHECK: retain_value %1 -// CHECK: } // end sil function 'dont_replace_payload_of_enum_with_deinit' -sil @dont_replace_payload_of_enum_with_deinit : $@convention(thin) (Int64) -> () { -bb0(%0 : $Int64): - %1 = enum $EnumWithDeinit, #EnumWithDeinit.A!enumelt, %0 : $Int64 - retain_value %1 : $EnumWithDeinit - %3 = tuple () - return %3 : $() -} - // CHECK-LABEL: sil @release_then_retain_peephole // CHECK: bb0 // CHECK-NOT: retain_value