mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Centralize the exportability checking logic for nested functions in the `DeclExportabilityVisitor` utility. This logic was previously added to SILGen but there should not be special casing for nested functions at that layer.
115 lines
4.7 KiB
Swift
115 lines
4.7 KiB
Swift
// RUN: %empty-directory(%t)
|
|
|
|
// REQUIRES: asserts
|
|
|
|
// RUN: %target-swift-frontend -emit-module %s \
|
|
// RUN: -enable-library-evolution -swift-version 5 \
|
|
// RUN: -enable-deserialization-safety \
|
|
// RUN: -Xllvm -debug-only=Serialization 2>&1 | %swift-demangle --simplified \
|
|
// RUN: | %FileCheck --check-prefixes=SAFETY-PRIVATE,SAFETY-INTERNAL %s
|
|
|
|
// RUN: %target-swift-frontend -emit-module %s \
|
|
// RUN: -enable-library-evolution -swift-version 5 \
|
|
// RUN: -enable-deserialization-safety \
|
|
// RUN: -Xllvm -debug-only=Serialization \
|
|
// RUN: -enable-testing 2>&1 \
|
|
// RUN: | %FileCheck --check-prefixes=DISABLED %s
|
|
|
|
/// Don't mark decls as unsafe when private import is enabled.
|
|
// RUN: %target-swift-frontend -emit-module %s \
|
|
// RUN: -enable-library-evolution -swift-version 5 \
|
|
// RUN: -enable-deserialization-safety \
|
|
// RUN: -Xllvm -debug-only=Serialization \
|
|
// RUN: -enable-private-imports 2>&1 \
|
|
// RUN: | %FileCheck --check-prefixes=DISABLED %s
|
|
|
|
/// Don't mark decls as unsafe without library evolution.
|
|
// RUN: %target-swift-frontend -emit-module %s \
|
|
// RUN: -enable-deserialization-safety -swift-version 5 \
|
|
// RUN: -Xllvm -debug-only=Serialization 2>&1 \
|
|
// RUN: | %FileCheck --check-prefixes=DISABLED %s
|
|
|
|
// DISABLED-NOT: Serialization safety
|
|
|
|
public protocol PublicProto {}
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'PublicProto'
|
|
internal protocol InternalProto {}
|
|
// SAFETY-INTERNAL: Serialization safety, unsafe: 'InternalProto'
|
|
// NO-SAFETY-INTERNAL: Serialization safety, unsafe: 'InternalProto'
|
|
private protocol PrivateProto {}
|
|
// SAFETY-PRIVATE: Serialization safety, unsafe: 'PrivateProto'
|
|
fileprivate protocol FileprivateProto {}
|
|
// SAFETY-PRIVATE: Serialization safety, unsafe: 'FileprivateProto'
|
|
|
|
internal struct InternalStruct : PublicProto {
|
|
// SAFETY-INTERNAL: Serialization safety, unsafe: 'InternalStruct'
|
|
// NO-SAFETY-INTERNAL: Serialization safety, safe: 'InternalStruct'
|
|
}
|
|
|
|
public struct PublicStruct {
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'PublicStruct'
|
|
|
|
public typealias publicTypealias = Int
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'publicTypealias'
|
|
typealias internalTypealias = Int
|
|
// SAFETY-INTERNAL: Serialization safety, unsafe: 'internalTypealias'
|
|
// NO-SAFETY-INTERNAL: Serialization safety, safe: 'internalTypealias'
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'localTypealias'
|
|
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'opaque PublicStruct.opaqueTypeFunc()'
|
|
// SAFETY-PRIVATE: Serialization safety, unsafe: 'opaque PublicStruct.opaqueFuncInternal()'
|
|
|
|
public init(publicInit a: Int) {}
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'init(publicInit:)'
|
|
internal init(internalInit a: Int) {}
|
|
// SAFETY-INTERNAL: Serialization safety, unsafe: 'init(internalInit:)'
|
|
// NO-SAFETY-INTERNAL: Serialization safety, safe: 'init(internalInit:)'
|
|
private init(privateInit a: Int) {}
|
|
// SAFETY-PRIVATE: Serialization safety, unsafe: 'init(privateInit:)'
|
|
fileprivate init(fileprivateInit a: Int) {}
|
|
// SAFETY-PRIVATE: Serialization safety, unsafe: 'init(fileprivateInit:)'
|
|
|
|
@inlinable public func inlinableFunc() {
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'inlinableFunc()'
|
|
typealias localTypealias = Int
|
|
|
|
func inlinableFunc_nested() {}
|
|
// SAFETY-PRIVATE-NOT: inlinableFunc_nested()
|
|
inlinableFunc_nested()
|
|
}
|
|
|
|
public func publicFunc() {
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'publicFunc()'
|
|
func publicFunc_nested() {}
|
|
// SAFETY-PRIVATE-NOT: publicFunc_nested()
|
|
publicFunc_nested()
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *) // for the `some` keyword.
|
|
public func opaqueTypeFunc() -> some PublicProto {
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'opaqueTypeFunc()'
|
|
return InternalStruct()
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *) // for the `some` keyword.
|
|
internal func opaqueFuncInternal() -> some PublicProto {
|
|
// SAFETY-PRIVATE: Serialization safety, unsafe: 'opaqueFuncInternal()'
|
|
return InternalStruct()
|
|
}
|
|
|
|
internal func internalFunc() {}
|
|
// SAFETY-INTERNAL: Serialization safety, unsafe: 'internalFunc()'
|
|
// NO-SAFETY-INTERNAL: Serialization safety, safe: 'internalFunc()'
|
|
private func privateFunc() {}
|
|
// SAFETY-PRIVATE: Serialization safety, unsafe: 'privateFunc()'
|
|
fileprivate func fileprivateFunc() {}
|
|
// SAFETY-PRIVATE: Serialization safety, unsafe: 'fileprivateFunc()'
|
|
|
|
public var publicProperty = "Some text"
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'publicProperty'
|
|
public private(set) var halfPublicProperty = "Some text"
|
|
// SAFETY-PRIVATE: Serialization safety, safe: 'halfPublicProperty'
|
|
private var privateProperty = "Some text"
|
|
// SAFETY-PRIVATE: Serialization safety, unsafe: 'privateProperty'
|
|
}
|