Skip to content

Commit 2e8658e

Browse files
committed
[Constraint graph] Use adjacency info for constraint gathering.
This reinstates the use of direct adjacency information when gathering constraints, effectively reverting 54bdd7b. Fixes the regression that commit caused, which is tracked by rdar://problem/54274245.
1 parent 39d5564 commit 2e8658e

File tree

2 files changed

+42
-23
lines changed

2 files changed

+42
-23
lines changed

lib/Sema/ConstraintGraph.cpp

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,6 @@ llvm::TinyPtrVector<Constraint *> ConstraintGraph::gatherConstraints(
473473
TypeVariableType *typeVar, GatheringKind kind,
474474
llvm::function_ref<bool(Constraint *)> acceptConstraintFn) {
475475
llvm::TinyPtrVector<Constraint *> constraints;
476-
477476
// Whether we should consider this constraint at all.
478477
auto rep = CS.getRepresentative(typeVar);
479478
auto shouldConsiderConstraint = [&](Constraint *constraint) {
@@ -505,19 +504,29 @@ llvm::TinyPtrVector<Constraint *> ConstraintGraph::gatherConstraints(
505504

506505
// Add constraints for the given adjacent type variable.
507506
llvm::SmallPtrSet<TypeVariableType *, 4> typeVars;
507+
508+
// Local function to add constraints
508509
llvm::SmallPtrSet<Constraint *, 4> visitedConstraints;
509-
auto addAdjacentConstraints = [&](TypeVariableType *adjTypeVar) {
510-
auto adjTypeVarsToVisit =
511-
(*this)[CS.getRepresentative(adjTypeVar)].getEquivalenceClass();
510+
auto addConstraintsOfAdjacency = [&](TypeVariableType *adjTypeVar) {
511+
ArrayRef<TypeVariableType *> adjTypeVarsToVisit;
512+
switch (kind) {
513+
case GatheringKind::EquivalenceClass:
514+
adjTypeVarsToVisit = adjTypeVar;
515+
break;
516+
517+
case GatheringKind::AllMentions:
518+
adjTypeVarsToVisit
519+
= (*this)[CS.getRepresentative(adjTypeVar)].getEquivalenceClass();
520+
break;
521+
}
522+
512523
for (auto adjTypeVarEquiv : adjTypeVarsToVisit) {
513524
if (!typeVars.insert(adjTypeVarEquiv).second)
514525
continue;
515526

516527
for (auto constraint : (*this)[adjTypeVarEquiv].getConstraints()) {
517-
if (!visitedConstraints.insert(constraint).second)
518-
continue;
519-
520-
if (acceptConstraint(constraint))
528+
if (visitedConstraints.insert(constraint).second &&
529+
acceptConstraint(constraint))
521530
constraints.push_back(constraint);
522531
}
523532
}
@@ -526,29 +535,34 @@ llvm::TinyPtrVector<Constraint *> ConstraintGraph::gatherConstraints(
526535
auto &reprNode = (*this)[CS.getRepresentative(typeVar)];
527536
auto equivClass = reprNode.getEquivalenceClass();
528537
for (auto typeVar : equivClass) {
529-
auto &node = (*this)[typeVar];
530-
for (auto constraint : node.getConstraints()) {
538+
if (!typeVars.insert(typeVar).second)
539+
continue;
540+
541+
for (auto constraint : (*this)[typeVar].getConstraints()) {
531542
if (visitedConstraints.insert(constraint).second &&
532543
acceptConstraint(constraint))
533544
constraints.push_back(constraint);
545+
}
534546

535-
// If we want all mentions, visit type variables within each of our
536-
// constraints.
537-
if (kind == GatheringKind::AllMentions) {
538-
if (!shouldConsiderConstraint(constraint))
539-
continue;
547+
auto &node = (*this)[typeVar];
540548

541-
for (auto adjTypeVar : constraint->getTypeVariables()) {
542-
addAdjacentConstraints(adjTypeVar);
543-
}
544-
}
549+
for (auto adjTypeVar : node.getFixedBindings()) {
550+
addConstraintsOfAdjacency(adjTypeVar);
545551
}
546552

547-
// For any type variable mentioned in a fixed binding, add adjacent
548-
// constraints.
549-
for (auto adjTypeVar : node.getFixedBindings()) {
550-
addAdjacentConstraints(adjTypeVar);
553+
switch (kind) {
554+
case GatheringKind::EquivalenceClass:
555+
break;
556+
557+
case GatheringKind::AllMentions:
558+
// Retrieve the constraints from adjacent bindings.
559+
for (auto adjTypeVar : node.getAdjacencies()) {
560+
addConstraintsOfAdjacency(adjTypeVar);
561+
}
562+
563+
break;
551564
}
565+
552566
}
553567

554568
return constraints;

test/Constraints/bridging.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,3 +374,8 @@ func bridgeTupleToAnyObject() {
374374
let y = x as AnyObject
375375
_ = y
376376
}
377+
378+
// Array defaulting and bridging type checking error per rdar://problem/54274245
379+
func rdar54274245(_ arr: [Any]?) {
380+
_ = (arr ?? []) as [NSObject]
381+
}

0 commit comments

Comments
 (0)