Skip to content

Commit c481769

Browse files
authored
Merge pull request #80281 from slavapestov/rdar136686001
RequirementMachine: Skip protocol type aliases that contain unbound dependent member types
2 parents eb1a296 + 3251411 commit c481769

File tree

5 files changed

+58
-13
lines changed

5 files changed

+58
-13
lines changed

lib/AST/RequirementMachine/HomotopyReduction.cpp

+20-12
Original file line numberDiff line numberDiff line change
@@ -611,10 +611,11 @@ GenericSignatureErrors RewriteSystem::getErrors() const {
611611
if (!isInMinimizationDomain(rule.getLHS().getRootProtocol()))
612612
continue;
613613

614-
if (!rule.isRedundant() &&
615-
!rule.isProtocolTypeAliasRule() &&
616-
rule.containsNameSymbols())
617-
result |= GenericSignatureErrorFlags::HasInvalidRequirements;
614+
if (!rule.isRedundant()) {
615+
if (!rule.isProtocolTypeAliasRule() &&
616+
rule.containsNameSymbols())
617+
result |= GenericSignatureErrorFlags::HasInvalidRequirements;
618+
}
618619

619620
if (rule.isRecursive())
620621
result |= GenericSignatureErrorFlags::HasInvalidRequirements;
@@ -624,12 +625,9 @@ GenericSignatureErrors RewriteSystem::getErrors() const {
624625
if (property->getKind() == Symbol::Kind::ConcreteConformance)
625626
result |= GenericSignatureErrorFlags::HasConcreteConformances;
626627

627-
if (property->hasSubstitutions()) {
628-
for (auto t : property->getSubstitutions()) {
629-
if (t.containsNameSymbols())
630-
result |= GenericSignatureErrorFlags::HasInvalidRequirements;
631-
}
632-
}
628+
if (property->hasSubstitutions() &&
629+
property->containsNameSymbols())
630+
result |= GenericSignatureErrorFlags::HasInvalidRequirements;
633631
}
634632
}
635633
}
@@ -661,10 +659,20 @@ RewriteSystem::getMinimizedProtocolRules() const {
661659
if (!isInMinimizationDomain(proto))
662660
continue;
663661

664-
if (rule.isProtocolTypeAliasRule())
662+
if (rule.isProtocolTypeAliasRule()) {
663+
if (auto property = rule.isPropertyRule()) {
664+
if (property->containsNameSymbols())
665+
continue;
666+
} else if (rule.getRHS().containsNameSymbols()) {
667+
continue;
668+
}
665669
rules[proto].TypeAliases.push_back(ruleID);
666-
else if (!rule.containsNameSymbols())
670+
} else {
671+
if (rule.containsNameSymbols())
672+
continue;
673+
667674
rules[proto].Requirements.push_back(ruleID);
675+
}
668676
}
669677

670678
return rules;

lib/AST/RequirementMachine/Symbol.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,15 @@ Symbol Symbol::transformConcreteSubstitutions(
686686
return withConcreteSubstitutions(substitutions, ctx);
687687
}
688688

689+
bool Symbol::containsNameSymbols() const {
690+
for (auto t : getSubstitutions()) {
691+
if (t.containsNameSymbols())
692+
return true;
693+
}
694+
695+
return false;
696+
}
697+
689698
/// Print the symbol using our mnemonic representation.
690699
void Symbol::dump(llvm::raw_ostream &out) const {
691700
llvm::DenseMap<CanType, Identifier> substitutionNames;

lib/AST/RequirementMachine/Symbol.h

+2
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ class Symbol final {
242242
const MutableTerm &prefix,
243243
RewriteContext &ctx) const;
244244

245+
bool containsNameSymbols() const;
246+
245247
void dump(llvm::raw_ostream &out) const;
246248

247249
friend bool operator==(Symbol lhs, Symbol rhs) {

lib/Serialization/Serialization.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -1727,7 +1727,10 @@ void Serializer::writeRequirementSignature(
17271727

17281728
for (const auto &typeAlias : requirementSig.getTypeAliases()) {
17291729
rawData.push_back(addDeclBaseNameRef(typeAlias.getName()));
1730-
rawData.push_back(addTypeRef(typeAlias.getUnderlyingType()));
1730+
1731+
auto underlyingType = typeAlias.getUnderlyingType();
1732+
ASSERT(!underlyingType->findUnresolvedDependentMemberType());
1733+
rawData.push_back(addTypeRef(underlyingType));
17311734
}
17321735

17331736
RequirementSignatureLayout::emitRecord(

test/Generics/rdar136686001.swift

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend -emit-module %s -emit-module-path %t/out.swiftmodule
3+
// RUN: %target-swift-frontend -typecheck %s -debug-generic-signatures 2>&1 | %FileCheck %s
4+
5+
public struct S {
6+
public typealias A = Int
7+
}
8+
9+
public protocol P {
10+
typealias A = S
11+
}
12+
13+
public struct G<T> {}
14+
15+
public protocol Q: P {
16+
typealias B = G<Self.A.A>
17+
}
18+
19+
// FIXME: This should be diagnosed as an error.
20+
21+
// CHECK-LABEL: rdar136686001.(file).f@
22+
// CHECK-NEXT: Generic signature: <T, U where T : Q>
23+
public func f<T: Q, U>(_: T, _: U) where T.B == U {}

0 commit comments

Comments
 (0)