File: character_literals.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • 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 (52 lines) | stat: -rw-r--r-- 2,355 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
46
47
48
49
50
51
52
// RUN: %target-swift-frontend -parse-as-library -disable-readonly-static-objects -O -emit-ir  %s | %FileCheck %s
// REQUIRES: swift_stdlib_no_asserts,optimized_stdlib
// REQUIRES: swift_in_compiler
// REQUIRES: PTRSIZE=64

// This is an end-to-end test to ensure that the optimizer generates
// a simple literal for character literals.

// We generate this as an LLVM constant global directly, no runtime heap
// allocation. Match that.
// CHECK-LABEL: @"{{.*}}charArrayy{{.*}}" ={{.*}} global {{.*}}ContiguousArrayStorage{{.*}} {{.*}}{ i64 97 }{{.*}}{ i64 98 }{{.*}}{ i64 99 }{{.*}}{ i64 100 }{{.*}}
//
// CHECK-LABEL: define {{.*}}charArray
// CHECK:  {{.*}} = tail call ptr @swift_initStaticObject({{.*}} @"{{.*}}charArrayy{{.*}}"
// CHECK: ret
public func charArray(_ i: Int) -> [Character] {
  return [ "a", "b", "c", "d" ]
}

// NOTE: 97 = 'a'
// NOTE: -2233785415175766016 = 0xE1 = 0xE0 (ASCII discrim) | 0x01 (count)
// NOTE: On Android AArch64, this is shifted right by one byte: 0x00E1 = 63331869759897600
//
// CHECK-LABEL: define {{.*}}singleChar
// CHECK-NEXT: entry:
// CHECK-NEXT: ret { i64, ptr } { i64 97, ptr inttoptr (i64 {{-2233785415175766016|63331869759897600}} to ptr) }
public func singleChar() -> Character {
  return "a"
}

// NOTE: 10852326 = 0xE6 0x97 0xA5 (little endian), the encoding of U+65E5
// NOTE: -6701356245527298048 = 0xA3 = 0xA0 (non-ASCII discrim) | 0x03 (count)
// NOTE: On Android AArch64, this is shifted right by one byte: 0x00A3 = 45880421203836928
//
// CHECK-LABEL: define {{.*}}singleNonAsciiChar
// CHECK-NEXT: entry:
// CHECK-NEXT: ret { i64, ptr } { i64 10852326, ptr inttoptr (i64 {{-6701356245527298048|45880421203836928}} to ptr) }
public func singleNonAsciiChar() -> Character {
  return "日"
}

// NOTE: -9223372036854775808 = 0x80 = immortal large discrim
// NOTE: On Android AArch64, this is shifted right by one byte: 0x0080 = 36028797018963968
// NOTE: 1152921504606847001 = 25 (code unit length) | `isTailAllocated` perf flag
//
// CHECK-LABEL: define {{.*}}singleNonSmolChar
// CHECK-NEXT: entry:
// CHECK:   ret { i64, ptr } { i64 1152921504606847001, ptr {{.*}}@".str.25.\F0\9F\91\A9\E2\80\8D\F0\9F\91\A9\E2\80\8D\F0\9F\91\A6\E2\80\8D\F0\9F\91\A6" {{.*}}i64 {{-9223372036854775808|36028797018963968}}
public func singleNonSmolChar() -> Character {
  return "👩‍👩‍👦‍👦"
}