blob: 1337edea8fb159b46a95353665e8d3e22004c537 [file] [log] [blame]
// RUN: %target-swift-frontend -typecheck -verify %s
// If the original function is "exported" (public or @usableFromInline), then
// its JVP/VJP must also be exported.
// Ok: all public.
@differentiable(vjp: dfoo1)
public func foo1(_ x: Float) -> Float { return 1 }
public func dfoo1(x: Float) -> (Float, (Float) -> Float) { return (1, {$0}) }
// Ok: all internal.
struct CheckpointsFoo {}
@differentiable(vjp: dfoo2)
func foo2(_ x: Float) -> Float { return 1 }
func dfoo2(_ x: Float) -> (Float, (Float) -> Float) { return (1, {$0}) }
// Ok: all private.
@differentiable(vjp: dfoo3)
private func foo3(_ x: Float) -> Float { return 1 }
private func dfoo3(_ x: Float) -> (Float, (Float) -> Float) { return (1, {$0}) }
// Error: vjp not exported.
@differentiable(vjp: dbar1) // expected-error {{derivative function 'dbar1' is required to either be public or '@usableFromInline' because the original function 'bar1' is public or '@usableFromInline'}}
public func bar1(_ x: Float) -> Float { return 1 }
private func dbar1(_ x: Float) -> (Float, (Float) -> Float) { return (1, {$0}) }