File: throwing.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 (90 lines) | stat: -rw-r--r-- 2,112 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
// RUN: %target-run-simple-swift( -Xfrontend -disable-availability-checking -parse-as-library)

// REQUIRES: executable_test
// REQUIRES: concurrency
// UNSUPPORTED: freestanding

// REQUIRES: concurrency_runtime
// UNSUPPORTED: back_deployment_runtime

import _Concurrency
import StdlibUnittest

class P<T> {
  var t: T
  init(_ v: T) {
    t = v
  }
}

class A {}
class B {}
class C {}

enum E : Error {
    case err
}

protocol MP { }

class M : MP {

  @available(SwiftStdlib 5.1, *)
  func throwWithIndirectResult<T>(_ a: P<T>) async throws -> T {
    throw E.err
  }
}

extension MP {
  @available(SwiftStdlib 5.1, *)
  func l<A, B, C, D, E2, F> (_ a : P<A>, _ b: P<B>, _ c: P<C>, _ d : P<D>, _ e: P<E2>, _ f: P<F>) async throws -> (A, B, C, D, E2, F) {
    throw E.err
  }
}

@main struct Main {
  static func main() async {
    let tests = TestSuite("Async Throw")

    if #available(SwiftStdlib 5.1, *) {
      tests.test("throwing of naturally direct but indirect reabstraction") {
        let task2 = detach {
          let m = M()
          await verifyCancelled {
            try await m.l(P(A()), P(B()), P(C()), P(A()), P(B()), P(C()))
          }
          func verifyCancelled<T>(execute operation: () async throws -> T) async {
            do {
              let _ = try await operation()
              assertionFailure("operation() threw")
            }
            catch _ as E {
              // This is what we expect to happen
            }
            catch {
             assertionFailure("unknown error thrown")
            }
          }
        }
        _ = await task2.get()
      }
      tests.test("throwing with indirect result") {
        let task2 = detach {
          let m = M()
          do {
            let _ = try await m.throwWithIndirectResult(P(A()))
            assertionFailure("operation() threw")
          }
          catch _ as E {
            // This is what we expect to happen
          }
          catch {
           assertionFailure("unknown error thrown")
          }
        }
        _ = await task2.get()
      }
    }
    await runAllTestsAsync()
  }
}