blob: ea8c554825ce47d17c9ca58aa2a14ec537f57979 [file] [log] [blame]
// RUN: %target-swift-frontend %s -emit-silgen | %FileCheck %s
// Check that all reference counting instructions can take the [nonatomic]
// attribute. SIL parser should be able to parse this attribute and
// SIL printer should properly print it.
sil_stage canonical
import Builtin
import Swift
import SwiftShims
public class C {
deinit
init()
}
// foo(C) -> C
sil [noinline] @_TF28nonatomic_reference_counting3fooFCS_1CS0_ : $@convention(thin) (@owned C) -> @owned C {
bb0(%0 : $C):
return %0 : $C
}
// CHECK-LABEL: sil @test_strong_nonatomic_rr
// CHECK: strong_retain [nonatomic]
// CHECK: strong_release [nonatomic]
// CHECK: return
sil @test_strong_nonatomic_rr: $@convention(thin) () -> @owned C {
bb0:
%1 = alloc_ref $C
strong_retain [nonatomic] %1 : $C
strong_release [nonatomic] %1 : $C
return %1 : $C
}
// CHECK-LABEL: sil @test_nonatomic_rr_value
// CHECK: retain_value [nonatomic]
// CHECK: release_value [nonatomic]
// CHECK: return
sil @test_nonatomic_rr_value: $@convention(thin) () -> @owned C {
bb0:
%1 = alloc_ref $C
retain_value [nonatomic] %1 : $C
release_value [nonatomic] %1 : $C
return %1 : $C
}
// CHECK-LABEL: sil @test_unowned_nonatomic_rr
// CHECK: unowned_retain [nonatomic]
// CHECK: unowned_release [nonatomic]
// CHECK: return
sil @test_unowned_nonatomic_rr: $@convention(thin) () -> () {
bb0:
%0 = alloc_ref $C
%1 = ref_to_unowned %0 : $C to $@sil_unowned C
unowned_retain [nonatomic] %1 : $@sil_unowned C
unowned_release [nonatomic] %1 : $@sil_unowned C
%3 = tuple ()
return %3 : $()
}
// CHECK-LABEL: sil @test_set_deallocating
// CHECK: set_deallocating [nonatomic]
// CHECK: return
sil @test_set_deallocating : $(C) -> C {
bb0(%0 : $C):
set_deallocating [nonatomic] %0 : $C
return %0 : $C
}
// C.__deallocating_deinit
sil @_TFC28nonatomic_reference_counting1CD : $@convention(method) (@owned C) -> () {
bb0(%0 : $C):
dealloc_ref %0 : $C
%4 = tuple ()
return %4 : $()
}
sil_vtable C {
#C.deinit!deallocator.1: @_TFC28nonatomic_reference_counting1CD // C.__deallocating_deinit
}