Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[Sema] Test explicit versions in TypeRefinementContext
  • Loading branch information
xymus committed Oct 9, 2020
1 parent e61ffea commit 53e04cb
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 44 deletions.
1 change: 1 addition & 0 deletions lib/AST/TypeRefinementContext.cpp
Expand Up @@ -300,6 +300,7 @@ void TypeRefinementContext::print(raw_ostream &OS, SourceManager &SrcMgr,
OS << "(" << getReasonName(getReason());

OS << " versions=" << AvailabilityInfo.getOSVersion().getAsString();
OS << " explicit=" << AvailabilityInfoExplicit.getOSVersion().getAsString();

if (getReason() == Reason::Decl) {
Decl *D = Node.getAsDecl();
Expand Down
129 changes: 85 additions & 44 deletions test/Sema/availability_refinement_contexts.swift
@@ -1,18 +1,18 @@
// RUN: %target-swift-frontend -typecheck -dump-type-refinement-contexts %s > %t.dump 2>&1
// RUN: %target-swift-frontend -typecheck -dump-type-refinement-contexts -target %target-cpu-apple-macosx10.50 %s > %t.dump 2>&1
// RUN: %FileCheck --strict-whitespace %s < %t.dump

// REQUIRES: OS=macosx

// CHECK: {{^}}(root versions=[10.{{[0-9]+}}.0,+Inf)
// CHECK: {{^}}(root versions=[10.50.0,+Inf) explicit=all

// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) decl=SomeClass
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) decl=someMethod()
// CHECK-NEXT: {{^}} (decl versions=[10.53,+Inf) decl=someInnerFunc()
// CHECK-NEXT: {{^}} (decl versions=[10.53,+Inf) decl=InnerClass
// CHECK-NEXT: {{^}} (decl versions=[10.54,+Inf) decl=innerClassMethod
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) decl=someStaticProperty
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) decl=someComputedProperty
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) decl=someOtherMethod()
// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) explicit=[10.51,+Inf) decl=SomeClass
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) explicit=[10.52,+Inf) decl=someMethod()
// CHECK-NEXT: {{^}} (decl versions=[10.53,+Inf) explicit=[10.53,+Inf) decl=someInnerFunc()
// CHECK-NEXT: {{^}} (decl versions=[10.53,+Inf) explicit=[10.53,+Inf) decl=InnerClass
// CHECK-NEXT: {{^}} (decl versions=[10.54,+Inf) explicit=[10.54,+Inf) decl=innerClassMethod
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) explicit=[10.52,+Inf) decl=someStaticProperty
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) explicit=[10.52,+Inf) decl=someComputedProperty
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) explicit=[10.52,+Inf) decl=someOtherMethod()
@available(OSX 10.51, *)
class SomeClass {
@available(OSX 10.52, *)
Expand Down Expand Up @@ -43,13 +43,13 @@ class SomeClass {
func someOtherMethod() { }
}

// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) decl=someFunction()
// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) explicit=[10.51,+Inf) decl=someFunction()
@available(OSX 10.51, *)
func someFunction() { }

// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) decl=SomeProtocol
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) decl=protoMethod()
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) decl=protoProperty
// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) explicit=[10.51,+Inf) decl=SomeProtocol
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) explicit=[10.52,+Inf) decl=protoMethod()
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) explicit=[10.52,+Inf) decl=protoProperty
@available(OSX 10.51, *)
protocol SomeProtocol {
@available(OSX 10.52, *)
Expand All @@ -59,26 +59,26 @@ protocol SomeProtocol {
var protoProperty: Int { get }
}

// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) decl=extension.SomeClass
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) decl=someExtensionFunction()
// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) explicit=[10.51,+Inf) decl=extension.SomeClass
// CHECK-NEXT: {{^}} (decl versions=[10.52,+Inf) explicit=[10.52,+Inf) decl=someExtensionFunction()
@available(OSX 10.51, *)
extension SomeClass {
@available(OSX 10.52, *)
func someExtensionFunction() { }
}

// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) decl=functionWithStmtCondition
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.52,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.53,+Inf)
// CHECK-NEXT: {{^}} (if_then versions=[10.53,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.54,+Inf)
// CHECK-NEXT: {{^}} (if_then versions=[10.54,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.55,+Inf)
// CHECK-NEXT: {{^}} (decl versions=[10.55,+Inf) decl=funcInGuardElse()
// CHECK-NEXT: {{^}} (guard_fallthrough versions=[10.55,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.56,+Inf)
// CHECK-NEXT: {{^}} (guard_fallthrough versions=[10.56,+Inf)
// CHECK-NEXT: {{^}} (decl versions=[10.57,+Inf) decl=funcInInnerIfElse()
// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) explicit=[10.51,+Inf) decl=functionWithStmtCondition
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.52,+Inf) explicit=[10.52,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.53,+Inf) explicit=[10.53,+Inf)
// CHECK-NEXT: {{^}} (if_then versions=[10.53,+Inf) explicit=[10.53,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.54,+Inf) explicit=[10.54,+Inf)
// CHECK-NEXT: {{^}} (if_then versions=[10.54,+Inf) explicit=[10.54,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.55,+Inf) explicit=[10.55,+Inf)
// CHECK-NEXT: {{^}} (decl versions=[10.55,+Inf) explicit=[10.55,+Inf) decl=funcInGuardElse()
// CHECK-NEXT: {{^}} (guard_fallthrough versions=[10.55,+Inf) explicit=[10.55,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.56,+Inf) explicit=[10.56,+Inf)
// CHECK-NEXT: {{^}} (guard_fallthrough versions=[10.56,+Inf) explicit=[10.56,+Inf)
// CHECK-NEXT: {{^}} (decl versions=[10.57,+Inf) explicit=[10.57,+Inf) decl=funcInInnerIfElse()
@available(OSX 10.51, *)
func functionWithStmtCondition() {
if #available(OSX 10.52, *),
Expand All @@ -97,11 +97,11 @@ func functionWithStmtCondition() {
}
}

// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) decl=functionWithUnnecessaryStmtCondition
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.53,+Inf)
// CHECK-NEXT: {{^}} (if_then versions=[10.53,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.54,+Inf)
// CHECK-NEXT: {{^}} (if_then versions=[10.54,+Inf)
// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) explicit=[10.51,+Inf) decl=functionWithUnnecessaryStmtCondition
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.53,+Inf) explicit=[10.53,+Inf)
// CHECK-NEXT: {{^}} (if_then versions=[10.53,+Inf) explicit=[10.53,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.54,+Inf) explicit=[10.54,+Inf)
// CHECK-NEXT: {{^}} (if_then versions=[10.54,+Inf) explicit=[10.54,+Inf)

@available(OSX 10.51, *)
func functionWithUnnecessaryStmtCondition() {
Expand All @@ -127,13 +127,13 @@ func functionWithUnnecessaryStmtCondition() {
}
}

// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) decl=functionWithUnnecessaryStmtConditionsHavingElseBranch
// CHECK-NEXT: {{^}} (if_else versions=empty
// CHECK-NEXT: {{^}} (decl versions=empty decl=funcInInnerIfElse()
// CHECK-NEXT: {{^}} (if_else versions=empty
// CHECK-NEXT: {{^}} (guard_else versions=empty
// CHECK-NEXT: {{^}} (guard_else versions=empty
// CHECK-NEXT: {{^}} (if_else versions=empty
// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) explicit=[10.51,+Inf) decl=functionWithUnnecessaryStmtConditionsHavingElseBranch
// CHECK-NEXT: {{^}} (if_else versions=empty explicit=empty
// CHECK-NEXT: {{^}} (decl versions=empty explicit=empty decl=funcInInnerIfElse()
// CHECK-NEXT: {{^}} (if_else versions=empty explicit=empty
// CHECK-NEXT: {{^}} (guard_else versions=empty explicit=empty
// CHECK-NEXT: {{^}} (guard_else versions=empty explicit=empty
// CHECK-NEXT: {{^}} (if_else versions=empty explicit=empty

@available(OSX 10.51, *)
func functionWithUnnecessaryStmtConditionsHavingElseBranch(p: Int?) {
Expand Down Expand Up @@ -180,10 +180,10 @@ func functionWithUnnecessaryStmtConditionsHavingElseBranch(p: Int?) {

}

// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) decl=functionWithWhile()
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.52,+Inf)
// CHECK-NEXT: {{^}} (while_body versions=[10.52,+Inf)
// CHECK-NEXT: {{^}} (decl versions=[10.54,+Inf) decl=funcInWhileBody()
// CHECK-NEXT: {{^}} (decl versions=[10.51,+Inf) explicit=[10.51,+Inf) decl=functionWithWhile()
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.52,+Inf) explicit=[10.52,+Inf)
// CHECK-NEXT: {{^}} (while_body versions=[10.52,+Inf) explicit=[10.52,+Inf)
// CHECK-NEXT: {{^}} (decl versions=[10.54,+Inf) explicit=[10.54,+Inf) decl=funcInWhileBody()
@available(OSX 10.51, *)
func functionWithWhile() {
while #available(OSX 10.52, *),
Expand All @@ -192,3 +192,44 @@ func functionWithWhile() {
func funcInWhileBody() { }
}
}

// CHECK-NEXT: {{^}} (decl versions=[10.50.0,+Inf) explicit=[10.10,+Inf) decl=olderFunction()
@available(macOS 10.10, *)
public func olderFunction() {
}

// CHECK-NEXT: {{^}} (decl versions=[10.10,+Inf) explicit=[10.10,+Inf) decl=inlinableFunction()
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.55,+Inf) explicit=[10.55,+Inf)
// CHECK-NEXT: {{^}} (if_then versions=[10.55,+Inf) explicit=[10.55,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.15,+Inf)
// CHECK-NEXT: {{^}} (if_then versions=[10.15,+Inf) explicit=[10.15,+Inf)
// CHECK-NEXT: {{^}} (condition_following_availability versions=[10.15,+Inf) explicit=[10.15,+Inf)
// CHECK-NEXT: {{^}} (guard_fallthrough versions=[10.15,+Inf) explicit=[10.15,+Inf)
@available(macOS 10.10, *)
@inlinable
public func inlinableFunction() {
if #available(macOS 10.55, *) { } else { }

if #available(macOS 10.15, *) { }

guard #available(macOS 10.15, *) else { }

func nestedFunc() { }
}

// CHECK-NEXT: {{^}} (decl versions=[10.50.0,+Inf) explicit=[10.10,+Inf) decl=SomeOlderClass
// CHECK-NEXT: {{^}} (decl versions=[10.10,+Inf) explicit=[10.10,+Inf) decl=someInlinableMethod()
// CHECK-NEXT: {{^}} (decl versions=[10.15,+Inf) explicit=[10.15,+Inf) decl=someOtherInlinableMethod()
// CHECK-NEXT: {{^}} (decl versions=[10.50.0,+Inf) explicit=[10.15,+Inf) decl=someMethod()
@available(OSX 10.10, *)
class SomeOlderClass {
@inlinable
func someInlinableMethod() { }

@available(OSX 10.15, *)
@inlinable
func someOtherInlinableMethod() { }

@available(OSX 10.15, *)
func someMethod() { }
}

0 comments on commit 53e04cb

Please sign in to comment.