File: ErrorBridging.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 (99 lines) | stat: -rw-r--r-- 2,643 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
// RUN: %target-swift-frontend %clang-importer-sdk -typecheck %s -verify

// REQUIRES: objc_interop

import Foundation

enum FooError: HairyError, Runcible {
  case A

  var hairiness: Int { return 0 }

  func runce() {}
}

protocol HairyError : Error {
  var hairiness: Int { get }
}

protocol Runcible {
  func runce()
}

let foo = FooError.A
let error: Error = foo
let subError: HairyError = foo
let compo: HairyError & Runcible = foo

// Error-conforming concrete or existential types can be coerced explicitly
// to NSError.
let ns1 = foo as NSError
let ns2 = error as NSError
let ns3 = subError as NSError
var ns4 = compo as NSError

// NSError conversion must be explicit.
// TODO: fixit to insert 'as NSError'
ns4 = compo // expected-error{{cannot assign value of type 'any HairyError & Runcible' to type 'NSError'}}

let e1 = ns1 as? FooError
let e1fix = ns1 as FooError // expected-error {{'NSError' is not convertible to 'FooError'}}
// expected-note@-1{{did you mean to use 'as!' to force downcast?}} {{17-19=as!}}

let esub = ns1 as Error
let esub2 = ns1 as? Error // expected-warning{{conditional cast from 'NSError' to 'any Error' always succeeds}}

// rdar://problem/26370984
// https://github.com/apple/swift/issues/44171

enum MyError : Error {
  case failed
}

func concrete1(myError: MyError) -> NSError {
  return myError as NSError
}

func concrete2(myError: MyError) -> NSError {
  return myError // expected-error{{cannot convert return expression of type 'MyError' to return type 'NSError'}}
}

func generic<T : Error>(error: T) -> NSError {
  return error as NSError
}

extension Error {
  var asNSError: NSError {
    return self as NSError
  }

  var asNSError2: NSError {
    return self // expected-error{{cannot convert return expression of type 'Self' to return type 'NSError'}}
  }
}

// rdar://problem/27543121
func throwErrorCode() throws {
  throw FictionalServerError.meltedDown // expected-error{{thrown error code type 'FictionalServerError.Code' does not conform to 'Error'; construct an 'FictionalServerError' instance}}{{29-29=(}}{{40-40=)}}
}

class MyErrorClass { }
extension MyErrorClass: Error { }

class MyClass { }

func testUnknownErrorBridge(cond: Bool, mc: MyClass) -> NSObject? {
  if cond {
    return mc as? NSError // okay
  }

  return mc as? NSObject // okay
}

func testAlwaysErrorBridge(cond: Bool, mec: MyErrorClass) -> NSObject? {
  if cond {
    return mec as? NSError // expected-warning{{conditional cast from 'MyErrorClass}}' to 'NSError' always succeeds
  }

  return mec as? NSObject // expected-warning{{conditional cast from 'MyErrorClass}}' to 'NSObject' always succeeds
}