Skip to content

Commit 00ed470

Browse files
committed
GSB: Replace RequirementSource::Derived with ::Layout
'Derived' was not a great name, since we already use the term 'derived requirement source' to mean something else. A Derived source was only added in one place, when recording a superclass constraint -- the idea is that this source supercedes any explicit layout constraint, eg class SomeClass {} func foo<T>(_: T) where T : SomeClass, T : AnyObject {} Here we have two sources for the 'T : AnyObject' layout constraint: Explicit: T Explicit: T -> Derived Note that the 'Derived' requirement source does not store a 'proof' -- we can't figure out _how_ we determined that the explicit 'T : AnyObject' constraint is redundant here. In the case where a superclass requirement makes a protocol conformance redundant, we do have a 'proof', because the 'Superclass' requirement source stores a conformance: class SomeClass : SomeProto {} func foo<T>(_: T) where T : SomeClass, T : SomeProto {} Explicit: T Explicit: T -> Superclass: [SomeClass : P] From looking at the second requirement source, we can determine that the requirement was imposed by the explicit constraint 'T : SomeClass'. For the 'Layout' requirement source, there's not really a "conformance", so we can just store the superclass type: Explicit: T Explicit: T -> Layout: SomeClass
1 parent f8b293e commit 00ed470

File tree

2 files changed

+39
-42
lines changed

2 files changed

+39
-42
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -886,9 +886,12 @@ class GenericSignatureBuilder::RequirementSource final
886886
/// requirement.
887887
Concrete,
888888

889-
/// A requirement that was resolved based on structural derivation from
890-
/// another requirement.
891-
Derived,
889+
/// A requirement that was resolved based on a layout requirement
890+
/// imposed by a superclass constraint.
891+
///
892+
/// This stores the \c LayoutConstraint used to resolve the
893+
/// requirement.
894+
Layout,
892895

893896
/// A requirement that was provided for another type in the
894897
/// same equivalence class, but which we want to "re-root" on a new
@@ -944,7 +947,7 @@ class GenericSignatureBuilder::RequirementSource final
944947
case Superclass:
945948
case Parent:
946949
case Concrete:
947-
case Derived:
950+
case Layout:
948951
case EquivalentType:
949952
return 0;
950953
}
@@ -989,7 +992,7 @@ class GenericSignatureBuilder::RequirementSource final
989992
case Superclass:
990993
case Parent:
991994
case Concrete:
992-
case Derived:
995+
case Layout:
993996
case EquivalentType:
994997
return false;
995998
}
@@ -1141,17 +1144,18 @@ class GenericSignatureBuilder::RequirementSource final
11411144
GenericSignatureBuilder &builder,
11421145
ProtocolConformanceRef conformance) const;
11431146

1147+
/// A constraint source that describes a layout constraint that was implied
1148+
/// by a superclass requirement.
1149+
const RequirementSource *viaLayout(GenericSignatureBuilder &builder,
1150+
Type superclass) const;
1151+
11441152
/// A constraint source that describes that a constraint that is resolved
11451153
/// for a nested type via a constraint on its parent.
11461154
///
11471155
/// \param assocType the associated type that
11481156
const RequirementSource *viaParent(GenericSignatureBuilder &builder,
11491157
AssociatedTypeDecl *assocType) const;
11501158

1151-
/// A constraint source that describes a constraint that is structurally
1152-
/// derived from another constraint but does not require further information.
1153-
const RequirementSource *viaDerived(GenericSignatureBuilder &builder) const;
1154-
11551159
/// A constraint source that describes a constraint that is structurally
11561160
/// derived from another constraint but does not require further information.
11571161
const RequirementSource *viaEquivalentType(GenericSignatureBuilder &builder,

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,7 @@ bool RequirementSource::isAcceptableStorageKind(Kind kind,
555555
case NestedTypeNameMatch:
556556
case ConcreteTypeBinding:
557557
case EquivalentType:
558+
case Layout:
558559
switch (storageKind) {
559560
case StorageKind::StoredType:
560561
return true;
@@ -599,17 +600,6 @@ bool RequirementSource::isAcceptableStorageKind(Kind kind,
599600
case StorageKind::None:
600601
return false;
601602
}
602-
603-
case Derived:
604-
switch (storageKind) {
605-
case StorageKind::None:
606-
return true;
607-
608-
case StorageKind::StoredType:
609-
case StorageKind::ProtocolConformance:
610-
case StorageKind::AssociatedTypeDecl:
611-
return false;
612-
}
613603
}
614604

615605
llvm_unreachable("Unhandled RequirementSourceKind in switch.");
@@ -669,7 +659,7 @@ bool RequirementSource::isInferredRequirement() const {
669659
case ProtocolRequirement:
670660
case RequirementSignatureSelf:
671661
case Superclass:
672-
case Derived:
662+
case Layout:
673663
break;
674664
}
675665
}
@@ -695,7 +685,7 @@ bool RequirementSource::isDerivedRequirement() const {
695685
case Superclass:
696686
case Concrete:
697687
case RequirementSignatureSelf:
698-
case Derived:
688+
case Layout:
699689
case EquivalentType:
700690
return true;
701691

@@ -879,7 +869,7 @@ const RequirementSource *RequirementSource::getMinimalConformanceSource(
879869

880870
case Concrete:
881871
case Superclass:
882-
case Derived:
872+
case Layout:
883873
case EquivalentType:
884874
return false;
885875

@@ -1077,11 +1067,13 @@ const RequirementSource *RequirementSource::viaParent(
10771067
0, WrittenRequirementLoc());
10781068
}
10791069

1080-
const RequirementSource *RequirementSource::viaDerived(
1081-
GenericSignatureBuilder &builder) const {
1070+
const RequirementSource *RequirementSource::viaLayout(
1071+
GenericSignatureBuilder &builder,
1072+
Type superclass) const {
10821073
REQUIREMENT_SOURCE_FACTORY_BODY(
1083-
(nodeID, Derived, this, nullptr, nullptr, nullptr),
1084-
(Derived, this),
1074+
(nodeID, Layout, this, superclass.getPointer(),
1075+
nullptr, nullptr),
1076+
(Layout, this, superclass),
10851077
0, WrittenRequirementLoc());
10861078
}
10871079

@@ -1142,9 +1134,9 @@ const RequirementSource *RequirementSource::withoutRedundantSubpath(
11421134
return parent->withoutRedundantSubpath(builder, start, end)
11431135
->viaConcrete(builder, getProtocolConformance());
11441136

1145-
case Derived:
1137+
case Layout:
11461138
return parent->withoutRedundantSubpath(builder, start, end)
1147-
->viaDerived(builder);
1139+
->viaLayout(builder, getStoredType());
11481140

11491141
case EquivalentType:
11501142
return parent->withoutRedundantSubpath(builder, start, end)
@@ -1211,7 +1203,7 @@ RequirementSource::visitPotentialArchetypesAlongPath(
12111203

12121204
case RequirementSource::Concrete:
12131205
case RequirementSource::Superclass:
1214-
case RequirementSource::Derived:
1206+
case RequirementSource::Layout:
12151207
return parent->visitPotentialArchetypesAlongPath(visitor);
12161208

12171209
case RequirementSource::EquivalentType: {
@@ -1392,8 +1384,8 @@ void RequirementSource::print(llvm::raw_ostream &out,
13921384
out << "Superclass";
13931385
break;
13941386

1395-
case Derived:
1396-
out << "Derived";
1387+
case Layout:
1388+
out << "Layout";
13971389
break;
13981390

13991391
case EquivalentType:
@@ -1566,7 +1558,7 @@ bool FloatingRequirementSource::isExplicit() const {
15661558
case RequirementSource::ProtocolRequirement:
15671559
case RequirementSource::InferredProtocolRequirement:
15681560
case RequirementSource::Superclass:
1569-
case RequirementSource::Derived:
1561+
case RequirementSource::Layout:
15701562
case RequirementSource::EquivalentType:
15711563
return false;
15721564
}
@@ -1588,7 +1580,7 @@ bool FloatingRequirementSource::isExplicit() const {
15881580
case RequirementSource::ConcreteTypeBinding:
15891581
case RequirementSource::Parent:
15901582
case RequirementSource::Superclass:
1591-
case RequirementSource::Derived:
1583+
case RequirementSource::Layout:
15921584
case RequirementSource::EquivalentType:
15931585
return false;
15941586
}
@@ -4278,14 +4270,15 @@ bool GenericSignatureBuilder::updateSuperclass(
42784270
// Presence of a superclass constraint implies a _Class layout
42794271
// constraint.
42804272
auto layoutReqSource =
4281-
source.getSource(*this, type)->viaDerived(*this);
4282-
addLayoutRequirementDirect(type,
4283-
LayoutConstraint::getLayoutConstraint(
4284-
superclass->getClassOrBoundGenericClass()->isObjC()
4285-
? LayoutConstraintKind::Class
4286-
: LayoutConstraintKind::NativeClass,
4287-
getASTContext()),
4288-
layoutReqSource);
4273+
source.getSource(*this, type)->viaLayout(*this, superclass);
4274+
4275+
auto layout =
4276+
LayoutConstraint::getLayoutConstraint(
4277+
superclass->getClassOrBoundGenericClass()->isObjC()
4278+
? LayoutConstraintKind::Class
4279+
: LayoutConstraintKind::NativeClass,
4280+
getASTContext());
4281+
addLayoutRequirementDirect(type, layout, layoutReqSource);
42894282
return true;
42904283
}
42914284

0 commit comments

Comments
 (0)