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. (swiftlang#31527)
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. Produce a fix-it to change the derivative
function's access level.
This simplifies derivative registration rules, and may enable simplification of
AutoDiff symbol linkage rules.
Resolves TF-1099 and TF-1160.
// MARK: - Original function visibility < derivative function visibility
841
+
842
+
@usableFromInline
843
+
func usablefrominline_original_public_derivative(_ x:Float)->Float{ x }
844
+
// expected-error @+1 {{derivative function must have same access level as original function; derivative function '_usablefrominline_original_public_derivative' is public, but original function 'usablefrominline_original_public_derivative' is internal}}
func internal_original_public_derivative(_ x:Float)->Float{ x }
852
+
// expected-error @+1 {{derivative function must have same access level as original function; derivative function '_internal_original_public_derivative' is public, but original function 'internal_original_public_derivative' is internal}}
privatefunc private_original_usablefrominline_derivative(_ x:Float)->Float{ x }
860
+
// expected-error @+1 {{derivative function must have same access level as original function; derivative function '_private_original_usablefrominline_derivative' is internal, but original function 'private_original_usablefrominline_derivative' is private}}
privatefunc private_original_public_derivative(_ x:Float)->Float{ x }
869
+
// expected-error @+1 {{derivative function must have same access level as original function; derivative function '_private_original_public_derivative' is public, but original function 'private_original_public_derivative' is private}}
privatefunc private_original_internal_derivative(_ x:Float)->Float{ x }
877
+
// expected-error @+1 {{derivative function must have same access level as original function; derivative function '_private_original_internal_derivative' is internal, but original function 'private_original_internal_derivative' is private}}
fileprivatefunc fileprivate_original_private_derivative(_ x:Float)->Float{ x }
885
+
// expected-error @+1 {{derivative function must have same access level as original function; derivative function '_fileprivate_original_private_derivative' is private, but original function 'fileprivate_original_private_derivative' is fileprivate}}
privatefunc private_original_fileprivate_derivative(_ x:Float)->Float{ x }
893
+
// expected-error @+1 {{derivative function must have same access level as original function; derivative function '_private_original_fileprivate_derivative' is fileprivate, but original function 'private_original_fileprivate_derivative' is private}}
// MARK: - Original function visibility > derivative function visibility
901
+
902
+
publicfunc public_original_private_derivative(_ x:Float)->Float{ x }
903
+
// expected-error @+1 {{derivative function must have same access level as original function; derivative function '_public_original_private_derivative' is fileprivate, but original function 'public_original_private_derivative' is public}}
publicfunc public_original_internal_derivative(_ x:Float)->Float{ x }
911
+
// expected-error @+1 {{derivative function must have same access level as original function; derivative function '_public_original_internal_derivative' is internal, but original function 'public_original_internal_derivative' is public}}
func internal_original_fileprivate_derivative(_ x:Float)->Float{ x }
919
+
// expected-error @+1 {{derivative function must have same access level as original function; derivative function '_internal_original_fileprivate_derivative' is fileprivate, but original function 'internal_original_fileprivate_derivative' is internal}}
0 commit comments