File: throwing_functions_without_try.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 (70 lines) | stat: -rw-r--r-- 2,389 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
// RUN: %target-typecheck-verify-swift -enable-throw-without-try

// Test the -enable-throw-without-try option. Throwing function calls should
// not require annotation with 'try'.

// rdar://21444103 - only at the top level

func foo() throws -> Int { return 0 }

// That applies to global "script" code.

var global: Int = 0
global = foo() // no error
global = try foo() // still no error

var global2: Int = foo() // no error
var global3: Int = try foo() // no error

// That includes autoclosures.
func doLazy(_ fn: @autoclosure () throws -> Int) {}
doLazy(foo())

// It doesn't include explicit closures.
var closure: () -> () = {
  _ = foo() // expected-error {{call can throw, but it is not marked with 'try' and the error is not handled}}
  doLazy(foo()) // expected-error {{call can throw but is not marked with 'try'}}
  // expected-note@-1 {{did you mean to use 'try'?}} {{10-10=try }}
  // expected-note@-2 {{did you mean to handle error as optional value?}} {{10-10=try? }}
  // expected-note@-3 {{did you mean to disable error propagation?}} {{10-10=try! }}
}

// Or any other sort of structure.

struct A {
  static var lazyCache: Int = foo() // expected-error {{call can throw, but errors cannot be thrown out of a global variable initializer}}
}

func baz() throws -> Int {
  var x: Int = 0
  x = foo() // expected-error{{call can throw but is not marked with 'try'}}
  // expected-note@-1 {{did you mean to use 'try'?}} {{7-7=try }}
  // expected-note@-2 {{did you mean to handle error as optional value?}} {{7-7=try? }}
  // expected-note@-3 {{did you mean to disable error propagation?}} {{7-7=try! }}
  x = try foo() // no error
  return x
}

func baz2() -> Int {
  var x: Int = 0
  x = foo() // expected-error{{call can throw, but it is not marked with 'try' and the error is not handled}}
  x = try foo() // expected-error{{errors thrown from here are not handled}}
  return x
}

// https://github.com/apple/swift/issues/53406

protocol P_53406 {
  func bar() throws
}

class C_53406 {
  var foo: P_53406?

  func someMethod() throws {
    foo?.bar() // expected-error {{call can throw but is not marked with 'try'}}
    // expected-note @-1 {{did you mean to use 'try'?}}{{5-5=try }}
    // expected-note @-2 {{did you mean to handle error as optional value?}}{{5-5=try? }}
    // expected-note @-3 {{did you mean to disable error propagation?}}{{5-5=try! }}
  }
}