-
Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathoptional.swift
72 lines (67 loc) · 3.15 KB
/
optional.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// RUN: %swift %clang-importer-sdk -I %S/Inputs/custom-modules -target x86_64-apple-macosx10.9 -emit-silgen -o - %s | FileCheck %s
import ObjectiveC
import Foundation
import objc_ext
import TestProtocols
class A {
@objc func foo() -> String? {
return ""
}
// CHECK: sil hidden @_TToFC8optional1A3foofS0_FT_GSqSS_ : $@cc(objc_method) @thin (A) -> @autoreleased Optional<NSString>
// CHECK: [[T0:%.*]] = function_ref @_TFC8optional1A3foofS0_FT_GSqSS_
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]](%0)
// CHECK-NEXT: [[TMP_OPTNSSTR:%.*]] = alloc_stack $Optional<NSString>
// CHECK-NEXT: [[TMP_OPTSTR:%.*]] = alloc_stack $Optional<String>
// CHECK-NEXT: store [[T1]] to [[TMP_OPTSTR]]#1
// CHECK: [[T1:%.*]] = select_enum_addr [[TMP_OPTSTR]]
// CHECK-NEXT: cond_br [[T1]]
// Something branch: project value, translate, inject into result.
// CHECK: [[TMP_STR:%.*]] = unchecked_take_enum_data_addr [[TMP_OPTSTR]]
// CHECK-NEXT: [[STR:%.*]] = load [[TMP_STR]]
// CHECK: [[T0:%.*]] = function_ref @swift_StringToNSString
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]]([[STR]])
// CHECK-NEXT: [[TMP_NSSTR:%.*]] = init_enum_data_addr [[TMP_OPTNSSTR]]
// CHECK-NEXT: store [[T1]] to [[TMP_NSSTR]]
// CHECK-NEXT: inject_enum_addr [[TMP_OPTNSSTR]]{{.*}}Some
// CHECK-NEXT: br
// Nothing branch: inject nothing into result.
// CHECK: inject_enum_addr [[TMP_OPTNSSTR]]{{.*}}None
// CHECK-NEXT: br
// Continuation.
// CHECK: [[T0:%.*]] = load [[TMP_OPTNSSTR]]
// CHECK-NEXT: dealloc_stack [[TMP_OPTSTR]]
// CHECK-NEXT: dealloc_stack [[TMP_OPTNSSTR]]
// CHECK-NEXT: autorelease_return [[T0]]
@objc func bar(#x : String?) {}
// CHECK: sil hidden @_TToFC8optional1A3barfS0_FT1xGSqSS__T_ : $@cc(objc_method) @thin (Optional<NSString>, A) -> ()
// CHECK: [[TMP_OPTSTR:%.*]] = alloc_stack $Optional<String>
// CHECK-NEXT: [[TMP_OPTNSSTR:%.*]] = alloc_stack $Optional<NSString>
// CHECK-NEXT: store {{.*}} to [[TMP_OPTNSSTR]]#1
// CHECK: [[T1:%.*]] = select_enum_addr [[TMP_OPTNSSTR]]
// CHECK-NEXT: cond_br [[T1]]
// Something branch: project value, translate, inject into result.
// CHECK: [[TMP_NSSTR:%.*]] = unchecked_take_enum_data_addr [[TMP_OPTNSSTR]]
// CHECK-NEXT: [[NSSTR:%.*]] = load [[TMP_NSSTR]]
// CHECK: [[T0:%.*]] = function_ref @swift_NSStringToString
// Make a temporary initialized string that we're going to clobber as part of the conversion process (?).
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]]([[NSSTR]])
// CHECK-NEXT: [[TMP_STR2:%.*]] = init_enum_data_addr [[TMP_OPTSTR]]
// CHECK-NEXT: store [[T1]] to [[TMP_STR2]]
// CHECK-NEXT: inject_enum_addr [[TMP_OPTSTR]]{{.*}}Some
// CHECK-NEXT: br
// Nothing branch: inject nothing into result.
// CHECK: inject_enum_addr [[TMP_OPTSTR]]{{.*}}None
// CHECK-NEXT: br
// Continuation.
// CHECK: [[T0:%.*]] = load [[TMP_OPTSTR]]
// CHECK-NEXT: dealloc_stack [[TMP_OPTNSSTR]]
// CHECK-NEXT: dealloc_stack [[TMP_OPTSTR]]
// CHECK: [[T1:%.*]] = function_ref @_TFC8optional1A3barfS0_FT1xGSqSS__T_
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], %1)
// CHECK-NEXT: return [[T2]] : $()
}
// rdar://15144951
class TestWeak : NSObject {
weak var b : WeakObject? = nil
}
class WeakObject : NSObject {}