| // RUN: %target-typecheck-verify-swift -target x86_64-apple-macosx10.52 |
| |
| // RUN: %target-swift-emit-silgen -target x86_64-apple-macosx10.52 -emit-sorted-sil -o %t.fragile.sil %s |
| // RUN: %FileCheck %s < %t.fragile.sil |
| // RUN: %FileCheck -check-prefix NEGATIVE %s < %t.fragile.sil |
| |
| // RUN: %target-swift-emit-silgen -target x86_64-apple-macosx10.52 -emit-sorted-sil -enable-library-evolution -o %t.resilient.sil %s |
| // RUN: %FileCheck %s < %t.resilient.sil |
| // RUN: %FileCheck -check-prefix NEGATIVE %s < %t.resilient.sil |
| |
| // This test just requires a platform with meaningful #available() checks, but |
| // for simplicity, it's written for macOS only. |
| // REQUIRES: OS=macosx |
| |
| public enum E: Int { |
| // For some reason, we generate strange SIL for the first case that's |
| // difficult to validate. This just gets that out of the way. |
| case sacrificial = -500 |
| |
| case normal = -1000 |
| |
| @available(macOS 10.51, *) |
| case alwaysAvailable = -2000 |
| |
| @available(macOS 10.55, *) |
| case potentiallyUnavailable = -3000 |
| |
| @available(macOS, unavailable) |
| case neverAvailable = -4000 |
| |
| @available(macOS, obsoleted: 10.99) |
| case notObsoleteYet = -5000 |
| |
| @available(macOS, obsoleted: 10.51) |
| case nowObsolete = -6000 |
| } |
| |
| // CHECK-LABEL: sil {{(\[serialized\] )?}}[ossa] @$s4main1EO8rawValueACSgSi_tcfC |
| |
| // CHECK: integer_literal $Builtin.IntLiteral, -1000 |
| // CHECK: cond_br {{[^,]+}}, [[normal:bb[0-9]+]] |
| |
| // CHECK: integer_literal $Builtin.IntLiteral, -2000 |
| // CHECK: cond_br {{[^,]+}}, [[alwaysAvailable:bb[0-9]+]] |
| |
| // CHECK: integer_literal $Builtin.IntLiteral, -3000 |
| // CHECK: cond_br {{[^,]+}}, [[potentiallyUnavailable:bb[0-9]+]] |
| |
| // CHECK: integer_literal $Builtin.IntLiteral, -5000 |
| // CHECK: cond_br {{[^,]+}}, [[notObsoleteYet:bb[0-9]+]] |
| |
| // CHECK: [[notObsoleteYet]]: |
| // CHECK-NOT: function_ref @$ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF |
| // CHECK: {{enum \$E|inject_enum_addr %[0-9]+ : \$\*E}}, #E.notObsoleteYet!enumelt |
| |
| // CHECK: [[potentiallyUnavailable]]: |
| // CHECK-NEXT: integer_literal $Builtin.Word, 10 |
| // CHECK-NEXT: integer_literal $Builtin.Word, 55 |
| // CHECK-NEXT: integer_literal $Builtin.Word, 0 |
| // CHECK: function_ref @$ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF |
| // CHECK: cond_br {{[^,]+}}, [[potentiallyUnavailable_newEnough:bb[0-9]+]], |
| |
| // CHECK: [[potentiallyUnavailable_newEnough]]: |
| // CHECK: {{enum \$E|inject_enum_addr %[0-9]+ : \$\*E}}, #E.potentiallyUnavailable!enumelt |
| |
| // CHECK: [[alwaysAvailable]]: |
| // CHECK-NOT: function_ref @$ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF |
| // CHECK: {{enum \$E|inject_enum_addr %[0-9]+ : \$\*E}}, #E.alwaysAvailable!enumelt |
| |
| // CHECK: [[normal]]: |
| // CHECK-NOT: function_ref @$ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF |
| // CHECK: {{enum \$E|inject_enum_addr %[0-9]+ : \$\*E}}, #E.normal!enumelt |
| |
| // CHECK: end sil function '$s4main1EO8rawValueACSgSi_tcfC' |
| |
| // CHECK-LABEL: sil {{(\[serialized\] )?}}[ossa] @$s4main1EO8rawValueSivg |
| // CHECK: {{switch_enum %0 : \$E|switch_enum_addr %2 : \$\*E}} |
| // CHECK-NOT: function_ref @$ss26_stdlib_isOSVersionAtLeastyBi1_Bw_BwBwtF |
| // CHECK: end sil function '$s4main1EO8rawValueSivg' |
| |
| // NEGATIVE-LABEL: sil {{(\[serialized\] )?}}[ossa] @$s4main1EO8rawValueACSgSi_tcfC |
| |
| // Should not try to match neverAvailable's raw value |
| // NEGATIVE-NOT: integer_literal $Builtin.IntLiteral, -4000 |
| |
| // Should not try to match nowObsolete's raw value |
| // NEGATIVE-NOT: integer_literal $Builtin.IntLiteral, -6000 |
| |
| // Should not have a version check for notObsoleteYet |
| // NEGATIVE-NOT: integer_literal $Builtin.Word, 99 |
| |
| // NEGATIVE: end sil function '$s4main1EO8rawValueACSgSi_tcfC' |