File: other_file.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 (54 lines) | stat: -rw-r--r-- 2,912 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
import _Differentiation

protocol Protocol1: Differentiable {
  // expected-note @+2 {{protocol requires function 'internalMethod1' with type '(Float) -> Float'}}
  @differentiable(reverse, wrt: (self, x))
  func internalMethod1(_ x: Float) -> Float

  // expected-note @+3 {{protocol requires function 'internalMethod2' with type '(Float) -> Float'}}
  @differentiable(reverse, wrt: x)
  @differentiable(reverse, wrt: (self, x))
  func internalMethod2(_ x: Float) -> Float

  // expected-note @+3 {{protocol requires function 'internalMethod3' with type '(Float) -> Float'}}
  @differentiable(reverse, wrt: x)
  @differentiable(reverse, wrt: (self, x))
  func internalMethod3(_ x: Float) -> Float
}

public protocol Protocol2: Differentiable {
  @differentiable(reverse, wrt: self)
  @differentiable(reverse, wrt: (self, x))
  func internalMethod4(_ x: Float) -> Float
}

// Note:
// - No `ConformingStruct: Protocol1` conformance exists in this file, so this
//   file should compile just file.
// - A `ConformingStruct: Protocol1` conformance in a different file should be
//   diagnosed to prevent linker errors. Without a diagnostic, compilation of
//   the other file creates external references to symbols for implicit
//   `@differentiable` attributes, even though no such symbols exist.
//   Context: https://github.com/apple/swift/pull/29771#issuecomment-585059721

struct ConformingStruct: Differentiable {
  // Error for missing `@differentiable` attribute.
  // expected-note @+1 {{candidate is missing explicit '@differentiable(reverse)' attribute to satisfy requirement 'internalMethod1' (in protocol 'Protocol1'); explicit attribute is necessary because candidate is declared in a different type context or file than the conformance of 'ConformingStruct' to 'Protocol1'}} {{3-3=@differentiable(reverse) }}
  func internalMethod1(_ x: Float) -> Float {
    x
  }

  // Error for missing `@differentiable` superset attribute.
  // expected-note @+2 {{candidate is missing explicit '@differentiable(reverse)' attribute to satisfy requirement 'internalMethod2' (in protocol 'Protocol1'); explicit attribute is necessary because candidate is declared in a different type context or file than the conformance of 'ConformingStruct' to 'Protocol1'}} {{3-3=@differentiable(reverse) }}
  @differentiable(reverse, wrt: x)
  func internalMethod2(_ x: Float) -> Float {
    x
  }

  // Error for missing `@differentiable` subset attribute.
  // expected-note @+2 {{candidate is missing explicit '@differentiable(reverse, wrt: x)' attribute to satisfy requirement 'internalMethod3' (in protocol 'Protocol1'); explicit attribute is necessary because candidate is declared in a different type context or file than the conformance of 'ConformingStruct' to 'Protocol1'}} {{3-3=@differentiable(reverse, wrt: x) }}
  @differentiable(reverse, wrt: (self, x))
  func internalMethod3(_ x: Float) -> Float {
    x
  }
}