Files
swift-mirror/test/Serialization/Safety/unsafe-decls.swift
Alexis Laferrière 9602df1e83 [Serialization] Keep indirect conformances knowledge with safety
Given a scenario where a public type A, conforms to an internal protocol
B, which conforms to a public protocol C. A conforms indirectly to C
through a protocol that's hidden from the clients.

This is handled in module interface by printing the indirect conformance
of A to C explicitly at the end of the swiftinterface.

We have the same problem with deserialization safety that used to hide
the internal protocols from clients, thus breaking the knowledge of the
indirect dependency. To keep the indirect conformances, let's consider
all protocols as safe and preserve their conformance information.

rdar://105241772
2023-04-18 14:10:06 -07:00

106 lines
4.4 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, safe: 'InternalProto'
// NO-SAFETY-INTERNAL: Serialization safety, safe: 'InternalProto'
private protocol PrivateProto {}
// SAFETY-PRIVATE: Serialization safety, safe: 'PrivateProto'
fileprivate protocol FileprivateProto {}
// SAFETY-PRIVATE: Serialization safety, safe: '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() {
typealias localTypealias = Int
}
// SAFETY-PRIVATE: Serialization safety, safe: 'inlinableFunc()'
public func publicFunc() {}
// SAFETY-PRIVATE: Serialization safety, safe: 'publicFunc()'
@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'
}