diff --git a/lib/Sema/TypeCheckAvailability.cpp b/lib/Sema/TypeCheckAvailability.cpp index c229ea6ad05..98a7b6b7403 100644 --- a/lib/Sema/TypeCheckAvailability.cpp +++ b/lib/Sema/TypeCheckAvailability.cpp @@ -2311,7 +2311,7 @@ class AvailabilityWalker : public ASTWalker { init->isImplicit() && init->getParameters()->size() == 1 && init->getParameters()->get(0)->getArgumentName() == - DC->getASTContext().Id_rawValue; + TC.Context.Id_rawValue; } public: @@ -2604,11 +2604,11 @@ AvailabilityWalker::diagAvailability(const ValueDecl *D, SourceRange R, if (!isAccessorWithDeprecatedStorage) TC.diagnoseIfDeprecated(R, DC, D, call); - if (Flags.contains(DeclAvailabilityFlag::AllowPotentiallyUnavailableProtocol) - && isa(D)) + if (Flags.contains(DeclAvailabilityFlag::AllowPotentiallyUnavailable)) return false; - if (Flags.contains(DeclAvailabilityFlag::AllowPotentiallyUnavailable)) + if (Flags.contains(DeclAvailabilityFlag::AllowPotentiallyUnavailableProtocol) + && isa(D)) return false; // Diagnose (and possibly signal) for potential unavailability diff --git a/lib/Sema/TypeCheckAvailability.h b/lib/Sema/TypeCheckAvailability.h index 2728cd39435..53dd73d3f8d 100644 --- a/lib/Sema/TypeCheckAvailability.h +++ b/lib/Sema/TypeCheckAvailability.h @@ -35,9 +35,21 @@ void diagAvailability(TypeChecker &TC, const Expr *E, DeclContext *DC); enum class DeclAvailabilityFlag : uint8_t { + /// Do not diagnose uses of protocols in versions before they were introduced. + /// Used when type-checking protocol conformances, since conforming to a + /// protocol that doesn't exist yet is allowed. AllowPotentiallyUnavailableProtocol = 1 << 0, + + /// Diagnose uses of declarations in versions before they were introduced, but + /// do not return true to indicate that a diagnostic was emitted. ContinueOnPotentialUnavailability = 1 << 1, + + /// If a diagnostic must be emitted, use a variant indicating that the usage + /// is inout and both the getter and setter must be available. ForInout = 1 << 2, + + /// Do not diagnose uses of declarations in versions before they were + /// introduced. Used to work around availability-checker bugs. AllowPotentiallyUnavailable = 1 << 3, }; using DeclAvailabilityFlags = OptionSet;