Sema: Diagnose accessor exportability even if storage is unavailable.

It is invalid to reference an internal setter from a fragile function
regardless of whether the storage is unavailable. The swiftinterface generated
for this code would not typecheck since the setter is not known to exist
outside the module.
This commit is contained in:
Allan Shortlidge
2024-10-24 11:33:11 -07:00
parent d0ff56b345
commit df6b339c44
2 changed files with 24 additions and 8 deletions

View File

@@ -4037,6 +4037,14 @@ bool swift::diagnoseDeclAvailability(const ValueDecl *D, SourceRange R,
if (isa<GenericTypeParamDecl>(D))
return false;
if (R.isValid()) {
if (TypeChecker::diagnoseInlinableDeclRefAccess(R.Start, D, Where))
return true;
if (TypeChecker::diagnoseDeclRefExportability(R.Start, D, Where))
return true;
}
// Keep track if this is an accessor.
auto accessor = dyn_cast<AccessorDecl>(D);
@@ -4047,14 +4055,6 @@ bool swift::diagnoseDeclAvailability(const ValueDecl *D, SourceRange R,
return false;
}
if (R.isValid()) {
if (TypeChecker::diagnoseInlinableDeclRefAccess(R.Start, D, Where))
return true;
if (TypeChecker::diagnoseDeclRefExportability(R.Start, D, Where))
return true;
}
if (diagnoseExplicitUnavailability(D, R, Where, call, Flags))
return true;

View File

@@ -0,0 +1,16 @@
// RUN: %target-typecheck-verify-swift -swift-version 5
// REQUIRES: OS=macosx
public struct HasVarWithInternalAccessor {
@available(macOS, unavailable)
public internal(set) var internalSetterVar: Int {
get { return 1 }
set { } // expected-note {{setter for property 'internalSetterVar' is not '@usableFromInline' or public}}
}
@available(macOS, unavailable)
@inlinable mutating public func inlinable() {
internalSetterVar = 2 // expected-error {{setter for property 'internalSetterVar' is internal and cannot be referenced from an '@inlinable' function}}
}
}