File: variadic_vanishing_tuple.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (45 lines) | stat: -rw-r--r-- 2,192 bytes parent folder | download
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
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize

public func takesMetatype<T>(_: T.Type) {}

public func makeTuple<each T>(_ t: repeat each T) {
  takesMetatype((repeat each T).self)
}

// CHECK-LABEL: define {{(protected )?}}{{(dllexport )?}}swiftcc void @"$s24variadic_vanishing_tuple9makeTupleyyxxQpRvzlF"(ptr noalias %0, {{i32|i64}} %1, ptr %"each T")
// CHECK:   [[CMP:%.*]] = icmp eq [[INT]] %1, 1
// CHECK:   br i1 [[CMP]], label %vanishing-tuple, label %actual-tuple

// CHECK: vanishing-tuple:
// CHECK:   [[PACK_ADDR:%.*]] = ptrtoint ptr %"each T" to [[INT]]
// CHECK:   [[PACK_ADDR_MASKED:%.*]] = and [[INT]] [[PACK_ADDR]], -2
// CHECK:   [[PACK_PTR:%.*]] = inttoptr [[INT]] [[PACK_ADDR_MASKED]] to ptr
// CHECK:   [[ELT_PTR:%.*]] = getelementptr inbounds ptr, ptr [[PACK_PTR]], [[INT]] 0
// CHECK:   [[ELT:%.*]] = load ptr, ptr [[ELT_PTR]]
// CHECK:   [[RESULT:%.*]] = insertvalue %swift.metadata_response undef, ptr [[ELT]], 0
// CHECK:   [[RESULT2:%.*]] = insertvalue %swift.metadata_response [[RESULT]], [[INT]] 0, 1
// CHECK:   br label %tuple-rest

// CHECK: actual-tuple:
// CHECK:   [[PACK:%.*]] = alloca ptr, [[INT]] %1
// CHECK:   br label %pack-expansion-check

// CHECK: pack-expansion-check:
// CHECK:   br i1 {{%.*}}, label %pack-expansion-loop, label %pack-expansion-rest

// CHECK: pack-expansion-loop:
// CHECK:   br label %pack-expansion-check

// CHECK: pack-expansion-rest:
// CHECK:   [[TUPLE:%.*]] = call swiftcc %swift.metadata_response @swift_getTupleTypeMetadata([[INT]] 0, [[INT]] %1, ptr [[PACK:%.*]], ptr null, ptr null)
// CHECK:   br label %tuple-rest

// CHECK: tuple-rest:
// CHECK:   [[PHI:%.*]] = phi %swift.metadata_response [ [[RESULT2]], %vanishing-tuple ], [ [[TUPLE]], %pack-expansion-rest ]
// CHECK:   [[METADATA:%.*]] = extractvalue %swift.metadata_response [[PHI]], 0
// CHECK:   call swiftcc void @"$s24variadic_vanishing_tuple13takesMetatypeyyxmlF"(ptr [[METADATA]], ptr [[METADATA]])
// CHECK:   ret void

public func makeTuple2<each T, each U, each V: Hashable>(t: repeat each T, u: repeat each U, v: repeat each V) {
  takesMetatype((repeat each T, repeat Array<each U>, repeat Set<each V>).self)
}