[Sema] Diagnose internal(set) from @inlinable functions

This patch mainly consolidates the functions used to check accessors vs.
other decls, and makes sure we check setter access as well as regular
decl access.

rdar://45217648
This commit is contained in:
Harlan Haskins
2018-12-07 12:46:19 -08:00
parent d30a3da32a
commit 1abeeb8b92
8 changed files with 94 additions and 46 deletions

View File

@@ -134,21 +134,37 @@ bool TypeChecker::diagnoseInlinableDeclRef(SourceLoc loc,
downgradeToWarning = DowngradeToWarning::Yes;
}
auto diagName = D->getFullName();
bool isAccessor = false;
// Swift 4.2 did not check accessor accessiblity.
if (auto accessor = dyn_cast<AccessorDecl>(D)) {
isAccessor = true;
if (!Context.isSwiftVersionAtLeast(5))
downgradeToWarning = DowngradeToWarning::Yes;
// For accessors, diagnose with the name of the storage instead of the
// implicit '_'.
diagName = accessor->getStorage()->getFullName();
}
auto diagID = diag::resilience_decl_unavailable;
if (downgradeToWarning == DowngradeToWarning::Yes)
diagID = diag::resilience_decl_unavailable_warn;
diagnose(loc, diagID,
D->getDescriptiveKind(), D->getFullName(),
D->getDescriptiveKind(), diagName,
D->getFormalAccessScope().accessLevelForDiagnostics(),
static_cast<unsigned>(Kind));
static_cast<unsigned>(Kind),
isAccessor);
if (TreatUsableFromInlineAsPublic) {
diagnose(D, diag::resilience_decl_declared_here,
D->getDescriptiveKind(), D->getFullName());
D->getDescriptiveKind(), diagName, isAccessor);
} else {
diagnose(D, diag::resilience_decl_declared_here_public,
D->getDescriptiveKind(), D->getFullName());
D->getDescriptiveKind(), diagName, isAccessor);
}
return (downgradeToWarning == DowngradeToWarning::No);