Skip to content

Commit 3097919

Browse files
committed
[Serialization] Write ProtocolComposition as dependencies
A type dependencies are used at deserialization to drop a protocol early when a dependency is not deserializable. Dependencies on protocols via a protocol composition were not taken into account. This lead to the deserialization process failing later. Fix the serialization process to write protocol dependencies too. rdar://78631465
1 parent c035022 commit 3097919

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

lib/Serialization/Serialization.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3511,7 +3511,9 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
35113511
for (auto element : proto->getInherited()) {
35123512
auto elementType = element.getType();
35133513
assert(!elementType || !elementType->hasArchetype());
3514-
if (elementType && elementType->is<ProtocolType>())
3514+
if (elementType &&
3515+
(elementType->is<ProtocolType>() ||
3516+
elementType->is<ProtocolCompositionType>()))
35153517
dependencyTypes.insert(elementType);
35163518
}
35173519

test/Serialization/Recovery/implementation-only-missing.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public protocol HiddenProtocol {
4343
associatedtype Value
4444
}
4545

46+
public protocol HiddenProtocol2 {}
47+
4648
public protocol HiddenProtocolWithOverride {
4749
func hiddenOverride()
4850
}
@@ -98,6 +100,15 @@ public class SomeClass {
98100
func funcUsingIoiType(_ a: HiddenClass) {}
99101
}
100102

103+
// Check that we recover from a reference to an implementation-only
104+
// imported type in a protocol composition. rdar://78631465
105+
protocol CompositionMemberInheriting : HiddenProtocol2 {}
106+
protocol CompositionMemberSimple {}
107+
protocol InheritingFromComposition : CompositionMemberInheriting & CompositionMemberSimple {}
108+
struct StructInheritingFromComposition : CompositionMemberInheriting & CompositionMemberSimple {}
109+
class ClassInheritingFromComposition : CompositionMemberInheriting & CompositionMemberSimple {}
110+
protocol InheritingFromCompositionDirect : CompositionMemberSimple & HiddenProtocol2 {}
111+
101112
#elseif CLIENT_APP
102113

103114
import public_lib

0 commit comments

Comments
 (0)