Skip to content

Commit 6400a29

Browse files
authored
Merge pull request #70227 from simanerush/same-element-requirements
[Requirement Machine] Implement same-element requirements.
2 parents 194d7cf + 0dc6719 commit 6400a29

27 files changed

+223
-28
lines changed

include/swift/Basic/Features.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ EXPERIMENTAL_FEATURE(CodeItemMacros, false)
231231
EXPERIMENTAL_FEATURE(PreambleMacros, false)
232232
EXPERIMENTAL_FEATURE(TupleConformances, false)
233233
EXPERIMENTAL_FEATURE(FullTypedThrows, false)
234+
EXPERIMENTAL_FEATURE(SameElementRequirements, false)
234235

235236
// Whether to enable @_used and @_section attributes
236237
EXPERIMENTAL_FEATURE(SymbolLinkageMarkers, true)

lib/AST/ASTPrinter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,6 +2022,9 @@ void PrintAST::printRequirement(const Requirement &req) {
20222022
SmallVector<Type, 2> rootParameterPacks;
20232023
getTransformedType(req.getFirstType())
20242024
->getTypeParameterPacks(rootParameterPacks);
2025+
if (req.getKind() != RequirementKind::Layout)
2026+
getTransformedType(req.getSecondType())
2027+
->getTypeParameterPacks(rootParameterPacks);
20252028
bool isPackRequirement = !rootParameterPacks.empty();
20262029

20272030
switch (req.getKind()) {

lib/AST/FeatureSet.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ UNINTERESTING_FEATURE(StaticExclusiveOnly)
134134
UNINTERESTING_FEATURE(ExtractConstantsFromMembers)
135135
UNINTERESTING_FEATURE(FixedArrays)
136136
UNINTERESTING_FEATURE(GroupActorErrors)
137+
UNINTERESTING_FEATURE(SameElementRequirements)
137138

138139
static bool usesFeatureSendingArgsAndResults(Decl *decl) {
139140
auto isFunctionTypeWithSending = [](Type type) {

lib/AST/GenericEnvironment.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,16 @@ struct FindElementArchetypeForOpenedPackParam {
181181
: findElementParam(env, openedPacks), getElementArchetype(env) {}
182182

183183

184-
ElementArchetypeType *operator()(Type interfaceType) {
184+
Type operator()(Type interfaceType) {
185185
assert(interfaceType->isTypeParameter());
186186
if (auto member = interfaceType->getAs<DependentMemberType>()) {
187-
auto baseArchetype = (*this)(member->getBase());
187+
auto baseArchetype = (*this)(member->getBase())
188+
->castTo<ElementArchetypeType>();
188189
return baseArchetype->getNestedType(member->getAssocType())
189190
->castTo<ElementArchetypeType>();
190191
}
191192
assert(interfaceType->is<GenericTypeParamType>());
192-
return getElementArchetype(findElementParam(interfaceType))
193-
->castTo<ElementArchetypeType>();
193+
return getElementArchetype(findElementParam(interfaceType));
194194
}
195195
};
196196

lib/AST/GenericSignature.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,7 @@ void GenericSignature::verify(ArrayRef<Requirement> reqts) const {
936936
llvm::errs() << "\n";
937937
dumpAndAbort();
938938
}
939+
939940
if (compareDependentTypes(firstType, secondType) >= 0) {
940941
llvm::errs() << "Out-of-order type parameters: ";
941942
reqt.dump(llvm::errs());

lib/AST/RequirementMachine/GenericSignatureQueries.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ RequirementMachine::getLongestValidPrefix(const MutableTerm &term) const {
281281
case Symbol::Kind::ConcreteType:
282282
case Symbol::Kind::ConcreteConformance:
283283
case Symbol::Kind::Shape:
284+
case Symbol::Kind::PackElement:
284285
llvm::errs() <<"Invalid symbol in a type term: " << term << "\n";
285286
abort();
286287
}
@@ -804,6 +805,7 @@ void RequirementMachine::verify(const MutableTerm &term) const {
804805
switch (symbol.getKind()) {
805806
case Symbol::Kind::Protocol:
806807
case Symbol::Kind::GenericParam:
808+
case Symbol::Kind::PackElement:
807809
erased.add(symbol);
808810
continue;
809811

@@ -843,6 +845,7 @@ void RequirementMachine::verify(const MutableTerm &term) const {
843845
case Symbol::Kind::Superclass:
844846
case Symbol::Kind::ConcreteType:
845847
case Symbol::Kind::ConcreteConformance:
848+
case Symbol::Kind::PackElement:
846849
llvm::errs() << "Bad interior symbol " << symbol << " in " << term << "\n";
847850
abort();
848851
break;

lib/AST/RequirementMachine/HomotopyReduction.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,8 @@ RewriteSystem::getMinimizedGenericSignatureRules() const {
691691
continue;
692692
}
693693

694-
if (rule.getLHS()[0].getKind() != Symbol::Kind::GenericParam)
694+
if (rule.getLHS()[0].getKind() != Symbol::Kind::PackElement &&
695+
rule.getLHS()[0].getKind() != Symbol::Kind::GenericParam)
695696
continue;
696697

697698
rules.push_back(ruleID);

lib/AST/RequirementMachine/InterfaceType.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,9 @@ getTypeForSymbolRange(const Symbol *begin, const Symbol *end,
298298
// member type rooted at Self; handle the associated type below.
299299
break;
300300

301+
case Symbol::Kind::PackElement:
302+
continue;
303+
301304
case Symbol::Kind::Name:
302305
case Symbol::Kind::Layout:
303306
case Symbol::Kind::Superclass:

lib/AST/RequirementMachine/MinimalConformances.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ static const ProtocolDecl *getParentConformanceForTerm(Term lhs) {
287287
case Symbol::Kind::ConcreteType:
288288
case Symbol::Kind::ConcreteConformance:
289289
case Symbol::Kind::Shape:
290+
case Symbol::Kind::PackElement:
290291
break;
291292
}
292293

@@ -553,6 +554,7 @@ void RewriteSystem::computeCandidateConformancePaths(
553554
//
554555
// where Y is the simplified form of X.W.
555556
} else if (rhs.isAnyConformanceRule() &&
557+
!lhs.isSameElementRule() &&
556558
(unsigned)(lhs.getLHS().end() - from) < rhs.getLHS().size()) {
557559
if (Debug.contains(DebugFlags::MinimalConformancesDetail)) {
558560
llvm::dbgs() << "Case 2: same-type suffix\n";

lib/AST/RequirementMachine/PropertyUnification.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@ void PropertyMap::addProperty(
669669
case Symbol::Kind::GenericParam:
670670
case Symbol::Kind::AssociatedType:
671671
case Symbol::Kind::Shape:
672+
case Symbol::Kind::PackElement:
672673
break;
673674
}
674675

0 commit comments

Comments
 (0)