@@ -3543,11 +3543,11 @@ GenericSignatureBuilder::Implementation::getRewriteTreeRootIfPresent(
3543
3543
RewriteTreeNode *
3544
3544
GenericSignatureBuilder::Implementation::getOrCreateRewriteTreeRoot (
3545
3545
CanType anchor) {
3546
- auto known = RewriteTreeRoots. find (anchor);
3547
- if (known != RewriteTreeRoots. end ()) return known-> second . get () ;
3546
+ if ( auto *root = getRewriteTreeRootIfPresent (anchor))
3547
+ return root ;
3548
3548
3549
3549
auto &root = RewriteTreeRoots[anchor];
3550
- root = std::unique_ptr <RewriteTreeNode>(new RewriteTreeNode ( nullptr ) );
3550
+ root = llvm::make_unique <RewriteTreeNode>(nullptr );
3551
3551
return root.get ();
3552
3552
}
3553
3553
@@ -4929,35 +4929,25 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenTypeParameters(
4929
4929
};
4930
4930
4931
4931
// Consider the second equivalence class to be modified.
4932
- if (equivClass2)
4933
- equivClass->modified (*this );
4934
-
4935
- // Same-type requirements, delayed requirements.
4932
+ // Transfer Same-type requirements and delayed requirements.
4936
4933
if (equivClass2) {
4937
- Impl->DelayedRequirements .append (equivClass2->delayedRequirements .begin (),
4938
- equivClass2->delayedRequirements .end ());
4939
-
4934
+ // Mark as modified and transfer deplayed requirements to the primary queue.
4935
+ equivClass2->modified (*this );
4940
4936
equivClass->sameTypeConstraints .insert (
4941
4937
equivClass->sameTypeConstraints .end (),
4942
4938
equivClass2->sameTypeConstraints .begin (),
4943
4939
equivClass2->sameTypeConstraints .end ());
4944
4940
}
4945
4941
4946
4942
// Combine the rewrite rules.
4947
- if (auto rewriteRoot2 = Impl->getOrCreateRewriteTreeRoot (anchor2)) {
4948
- if (auto rewriteRoot1 = Impl->getOrCreateRewriteTreeRoot (anchor1)) {
4949
- // Merge the second rewrite tree into the first.
4950
- if (rewriteRoot2->mergeInto (rewriteRoot1))
4951
- ++Impl->RewriteGeneration ;
4952
- Impl->RewriteTreeRoots .erase (anchor2);
4953
- } else {
4954
- // Take the second rewrite tree and make it the first.
4955
- auto root2Entry = Impl->RewriteTreeRoots .find (anchor2);
4956
- auto root2Ptr = std::move (root2Entry->second );
4957
- Impl->RewriteTreeRoots .erase (root2Entry);
4958
- (void )Impl->RewriteTreeRoots .insert ({anchor1, std::move (root2Ptr)});
4959
- }
4960
- }
4943
+ auto *rewriteRoot1 = Impl->getOrCreateRewriteTreeRoot (anchor1);
4944
+ auto *rewriteRoot2 = Impl->getOrCreateRewriteTreeRoot (anchor2);
4945
+ assert (rewriteRoot1 && rewriteRoot2 &&
4946
+ " Couldn't create/retrieve rewrite tree root" );
4947
+ // Merge the second rewrite tree into the first.
4948
+ if (rewriteRoot2->mergeInto (rewriteRoot1))
4949
+ ++Impl->RewriteGeneration ;
4950
+ Impl->RewriteTreeRoots .erase (anchor2);
4961
4951
4962
4952
// Add a rewrite rule to map the anchor of T2 down to the anchor of T1.
4963
4953
if (addSameTypeRewriteRule (anchor2, anchor1))
0 commit comments