File: generic-enum-execution.cpp

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 (129 lines) | stat: -rw-r--r-- 3,934 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// RUN: %empty-directory(%t)

// RUN: %target-swift-frontend %S/generic-enum-in-cxx.swift -typecheck -module-name Generics -clang-header-expose-decls=all-public -emit-clang-header-path %t/generics.h

// RUN: %target-interop-build-clangxx -std=gnu++20 -c %s -I %t -o %t/swift-generics-execution.o
// RUN: %target-interop-build-swift %S/generic-enum-in-cxx.swift -o %t/swift-generics-execution -Xlinker %t/swift-generics-execution.o -module-name Generics -Xfrontend -entry-point-function-name -Xfrontend swiftMain

// RUN: %target-codesign %t/swift-generics-execution
// RUN: %target-run %t/swift-generics-execution | %FileCheck %s

// REQUIRES: executable_test

#include "generics.h"
#include <cassert>
#include <cstdio>

extern "C" size_t swift_retainCount(void * _Nonnull obj);

size_t getRetainCount(const Generics::TracksDeinit & swiftClass) {
  void *p = swift::_impl::_impl_RefCountedClass::getOpaquePointer(swiftClass);
  return swift_retainCount(p);
}

int main() {
  using namespace Generics;

  {
    auto x = makeGenericOpt<int>(42);
    takeGenericOpt(x);
    // CHECK: some(42)
    inoutGenericOpt(x, -11);
    takeGenericOpt(x);
    // CHECK-NEXT: none
    inoutGenericOpt(x, -11);
    takeGenericOpt(x);
    // CHECK-NEXT: some(-11)
    x.method();
    // CHECK-NEXT: GenericOpt<T>::testme::some(-11);
    assert(x.getComputedProp() == 42);
    assert(x.isSome());
    auto val = x.getSome();
    assert(val == -11);
    x.reset();
    assert(x.isNone());
    assert(x.genericMethod<double>(5.25) == 5.25);
    // CHECK-NEXT: GenericOpt<T>::genericMethod<T>::none,5.25;
  }
  {
    auto x = makeConcreteOpt(0xFA);
    takeConcreteOpt(x);
    // CHECK-NEXT: CONCRETE opt: some(250) ;
    inoutConcreteOpt(x);
    takeConcreteOpt(x);
    // CHECK-NEXT: CONCRETE opt: some(750) ;
    inoutConcreteOpt(x);
    takeConcreteOpt(x);
    // CHECK-NEXT: CONCRETE opt: some(2250) ;
    x.method();
    // CHECK-NEXT: GenericOpt<T>::testme::some(2250);
    assert(x.getComputedProp() == 42);
    assert(x.isSome());
    auto val = x.getSome();
    assert(val == 2250);
    x.reset();
    assert(x.isNone());
    assert(x.genericMethod<double>(-1.25) == -1.25);
    // CHECK-NEXT: GenericOpt<T>::genericMethod<T>::none,-1.25;
  }
  {
    auto x   = makeGenericOpt<StructForEnum>(StructForEnum::init());
    auto val = x.getSome();
    // CHECK-NEXT: init-TracksDeinit
    // CHECK-NEXT: destroy-TracksDeinit
  }
  {
    auto ptr = constructTracksDeinit();
    // CHECK-NEXT: init-TracksDeinit
    assert(getRetainCount(ptr) == 1);
    {
      auto x   = makeGenericOpt<TracksDeinit>(ptr);
      assert(getRetainCount(ptr) == 2);
      auto ptr2 = x.getSome();
      assert(getRetainCount(ptr) == 3);
    }
    puts("after some");
    assert(getRetainCount(ptr) == 1);
    // CHECK-NEXT: after some
    // CHECK-NEXT: destroy-TracksDeinit
  }
  {
    auto x = GenericOpt<int>::some(14);
    takeGenericOpt(x);
    assert(x.isSome());
    assert(x.getSome() == 14);
    // CHECK-NEXT: some(14)
    auto y = GenericOpt<int>::none();
    takeGenericOpt(y);
    assert(y.isNone());
    // CHECK-NEXT: none
  }
  {
    auto x = GenericOpt<StructForEnum>::some(StructForEnum::init());
    takeGenericOpt(x);
    assert(x.isSome());
    // CHECK-NEXT: init-TracksDeinit
    // CHECK-NEXT: some(Generics.StructForEnum(x: Generics.TracksDeinit))
    // CHECK-NEXT: destroy-TracksDeinit
    auto y = GenericOpt<StructForEnum>::none();
    assert(y.isNone());
  }
  {
    auto ptr = constructTracksDeinit();
    // CHECK-NEXT: init-TracksDeinit
    assert(getRetainCount(ptr) == 1);
    {
      auto x = GenericOpt<TracksDeinit>::some(ptr);
      assert(getRetainCount(ptr) == 2);
      auto ptr2 = x.getSome();
      assert(getRetainCount(ptr) == 3);
    }
    puts("after some");
    assert(getRetainCount(ptr) == 1);
    // CHECK-NEXT: after some
    // CHECK-NEXT: destroy-TracksDeinit
  }
  puts("EOF");
  // CHECK-NEXT: EOF
  return 0;
}