// RUN: %target-swift-frontend -emit-sil -verify -primary-file %s %S/Inputs/differentiation_diagnostics_other_file.swift -module-name main -o /dev/null // Test differentiation transform cross-file diagnostics. import _Differentiation // TF-1271: Test `@differentiable` original function in other file. @differentiable func crossFileDifferentiableAttr( _ input: T ) -> T { return input.identityDifferentiableAttr() } // TF-1272: Test original function with registered derivatives in other files. // FIXME(TF-1272): Find a way to type-check `@derivative` attributes in other // files. @differentiable func crossFileDerivativeAttr( _ input: T ) -> T { // expected-error @+2 {{expression is not differentiable}} // expected-note @+1 {{cannot differentiate functions that have not been marked '@differentiable' and that are defined in other files}} return input.identityDerivativeAttr() } // TF-1234: Test `@differentiable` propagation from protocol requirement storage // declarations to their accessors in other file. @differentiable func protocolRequirementGetters(_ x: T) -> Float { x.property + x[] } // TODO(TF-1184): Make `@differentiable` on storage declarations propagate to // the setter in addition to the getter. @differentiable func protocolRequirementSetters(_ x: inout T, _ newValue: Float) { // expected-error @+2 {{expression is not differentiable}} // expected-note @+1 {{member is not differentiable because the corresponding protocol requirement is not '@differentiable'}} x.property = newValue // expected-error @+2 {{expression is not differentiable}} // expected-note @+1 {{member is not differentiable because the corresponding protocol requirement is not '@differentiable'}} x[] = newValue } // TF-1234: Test `@differentiable` propagation from class member storage // declarations to their accessors in other file. @differentiable func classRequirementGetters(_ x: Class) -> Float { x.property + x[] } @differentiable func classRequirementSetters(_ x: inout Class, _ newValue: Float) { x.property = newValue x[] = newValue } // Test cross-file lookup of a derivative function with all-concrete derivative generic signature. @differentiable func allConcreteDerivativeGenericSignature(_ a: [S]) -> Float { // No error expected. return a.sum() }