blob: d9346af18cefd7a12a8736aac3152e0fe8fa6a89 [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all %s -definite-init -raw-sil-inst-lowering -verify | %FileCheck %s
// This file tests mark_uninitialized [rootself]
sil_stage raw
import Builtin
import Swift
class RootClassWithIVars {
var x: Int // expected-note {{'self.x' not initialized}}
var y: Int
var z: (Int, Int) // expected-note 2 {{'self.z.1' not initialized}} expected-note {{'self.z.0' not initialized}}
init()
}
class RootClassWithNontrivialStoredProperties {
var x, y: SomeClass
init()
}
class SomeClass {}
sil @getSomeClass : $@convention(thin) () -> @owned SomeClass
sil @getSomeOptionalClass : $@convention(thin) () -> Optional<SomeClass>
// CHECK-LABEL: sil [ossa] @rootclass_test1
sil [ossa] @rootclass_test1 : $@convention(method) (@owned RootClassWithIVars, Int) -> @owned RootClassWithIVars {
bb0(%0 : @owned $RootClassWithIVars, %1 : $Int):
%3 = mark_uninitialized [rootself] %0 : $RootClassWithIVars
%4 = begin_borrow %3 : $RootClassWithIVars
%10 = ref_element_addr %4 : $RootClassWithIVars, #RootClassWithIVars.x
assign %1 to %10 : $*Int
end_borrow %4 : $RootClassWithIVars
%5 = begin_borrow %3 : $RootClassWithIVars
%11 = ref_element_addr %5 : $RootClassWithIVars, #RootClassWithIVars.y
assign %1 to %11 : $*Int
end_borrow %5 : $RootClassWithIVars
%6 = begin_borrow %3 : $RootClassWithIVars
%12 = ref_element_addr %6 : $RootClassWithIVars, #RootClassWithIVars.z
%13 = tuple_element_addr %12 : $*(Int, Int), 0
assign %1 to %13 : $*Int
%14 = tuple_element_addr %12 : $*(Int, Int), 1
assign %1 to %14 : $*Int
end_borrow %6 : $RootClassWithIVars
return %3 : $RootClassWithIVars
}
// CHECK-LABEL: sil [ossa] @rootclass_test2
sil [ossa] @rootclass_test2 : $@convention(method) (@owned RootClassWithIVars, Int) -> @owned RootClassWithIVars {
bb0(%0 : @owned $RootClassWithIVars, %1 : $Int):
%3 = mark_uninitialized [rootself] %0 : $RootClassWithIVars
%4 = begin_borrow %3 : $RootClassWithIVars
%10 = ref_element_addr %4 : $RootClassWithIVars, #RootClassWithIVars.x
assign %1 to %10 : $*Int
end_borrow %4 : $RootClassWithIVars
%5 = begin_borrow %3 : $RootClassWithIVars
%11 = ref_element_addr %5 : $RootClassWithIVars, #RootClassWithIVars.y
assign %1 to %11 : $*Int
end_borrow %5 : $RootClassWithIVars
%6 = begin_borrow %3 : $RootClassWithIVars
%12 = ref_element_addr %6 : $RootClassWithIVars, #RootClassWithIVars.z
%13 = tuple_element_addr %12 : $*(Int, Int), 0
assign %1 to %13 : $*Int
end_borrow %6 : $RootClassWithIVars
return %3 : $RootClassWithIVars // expected-error {{return from initializer without initializing all stored properties}}
}
// CHECK-LABEL: sil [ossa] @rootclass_test3
sil [ossa] @rootclass_test3 : $@convention(method) (@owned RootClassWithIVars, Int) -> @owned RootClassWithIVars {
bb0(%0 : @owned $RootClassWithIVars, %1 : $Int):
%3 = mark_uninitialized [rootself] %0 : $RootClassWithIVars
%4 = begin_borrow %3 : $RootClassWithIVars
%11 = ref_element_addr %4 : $RootClassWithIVars, #RootClassWithIVars.y
assign %1 to %11 : $*Int
end_borrow %4 : $RootClassWithIVars
return %3 : $RootClassWithIVars // expected-error {{return from initializer without initializing all stored properties}}
}
// CHECK-LABEL: sil [ossa] @test_root_release
// CHECK: bb0(%0 : @owned $RootClassWithNontrivialStoredProperties):
// CHECK-NEXT: [[METATYPE:%[0-9]+]] = metatype $@thick RootClassWithNontrivialStoredProperties.Type
// CHECK-NEXT: dealloc_partial_ref %0 : $RootClassWithNontrivialStoredProperties, [[METATYPE]] : $@thick RootClassWithNontrivialStoredProperties.Type
sil [ossa] @test_root_release : $@convention(method) (@owned RootClassWithNontrivialStoredProperties) -> () {
bb0(%0 : @owned $RootClassWithNontrivialStoredProperties):
%4 = mark_uninitialized [rootself] %0 : $RootClassWithNontrivialStoredProperties
destroy_value %4 : $RootClassWithNontrivialStoredProperties
%13 = tuple ()
return %13 : $()
}
// CHECK-LABEL: sil [ossa] @test_root_partial_release
// CHECK: bb0([[SELF:%.*]] : @owned $RootClassWithNontrivialStoredProperties):
// CHECK: [[FIELD_VALUE:%.*]] = alloc_ref
// CHECK: [[BORROWED_SELF:%.*]] = begin_borrow [[SELF]]
// CHECK: [[SELF_FIELD:%.*]] = ref_element_addr [[BORROWED_SELF]]
// CHECK: store [[FIELD_VALUE]] to [init] [[SELF_FIELD]]
// CHECK: end_borrow [[BORROWED_SELF]]
// CHECK: [[BORROWED_SELF:%.*]] = begin_borrow [[SELF]]
// CHECK: [[SELF_FIELD:%.*]] = ref_element_addr [[BORROWED_SELF]]
// CHECK: destroy_addr [[SELF_FIELD]]
// CHECK: end_borrow [[BORROWED_SELF]]
// CHECK: [[METATYPE:%[0-9]+]] = metatype $@thick RootClassWithNontrivialStoredProperties.Type
// CHECK: dealloc_partial_ref [[SELF]] : $RootClassWithNontrivialStoredProperties, [[METATYPE]] : $@thick RootClassWithNontrivialStoredProperties.Type
// CHECK: } // end sil function 'test_root_partial_release'
sil [ossa] @test_root_partial_release : $@convention(method) (@owned RootClassWithNontrivialStoredProperties) -> () {
bb0(%0 : @owned $RootClassWithNontrivialStoredProperties):
%4 = mark_uninitialized [rootself] %0 : $RootClassWithNontrivialStoredProperties
%1 = alloc_ref $SomeClass
%5 = begin_borrow %4 : $RootClassWithNontrivialStoredProperties
%2 = ref_element_addr %5 : $RootClassWithNontrivialStoredProperties, #RootClassWithNontrivialStoredProperties.x
assign %1 to %2 : $*SomeClass
end_borrow %5 : $RootClassWithNontrivialStoredProperties
destroy_value %4 : $RootClassWithNontrivialStoredProperties
%13 = tuple ()
return %13 : $()
}