Skip to content

Commit 6346ab4

Browse files
authored
Merge pull request #15308 from DougGregor/gsb-merge-layout-constreaints-sr-7168
[GSB] Merge layout constraints when merging equivalence classes.
2 parents 7fc1b70 + 4a358ba commit 6346ab4

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4106,8 +4106,6 @@ static ConstraintResult visitInherited(
41064106
ConstraintResult result = ConstraintResult::Resolved;
41074107
std::function<void(Type, const TypeRepr *)> visitInherited;
41084108

4109-
// FIXME: Should this whole thing use getExistentialLayout() instead?
4110-
41114109
visitInherited = [&](Type inheritedType, const TypeRepr *typeRepr) {
41124110
// Decompose explicitly-written protocol compositions.
41134111
if (auto composition = dyn_cast_or_null<CompositionTypeRepr>(typeRepr)) {
@@ -4938,6 +4936,22 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenTypeParameters(
49384936
// Make T1 the representative of T2, merging the equivalence classes.
49394937
T2->representativeOrEquivClass = T1;
49404938

4939+
// Layout requirements.
4940+
if (equivClass2 && equivClass2->layout) {
4941+
if (!equivClass->layout) {
4942+
equivClass->layout = equivClass2->layout;
4943+
equivClass->layoutConstraints = std::move(equivClass2->layoutConstraints);
4944+
} else {
4945+
const RequirementSource *source2
4946+
= equivClass2->layoutConstraints.front().source;
4947+
addLayoutRequirementDirect(T1, equivClass2->layout, source2);
4948+
equivClass->layoutConstraints.insert(
4949+
equivClass->layoutConstraints.end(),
4950+
equivClass2->layoutConstraints.begin() + 1,
4951+
equivClass2->layoutConstraints.end());
4952+
}
4953+
}
4954+
49414955
// Superclass requirements.
49424956
if (equivClass2 && equivClass2->superclass) {
49434957
const RequirementSource *source2;

test/Generics/class_constraint.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,23 @@ struct Z<U> {
2525
let bad3: X<U> // expected-error{{'X' requires that 'U' be a class type}}
2626
}
2727

28+
// SR-7168: layout constraints weren't getting merged.
29+
protocol P1 {
30+
associatedtype A
31+
var a: A { get }
32+
}
33+
34+
protocol P2 {
35+
associatedtype B: P1
36+
var b: B { get }
37+
}
38+
39+
func requiresAnyObject<T: AnyObject>(_: T) { }
40+
41+
func anyObjectConstraint<T: P2, U: P2>(_ t: T, _ u: U)
42+
where T.B.A: AnyObject, U.B: AnyObject, T.B == T.B.A, U.B.A == U.B {
43+
requiresAnyObject(t.b)
44+
requiresAnyObject(u.b)
45+
requiresAnyObject(t.b.a)
46+
requiresAnyObject(u.b.a)
47+
}

0 commit comments

Comments
 (0)