From 53e04cb39db86d890ff674b775a5dbda47e9d599 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Laferrie=CC=80re?= Date: Tue, 1 Sep 2020 14:09:02 -0700 Subject: [PATCH] [Sema] Test explicit versions in TypeRefinementContext --- lib/AST/TypeRefinementContext.cpp | 1 + .../availability_refinement_contexts.swift | 129 ++++++++++++------ 2 files changed, 86 insertions(+), 44 deletions(-) diff --git a/lib/AST/TypeRefinementContext.cpp b/lib/AST/TypeRefinementContext.cpp index 758c6825f3d86..3fe283bebd896 100644 --- a/lib/AST/TypeRefinementContext.cpp +++ b/lib/AST/TypeRefinementContext.cpp @@ -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(); diff --git a/test/Sema/availability_refinement_contexts.swift b/test/Sema/availability_refinement_contexts.swift index 088a644384ff6..818b9b969bd74 100644 --- a/test/Sema/availability_refinement_contexts.swift +++ b/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, *) @@ -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, *) @@ -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, *), @@ -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() { @@ -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?) { @@ -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, *), @@ -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() { } +}