PageRenderTime 22ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/test/SILGen/default_arguments.swift

https://gitlab.com/franzejr/swift
Swift | 255 lines | 93 code | 40 blank | 122 comment | 0 complexity | 0ba19045c68285fdf90e96be4d4325e7 MD5 | raw file
  1. // RUN: %target-swift-frontend -emit-silgen %s | FileCheck %s
  2. // __FUNCTION__ used as top-level parameter produces the module name.
  3. // CHECK-LABEL: sil @main
  4. // CHECK: string_literal utf16 "default_arguments"
  5. // Default argument for first parameter.
  6. // CHECK-LABEL: sil hidden @_TIF17default_arguments7defarg1{{.*}} : $@convention(thin) () -> Int
  7. // CHECK: [[CVT:%[0-9]+]] = function_ref @_TFSiC
  8. // CHECK: [[INT:%[0-9]+]] = metatype $@thin Int.Type
  9. // CHECK: [[LIT:%[0-9]+]] = integer_literal $Builtin.Int2048, 17
  10. // CHECK: [[RESULT:%[0-9]+]] = apply [[CVT]]([[LIT]], [[INT]]) : $@convention(thin) (Builtin.Int2048, @thin Int.Type) -> Int
  11. // CHECK: return [[RESULT]] : $Int
  12. // Default argument for third parameter.
  13. // CHECK-LABEL: sil hidden @_TIF17default_arguments7defarg1{{.*}} : $@convention(thin) () -> @owned String
  14. // CHECK: [[CVT:%[0-9]+]] = function_ref @_TFSSC
  15. // CHECK: [[STRING:%[0-9]+]] = metatype $@thin String.Type
  16. // CHECK: [[LIT:%[0-9]+]] = string_literal utf8 "Hello"
  17. // CHECK: [[LEN:%[0-9]+]] = integer_literal $Builtin.Word, 5
  18. // CHECK: [[RESULT:%[0-9]+]] = apply [[CVT]]([[LIT]], [[LEN]], {{[^,]+}}, [[STRING]]) : $@convention(thin)
  19. // CHECK: return [[RESULT]] : $String
  20. func defarg1(i i: Int = 17, d: Double, s: String = "Hello") { }
  21. // CHECK-LABEL: sil hidden @_TF17default_arguments15testDefaultArg1FT_T_
  22. func testDefaultArg1() {
  23. // CHECK: [[FNREF:%[0-9]+]] = function_ref @_TF17default_arguments7defarg1{{.*}}
  24. // CHECK: [[LITFN:%[0-9]+]] = function_ref @_TFSdC
  25. // CHECK: [[FLOAT64:%[0-9]+]] = metatype $@thin Double.Type
  26. // CHECK: [[FLOATLIT:%[0-9]+]] = float_literal $Builtin.FPIEEE{{64|80}}, {{0x4009000000000000|0x4000C800000000000000}}
  27. // CHECK: [[FLOATVAL:%[0-9]+]] = apply [[LITFN]]([[FLOATLIT]], [[FLOAT64]])
  28. // CHECK: [[DEF0FN:%[0-9]+]] = function_ref @_TIF17default_arguments7defarg1{{.*}}_A_
  29. // CHECK: [[DEF0:%[0-9]+]] = apply [[DEF0FN]]()
  30. // CHECK: [[DEF2FN:%[0-9]+]] = function_ref @_TIF17default_arguments7defarg1{{.*}}_A1_
  31. // CHECK: [[DEF2:%[0-9]+]] = apply [[DEF2FN]]()
  32. // CHECK: apply [[FNREF]]([[DEF0]], [[FLOATVAL]], [[DEF2]])
  33. defarg1(d:3.125)
  34. }
  35. func defarg2(i: Int, d: Double = 3.125, s: String = "Hello") { }
  36. // CHECK-LABEL: sil hidden @_TF17default_arguments15testDefaultArg2
  37. func testDefaultArg2() {
  38. // CHECK: [[FNREF:%[0-9]+]] = function_ref @_TF17default_arguments7defarg2{{.*}} : $@convention(thin) (Int, Double, @owned String) -> ()
  39. // CHECK: [[LITFN:%[0-9]+]] = function_ref @_TFSiC
  40. // CHECK: [[INT64:%[0-9]+]] = metatype $@thin Int.Type
  41. // CHECK: [[INTLIT:%[0-9]+]] = integer_literal $Builtin.Int2048, 5
  42. // CHECK: [[I:%[0-9]+]] = apply [[LITFN]]([[INTLIT]], [[INT64]]) : $@convention(thin) (Builtin.Int2048, @thin Int.Type) -> Int
  43. // CHECK: [[DFN:%[0-9]+]] = function_ref @_TIF17default_arguments7defarg2{{.*}}_A0_ : $@convention(thin) () -> Double
  44. // CHECK: [[D:%[0-9]+]] = apply [[DFN]]() : $@convention(thin) () -> Double
  45. // CHECK: [[SFN:%[0-9]+]] = function_ref @_TIF17default_arguments7defarg2{{.*}}_A1_ : $@convention(thin) () -> @owned String
  46. // CHECK: [[S:%[0-9]+]] = apply [[SFN]]() : $@convention(thin) () -> @owned String
  47. // CHECK: apply [[FNREF]]([[I]], [[D]], [[S]]) : $@convention(thin) (Int, Double, @owned String) -> ()
  48. defarg2(5)
  49. }
  50. func autocloseFile(@autoclosure x: () -> String = __FILE__,
  51. @autoclosure y: () -> Int = __LINE__) { }
  52. // CHECK-LABEL: sil hidden @_TF17default_arguments17testAutocloseFileFT_T_
  53. func testAutocloseFile() {
  54. // CHECK-LABEL: sil shared [transparent] @_TFF17default_arguments17testAutocloseFileFT_T_u_KT_SS : $@convention(thin) () -> @owned String
  55. // CHECK: string_literal utf16{{.*}}default_arguments.swift
  56. // CHECK-LABEL: sil shared [transparent] @_TFF17default_arguments17testAutocloseFileFT_T_u0_KT_Si : $@convention(thin) () -> Int
  57. // CHECK: integer_literal $Builtin.Int2048, [[@LINE+1]]
  58. autocloseFile()
  59. }
  60. func testMagicLiterals(file file: String = __FILE__,
  61. function: String = __FUNCTION__,
  62. line: Int = __LINE__,
  63. column: Int = __COLUMN__) {}
  64. // Check that default argument generator functions don't leak information about
  65. // user's source.
  66. //
  67. // CHECK-LABEL: sil hidden @_TIF17default_arguments17testMagicLiteralsFT4fileSS8functionSS4lineSi6columnSi_T_A_
  68. // CHECK: string_literal utf16 ""
  69. //
  70. // CHECK-LABEL: sil hidden @_TIF17default_arguments17testMagicLiteralsFT4fileSS8functionSS4lineSi6columnSi_T_A0_
  71. // CHECK: string_literal utf16 ""
  72. //
  73. // CHECK-LABEL: sil hidden @_TIF17default_arguments17testMagicLiteralsFT4fileSS8functionSS4lineSi6columnSi_T_A1_
  74. // CHECK: integer_literal $Builtin.Int2048, 0
  75. //
  76. // CHECK-LABEL: sil hidden @_TIF17default_arguments17testMagicLiteralsFT4fileSS8functionSS4lineSi6columnSi_T_A2_
  77. // CHECK: integer_literal $Builtin.Int2048, 0
  78. func closure(_: () -> ()) {}
  79. func autoclosure(@autoclosure _: () -> ()) {}
  80. // CHECK-LABEL: sil hidden @_TF17default_arguments25testCallWithMagicLiteralsFT_T_
  81. // CHECK: string_literal utf16 "testCallWithMagicLiterals()"
  82. // CHECK: string_literal utf16 "testCallWithMagicLiterals()"
  83. // CHECK-LABEL: sil shared @_TFF17default_arguments25testCallWithMagicLiteralsFT_T_U_FT_T_
  84. // CHECK: string_literal utf16 "testCallWithMagicLiterals()"
  85. // CHECK-LABEL: sil shared [transparent] @_TFF17default_arguments25testCallWithMagicLiteralsFT_T_u_KT_T_
  86. // CHECK: string_literal utf16 "testCallWithMagicLiterals()"
  87. func testCallWithMagicLiterals() {
  88. testMagicLiterals()
  89. testMagicLiterals()
  90. closure { testMagicLiterals() }
  91. autoclosure(testMagicLiterals())
  92. }
  93. // CHECK-LABEL: sil hidden @_TF17default_argumentsg25testPropWithMagicLiteralsSi
  94. // CHECK: string_literal utf16 "testPropWithMagicLiterals"
  95. var testPropWithMagicLiterals: Int {
  96. testMagicLiterals()
  97. closure { testMagicLiterals() }
  98. autoclosure(testMagicLiterals())
  99. return 0
  100. }
  101. class Foo {
  102. // CHECK-LABEL: sil hidden @_TFC17default_arguments3Fooc{{.*}} : $@convention(method) (Int, @owned String, @owned Foo) -> @owned Foo
  103. // CHECK: string_literal utf16 "init(int:string:)"
  104. init(int: Int, string: String) {
  105. testMagicLiterals()
  106. closure { testMagicLiterals() }
  107. autoclosure(testMagicLiterals())
  108. }
  109. // CHECK-LABEL: sil hidden @_TFC17default_arguments3Food
  110. // CHECK: string_literal utf16 "deinit"
  111. deinit {
  112. testMagicLiterals()
  113. closure { testMagicLiterals() }
  114. autoclosure(testMagicLiterals())
  115. }
  116. // CHECK-LABEL: sil hidden @_TFC17default_arguments3Foog9subscriptFSiSi
  117. // CHECK: string_literal utf16 "subscript"
  118. subscript(x: Int) -> Int {
  119. testMagicLiterals()
  120. closure { testMagicLiterals() }
  121. autoclosure(testMagicLiterals())
  122. return x
  123. }
  124. }
  125. // Test at top level.
  126. testMagicLiterals()
  127. closure { testMagicLiterals() }
  128. autoclosure(testMagicLiterals())
  129. // CHECK-LABEL: sil hidden @_TF17default_arguments16testSelectorCallFTSi17withMagicLiteralsSi_T_
  130. // CHECK: string_literal utf16 "testSelectorCall(_:withMagicLiterals:)"
  131. func testSelectorCall(x: Int, withMagicLiterals y: Int) {
  132. testMagicLiterals()
  133. }
  134. // CHECK-LABEL: sil hidden @_TF17default_arguments32testSelectorCallWithUnnamedPieceFTSiSi_T_
  135. // CHECK: string_literal utf16 "testSelectorCallWithUnnamedPiece"
  136. func testSelectorCallWithUnnamedPiece(x: Int, _ y: Int) {
  137. testMagicLiterals()
  138. }
  139. // Test default arguments in an inherited subobject initializer
  140. class SuperDefArg {
  141. init(int i: Int = 10) { }
  142. }
  143. // CHECK: sil hidden @_TIFC17default_arguments11SuperDefArgcFT3intSi_S0_A_ : $@convention(thin) () -> Int
  144. // CHECK-NOT: sil hidden @_TIFC17default_arguments9SubDefArgcFT3intSi_S0_A_ : $@convention(thin) () -> Int
  145. class SubDefArg : SuperDefArg { }
  146. // CHECK: sil hidden @_TF17default_arguments13testSubDefArgFT_CS_9SubDefArg : $@convention(thin) () -> @owned SubDefArg
  147. func testSubDefArg() -> SubDefArg {
  148. // CHECK: function_ref @_TFC17default_arguments9SubDefArgC
  149. // CHECK: function_ref @_TIFC17default_arguments11SuperDefArgcFT3intSi_S0_A_
  150. // CHECK: return
  151. return SubDefArg()
  152. }
  153. // CHECK-NOT: sil hidden @_TIFC17default_arguments9SubDefArgcFT3intSi_S0_A_ : $@convention(thin) () -> Int
  154. // <rdar://problem/17379550>
  155. func takeDefaultArgUnnamed(x: Int = 5) { }
  156. // CHECK-LABEL: sil hidden @_TF17default_arguments25testTakeDefaultArgUnnamed
  157. func testTakeDefaultArgUnnamed(i: Int) {
  158. // CHECK: bb0([[I:%[0-9]+]] : $Int):
  159. // CHECK: [[FN:%[0-9]+]] = function_ref @_TF17default_arguments21takeDefaultArgUnnamedFTSi_T_ : $@convention(thin) (Int) -> ()
  160. // CHECK: apply [[FN]]([[I]]) : $@convention(thin) (Int) -> ()
  161. takeDefaultArgUnnamed(i)
  162. }
  163. func takeDSOHandle(handle: UnsafeMutablePointer<Void> = __DSO_HANDLE__) { }
  164. // CHECK-LABEL: sil hidden @_TF17default_arguments13testDSOHandleFT_T_
  165. func testDSOHandle() {
  166. // CHECK: [[DSO_HANDLE:%[0-9]+]] = global_addr @_Tv17default_arguments12__dso_handleGSpT__ : $*UnsafeMutablePointer<()>
  167. takeDSOHandle()
  168. }
  169. // Test __FUNCTION__ in an extension initializer. rdar://problem/19792181
  170. extension SuperDefArg {
  171. static let extensionInitializerWithClosure: Int = { return 22 }()
  172. }
  173. // <rdar://problem/19086357> SILGen crashes reabstracting default argument closure in members
  174. class ReabstractDefaultArgument<T> {
  175. init(a: (T, T) -> Bool = { _, _ in true }) {
  176. }
  177. }
  178. // CHECK-LABEL: sil hidden @_TF17default_arguments32testDefaultArgumentReabstractionFT_T_
  179. // function_ref default_arguments.ReabstractDefaultArgument.__allocating_init <A>(default_arguments.ReabstractDefaultArgument<A>.Type)(a : (A, A) -> Swift.Bool) -> default_arguments.ReabstractDefaultArgument<A>
  180. // CHECK: [[INITFN:%[0-9]+]] = function_ref @_TFC17default_arguments25ReabstractDefaultArgumentC
  181. // %1 = metatype $@thick ReabstractDefaultArgument<Int>.Type
  182. // function_ref default_arguments.ReabstractDefaultArgument.(init <A>(default_arguments.ReabstractDefaultArgument<A>.Type) -> (a : (A, A) -> Swift.Bool) -> default_arguments.ReabstractDefaultArgument<A>).(default argument 0)
  183. // CHECK: %2 = function_ref @_TIFC17default_arguments25ReabstractDefaultArgumentc{{.*}} : $@convention(thin) <τ_0_0> () -> @owned @callee_owned (@in τ_0_0, @in τ_0_0) -> Bool
  184. // CHECK-NEXT: %3 = apply %2<Int>() : $@convention(thin) <τ_0_0> () -> @owned @callee_owned (@in τ_0_0, @in τ_0_0) -> Bool
  185. // CHECK-NEXT: function_ref reabstraction thunk helper from @callee_owned (@in Swift.Int, @in Swift.Int) -> (@unowned Swift.Bool) to @callee_owned (@unowned Swift.Int, @unowned Swift.Int) -> (@unowned Swift.Bool)
  186. // CHECK-NEXT: %4 = function_ref @_TTRXFo_iSiiSi_dSb_XFo_dSidSi_dSb_ : $@convention(thin) (Int, Int, @owned @callee_owned (@in Int, @in Int) -> Bool) -> Bool
  187. // CHECK-NEXT: %5 = partial_apply %4(%3) : $@convention(thin) (Int, Int, @owned @callee_owned (@in Int, @in Int) -> Bool) -> Bool
  188. // function_ref reabstraction thunk helper from @callee_owned (@unowned Swift.Int, @unowned Swift.Int) -> (@unowned Swift.Bool) to @callee_owned (@in Swift.Int, @in Swift.Int) -> (@unowned Swift.Bool)
  189. // CHECK: %6 = function_ref @_TTRXFo_dSidSi_dSb_XFo_iSiiSi_dSb_ : $@convention(thin) (@in Int, @in Int, @owned @callee_owned (Int, Int) -> Bool) -> Bool
  190. // CHECK-NEXT: %7 = partial_apply %6(%5) : $@convention(thin) (@in Int, @in Int, @owned @callee_owned (Int, Int) -> Bool) -> Bool
  191. // CHECK-NEXT: apply [[INITFN]]<Int>(%7,
  192. func testDefaultArgumentReabstraction() {
  193. ReabstractDefaultArgument<Int>()
  194. }
  195. // <rdar://problem/20494437> SILGen crash handling default arguments
  196. // CHECK-LABEL: sil hidden @_TF17default_arguments18r20494437onSuccessFPS_25r20494437ExecutionContext_T_
  197. // CHECK: function_ref @_TF17default_arguments19r20494437onCompleteFTPS_25r20494437ExecutionContext__T_
  198. // <rdar://problem/20494437> SILGen crash handling default arguments
  199. protocol r20494437ExecutionContext {}
  200. let r20494437Default: r20494437ExecutionContext
  201. func r20494437onComplete(executionContext: r20494437ExecutionContext = r20494437Default) {}
  202. func r20494437onSuccess(a: r20494437ExecutionContext) {
  203. r20494437onComplete(a)
  204. }
  205. // <rdar://problem/18400194> Parenthesized function expression crashes the compiler
  206. func r18400194(a: Int, x: Int = 97) {}
  207. // CHECK-LABEL: sil hidden @_TIF17default_arguments9r18400194FTSi1xSi_T_A0_
  208. // CHECK: integer_literal $Builtin.Int2048, 97
  209. // CHECK-LABEL: sil hidden @_TF17default_arguments14test_r18400194FT_T_
  210. // CHECK: function_ref @_TF17default_arguments9r18400194FTSi1xSi_T_ : $@convention(thin) (Int, Int) -> () // user: %7
  211. // CHECK: integer_literal $Builtin.Int2048, 1
  212. // CHECK: function_ref @_TIF17default_arguments9r18400194FTSi1xSi_T_A0_ : $@convention(thin) () -> Int
  213. func test_r18400194() {
  214. (r18400194)(1)
  215. }