@@ -1566,10 +1566,12 @@ Pattern *TypeChecker::coercePatternToType(ContextualPattern pattern,
1566
1566
}
1567
1567
}
1568
1568
1569
+ Type elementType;
1570
+ Pattern *sub = EEP->getSubPattern ();
1571
+
1569
1572
// If there is a subpattern, push the enum element type down onto it.
1570
1573
auto argType = elt->getArgumentInterfaceType ();
1571
- if (EEP->hasSubPattern ()) {
1572
- Pattern *sub = EEP->getSubPattern ();
1574
+ if (sub) {
1573
1575
if (!elt->hasAssociatedValues ()) {
1574
1576
diags.diagnose (EEP->getLoc (),
1575
1577
diag::enum_element_pattern_assoc_values_mismatch,
@@ -1579,33 +1581,21 @@ Pattern *TypeChecker::coercePatternToType(ContextualPattern pattern,
1579
1581
.fixItRemove (sub->getSourceRange ());
1580
1582
return nullptr ;
1581
1583
}
1582
-
1583
- Type elementType;
1584
+
1584
1585
if (argType)
1585
1586
elementType = enumTy->getTypeOfMember (elt->getModuleContext (),
1586
1587
elt, argType);
1587
1588
else
1588
1589
elementType = TupleType::getEmpty (Context);
1589
- auto newSubOptions = subOptions;
1590
- newSubOptions.setContext (TypeResolverContext::EnumPatternPayload);
1591
- newSubOptions |= TypeResolutionFlags::FromNonInferredPattern;
1592
1590
1593
1591
::repairTupleOrAssociatedValuePatternIfApplicable (
1594
1592
Context, sub, elementType, elt);
1595
-
1596
- sub = coercePatternToType (
1597
- pattern.forSubPattern (sub, /* retainTopLevel=*/ false ), elementType,
1598
- newSubOptions);
1599
- if (!sub)
1600
- return nullptr ;
1601
-
1602
- EEP->setSubPattern (sub);
1603
1593
} else if (argType) {
1604
1594
// Else if the element pattern has no sub-pattern but the element type has
1605
1595
// associated values, expand it to be semantically equivalent to an
1606
1596
// element pattern of wildcards.
1607
- Type elementType = enumTy-> getTypeOfMember (elt-> getModuleContext (),
1608
- elt, argType);
1597
+ elementType =
1598
+ enumTy-> getTypeOfMember (elt-> getModuleContext (), elt, argType);
1609
1599
SmallVector<TuplePatternElt, 8 > elements;
1610
1600
if (auto *TTy = dyn_cast<TupleType>(elementType.getPointer ())) {
1611
1601
for (auto &elt : TTy->getElements ()) {
@@ -1622,17 +1612,22 @@ Pattern *TypeChecker::coercePatternToType(ContextualPattern pattern,
1622
1612
elements.push_back (TuplePatternElt (Identifier (), SourceLoc (),
1623
1613
subPattern));
1624
1614
}
1625
- Pattern * sub = TuplePattern::createSimple (Context, SourceLoc (),
1626
- elements, SourceLoc ());
1615
+ sub = TuplePattern::createSimple (Context, SourceLoc (), elements ,
1616
+ SourceLoc ());
1627
1617
sub->setImplicit ();
1618
+ }
1619
+
1620
+ if (sub) {
1628
1621
auto newSubOptions = subOptions;
1629
1622
newSubOptions.setContext (TypeResolverContext::EnumPatternPayload);
1630
1623
newSubOptions |= TypeResolutionFlags::FromNonInferredPattern;
1624
+
1631
1625
sub = coercePatternToType (
1632
1626
pattern.forSubPattern (sub, /* retainTopLevel=*/ false ), elementType,
1633
1627
newSubOptions);
1634
1628
if (!sub)
1635
1629
return nullptr ;
1630
+
1636
1631
EEP->setSubPattern (sub);
1637
1632
}
1638
1633
0 commit comments