You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[AutoDiff] Require same access level for original/derivative functions.
Require `@derivative` functions and their original functions to have the same
access level. Public original functions may also have internal
`@usableFromInline` derivatives, as a special case. Diagnose access level
mismatches.
This simplifies derivative registration rules, and may enable simplification of
AutoDiff symbol linkage rules.
Resolves TF-1099 and TF-1160.
func usablefrominline_original_public_derivative(_ x:Float)->Float{ x }
824
+
// expected-error @+1 {{derivative functions for public or '@usableFromInline' original function 'usablefrominline_original_public_derivative' must also be public or '@usableFromInline', but '_usablefrominline_original_public_derivative' is public}}
fileprivatefunc fileprivate_original_private_derivative(_ x:Float)->Float{ x }
849
+
// expected-error @+1 {{derivative functions for fileprivate original function 'fileprivate_original_private_derivative' must also be fileprivate, but '_fileprivate_original_private_derivative' is private}}
privatefunc private_original_fileprivate_derivative(_ x:Float)->Float{ x }
856
+
// expected-error @+1 {{derivative functions for fileprivate original function 'private_original_fileprivate_derivative' must also be fileprivate, but '_private_original_fileprivate_derivative' is fileprivate}}
// MARK: - Original function visibility < derivative function visibility
863
+
864
+
func internal_original_public_derivative(_ x:Float)->Float{ x }
865
+
// expected-error @+1 {{the original function of a public or '@usableFromInline' derivative function must also be public or '@usableFromInline', but 'internal_original_public_derivative' is internal}}
privatefunc private_original_usablefrominline_derivative(_ x:Float)->Float{ x }
872
+
// expected-error @+1 {{the original function of a public or '@usableFromInline' derivative function must also be public or '@usableFromInline', but 'private_original_usablefrominline_derivative' is private}}
privatefunc private_original_public_derivative(_ x:Float)->Float{ x }
880
+
// expected-error @+1 {{the original function of a public or '@usableFromInline' derivative function must also be public or '@usableFromInline', but 'private_original_public_derivative' is private}}
privatefunc private_original_internal_derivative(_ x:Float)->Float{ x }
887
+
// expected-error @+1 {{the original function of an internal derivative function must also be internal, but 'private_original_internal_derivative' is private}}
// MARK: - Original function visibility > derivative function visibility
894
+
895
+
publicfunc public_original_private_derivative(_ x:Float)->Float{ x }
896
+
// expected-error @+1 {{derivative functions for public or '@usableFromInline' original function 'public_original_private_derivative' must also be public or '@usableFromInline', but '_public_original_private_derivative' is fileprivate}}
publicfunc public_original_internal_derivative(_ x:Float)->Float{ x }
903
+
// expected-error @+1 {{derivative functions for public or '@usableFromInline' original function 'public_original_internal_derivative' must also be public or '@usableFromInline', but '_public_original_internal_derivative' is internal}}
func internal_original_fileprivate_derivative(_ x:Float)->Float{ x }
910
+
// expected-error @+1 {{derivative functions for internal original function 'internal_original_fileprivate_derivative' must also be internal, but '_internal_original_fileprivate_derivative' is fileprivate}}
0 commit comments