Skip to content

Commit 817e451

Browse files
authored
Merge pull request #77442 from tshortli/disable-availability-checking
2 parents 7a43b44 + d8be24b commit 817e451

File tree

5 files changed

+44
-33
lines changed

5 files changed

+44
-33
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,8 @@ ExportContext ExportContext::forDeclSignature(Decl *D) {
238238

239239
auto *DC = D->getInnermostDeclContext();
240240
auto fragileKind = DC->getFragileFunctionKind();
241-
auto availabilityContext =
242-
(Ctx.LangOpts.DisableAvailabilityChecking
243-
? AvailabilityContext::getDefault(Ctx)
244-
: TypeChecker::availabilityAtLocation(D->getLoc(), DC));
241+
auto loc = D->getLoc();
242+
auto availabilityContext = TypeChecker::availabilityAtLocation(loc, DC);
245243
bool spi = Ctx.LangOpts.LibraryLevel == LibraryLevel::SPI;
246244
bool implicit = false;
247245
computeExportContextBits(Ctx, D, &spi, &implicit);
@@ -259,10 +257,7 @@ ExportContext ExportContext::forFunctionBody(DeclContext *DC, SourceLoc loc) {
259257
auto &Ctx = DC->getASTContext();
260258

261259
auto fragileKind = DC->getFragileFunctionKind();
262-
auto availabilityContext =
263-
(Ctx.LangOpts.DisableAvailabilityChecking
264-
? AvailabilityContext::getDefault(Ctx)
265-
: TypeChecker::availabilityAtLocation(loc, DC));
260+
auto availabilityContext = TypeChecker::availabilityAtLocation(loc, DC);
266261
bool spi = Ctx.LangOpts.LibraryLevel == LibraryLevel::SPI;
267262
bool implicit = false;
268263
forEachOuterDecl(
@@ -1075,6 +1070,8 @@ class TypeRefinementContextBuilder : private ASTWalker {
10751070
std::pair<std::optional<AvailabilityRange>,
10761071
std::optional<AvailabilityRange>>
10771072
buildStmtConditionRefinementContext(StmtCondition Cond) {
1073+
if (Context.LangOpts.DisableAvailabilityChecking)
1074+
return {};
10781075

10791076
// Any refinement contexts introduced in the statement condition
10801077
// will end at the end of the last condition element.
@@ -1346,8 +1343,18 @@ class TypeRefinementContextBuilder : private ASTWalker {
13461343
} // end anonymous namespace
13471344

13481345
void TypeChecker::buildTypeRefinementContextHierarchy(SourceFile &SF) {
1346+
switch (SF.Kind) {
1347+
case SourceFileKind::SIL:
1348+
// SIL doesn't support availability queries.
1349+
return;
1350+
case SourceFileKind::MacroExpansion:
1351+
case SourceFileKind::DefaultArgument:
1352+
case SourceFileKind::Library:
1353+
case SourceFileKind::Main:
1354+
case SourceFileKind::Interface:
1355+
break;
1356+
}
13491357
ASTContext &Context = SF.getASTContext();
1350-
assert(!Context.LangOpts.DisableAvailabilityChecking);
13511358

13521359
// If there's already a root node, then we're done.
13531360
if (SF.getTypeRefinementContext())
@@ -1376,9 +1383,6 @@ void TypeChecker::buildTypeRefinementContextHierarchy(SourceFile &SF) {
13761383

13771384
TypeRefinementContext *
13781385
TypeChecker::getOrBuildTypeRefinementContext(SourceFile *SF) {
1379-
if (SF->getASTContext().LangOpts.DisableAvailabilityChecking)
1380-
return nullptr;
1381-
13821386
TypeRefinementContext *TRC = SF->getTypeRefinementContext();
13831387
if (!TRC) {
13841388
buildTypeRefinementContextHierarchy(*SF);

lib/Sema/TypeChecker.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,11 +276,9 @@ TypeCheckSourceFileRequest::evaluate(Evaluator &eval, SourceFile *SF) const {
276276
FrontendStatsTracer tracer(Ctx.Stats,
277277
"Type checking and Semantic analysis");
278278

279-
if (!Ctx.LangOpts.DisableAvailabilityChecking) {
280-
// Build the type refinement hierarchy for the primary
281-
// file before type checking.
282-
TypeChecker::buildTypeRefinementContextHierarchy(*SF);
283-
}
279+
// Build the type refinement hierarchy for the primary
280+
// file before type checking.
281+
TypeChecker::buildTypeRefinementContextHierarchy(*SF);
284282

285283
// Type check the top-level elements of the source file.
286284
for (auto D : SF->getTopLevelDecls()) {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// RUN: %target-swift-frontend -emit-module %s -enable-library-evolution -swift-version 5 -module-name Library -emit-module-interface-path %t/Library.swiftinterface -o %t/Library.swiftmodule
2+
3+
// RUN: echo "import Library" > %t/Client.swift
4+
// RUN: %target-swift-frontend -emit-module %t/Client.swift -module-name Client -o %t/Client.swiftmodule -I %t
5+
6+
// RUN: rm %t/Library.swiftmodule
7+
// RUN: %target-sil-opt -enable-sil-verify-all %t/Client.swiftmodule -module-name Client
8+
9+
@available(*, unavailable)
10+
public struct Unavailable {}
11+
12+
@available(*, unavailable)
13+
public func usesUnavailable(_ u: Unavailable) {}

test/Sema/availability.swift

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,3 @@ struct DeferBody {
8686
// expected-error@-1 {{'No' is unavailable}}
8787
}
8888
}
89-
90-
struct NotP {}
91-
92-
protocol P {}
93-
94-
@available(*, unavailable)
95-
extension NotP: P {} // expected-note {{conformance of 'NotP' to 'P' has been explicitly marked unavailable here}}
96-
97-
@available(SwiftStdlib 5.1, *)
98-
func requireP() -> some P {
99-
NotP() // expected-error {{conformance of 'NotP' to 'P' is unavailable}}
100-
}

test/type/opaque_availability.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
1-
// RUN: %target-swift-frontend -parse-stdlib -target x86_64-apple-macosx10.9 -typecheck -verify %s
2-
// RUN: %target-swift-frontend -parse-stdlib -target x86_64-apple-macosx10.15 -typecheck %s
1+
// RUN: %target-swift-frontend -parse-stdlib -target x86_64-apple-macosx10.9 -typecheck %s -verify -verify-additional-prefix only-available-
2+
// RUN: %target-swift-frontend -parse-stdlib -target x86_64-apple-macosx10.15 -typecheck %s -verify
33
// REQUIRES: OS=macosx
44

55
protocol P {}
66
struct X: P {}
77

8-
func alwaysOpaque() -> some P { return X() } // expected-error{{'some' return types are only available}} expected-note{{add @available}}
8+
func alwaysOpaque() -> some P { return X() } // expected-only-available-error{{'some' return types are only available}} expected-only-available-note{{add @available}}
99

10-
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
10+
@available(SwiftStdlib 5.1, *)
1111
func sometimesOpaque() -> some P { return X() }
1212

13+
struct NotP {}
1314

15+
@available(*, unavailable)
16+
extension NotP: P {} // expected-note {{conformance of 'NotP' to 'P' has been explicitly marked unavailable here}}
17+
18+
@available(SwiftStdlib 5.1, *)
19+
func requireP() -> some P {
20+
NotP() // expected-error {{conformance of 'NotP' to 'P' is unavailable}}
21+
}

0 commit comments

Comments
 (0)