@@ -856,6 +856,7 @@ class SolutionApplicationTargetsKey {
856
856
stmtCondElement,
857
857
stmt,
858
858
patternBindingEntry,
859
+ varDecl,
859
860
};
860
861
861
862
private:
@@ -870,6 +871,8 @@ class SolutionApplicationTargetsKey {
870
871
const PatternBindingDecl *patternBinding;
871
872
unsigned index;
872
873
} patternBindingEntry;
874
+
875
+ const VarDecl *varDecl;
873
876
} storage;
874
877
875
878
public:
@@ -895,6 +898,11 @@ class SolutionApplicationTargetsKey {
895
898
storage.patternBindingEntry .index = index;
896
899
}
897
900
901
+ SolutionApplicationTargetsKey (const VarDecl *varDecl) {
902
+ kind = Kind::varDecl;
903
+ storage.varDecl = varDecl;
904
+ }
905
+
898
906
friend bool operator ==(
899
907
SolutionApplicationTargetsKey lhs, SolutionApplicationTargetsKey rhs) {
900
908
if (lhs.kind != rhs.kind )
@@ -916,6 +924,9 @@ class SolutionApplicationTargetsKey {
916
924
== rhs.storage .patternBindingEntry .patternBinding ) &&
917
925
(lhs.storage .patternBindingEntry .index
918
926
== rhs.storage .patternBindingEntry .index );
927
+
928
+ case Kind::varDecl:
929
+ return lhs.storage .varDecl == rhs.storage .varDecl ;
919
930
}
920
931
llvm_unreachable (" invalid SolutionApplicationTargetsKey kind" );
921
932
}
@@ -951,6 +962,11 @@ class SolutionApplicationTargetsKey {
951
962
storage.patternBindingEntry .patternBinding ),
952
963
DenseMapInfo<unsigned >::getHashValue (
953
964
storage.patternBindingEntry .index ));
965
+
966
+ case Kind::varDecl:
967
+ return hash_combine (
968
+ DenseMapInfo<unsigned >::getHashValue (static_cast <unsigned >(kind)),
969
+ DenseMapInfo<void *>::getHashValue (storage.varDecl ));
954
970
}
955
971
llvm_unreachable (" invalid statement kind" );
956
972
}
@@ -1343,6 +1359,7 @@ class SolutionApplicationTarget {
1343
1359
stmtCondition,
1344
1360
caseLabelItem,
1345
1361
patternBinding,
1362
+ uninitializedWrappedVar,
1346
1363
} kind;
1347
1364
1348
1365
private:
@@ -1409,6 +1426,8 @@ class SolutionApplicationTarget {
1409
1426
} caseLabelItem;
1410
1427
1411
1428
PatternBindingDecl *patternBinding;
1429
+
1430
+ VarDecl *uninitializedWrappedVar;
1412
1431
};
1413
1432
1414
1433
// If the pattern contains a single variable that has an attached
@@ -1454,6 +1473,11 @@ class SolutionApplicationTarget {
1454
1473
this ->patternBinding = patternBinding;
1455
1474
}
1456
1475
1476
+ SolutionApplicationTarget (VarDecl *wrappedVar) {
1477
+ kind = Kind::uninitializedWrappedVar;
1478
+ this ->uninitializedWrappedVar = wrappedVar;
1479
+ }
1480
+
1457
1481
// / Form a target for the initialization of a pattern from an expression.
1458
1482
static SolutionApplicationTarget forInitialization (
1459
1483
Expr *initializer, DeclContext *dc, Type patternType, Pattern *pattern,
@@ -1471,6 +1495,11 @@ class SolutionApplicationTarget {
1471
1495
ForEachStmt *stmt, ProtocolDecl *sequenceProto, DeclContext *dc,
1472
1496
bool bindPatternVarsOneWay);
1473
1497
1498
+ // / Form a target for a property with an attached property wrapper that is
1499
+ // / initialized out-of-line.
1500
+ static SolutionApplicationTarget forUninitializedWrappedVar (
1501
+ VarDecl *wrappedVar);
1502
+
1474
1503
Expr *getAsExpr () const {
1475
1504
switch (kind) {
1476
1505
case Kind::expression:
@@ -1480,6 +1509,7 @@ class SolutionApplicationTarget {
1480
1509
case Kind::stmtCondition:
1481
1510
case Kind::caseLabelItem:
1482
1511
case Kind::patternBinding:
1512
+ case Kind::uninitializedWrappedVar:
1483
1513
return nullptr ;
1484
1514
}
1485
1515
llvm_unreachable (" invalid expression type" );
@@ -1501,6 +1531,9 @@ class SolutionApplicationTarget {
1501
1531
1502
1532
case Kind::patternBinding:
1503
1533
return patternBinding->getDeclContext ();
1534
+
1535
+ case Kind::uninitializedWrappedVar:
1536
+ return uninitializedWrappedVar->getDeclContext ();
1504
1537
}
1505
1538
llvm_unreachable (" invalid decl context type" );
1506
1539
}
@@ -1653,6 +1686,7 @@ class SolutionApplicationTarget {
1653
1686
case Kind::stmtCondition:
1654
1687
case Kind::caseLabelItem:
1655
1688
case Kind::patternBinding:
1689
+ case Kind::uninitializedWrappedVar:
1656
1690
return None;
1657
1691
1658
1692
case Kind::function:
@@ -1667,6 +1701,7 @@ class SolutionApplicationTarget {
1667
1701
case Kind::function:
1668
1702
case Kind::caseLabelItem:
1669
1703
case Kind::patternBinding:
1704
+ case Kind::uninitializedWrappedVar:
1670
1705
return None;
1671
1706
1672
1707
case Kind::stmtCondition:
@@ -1681,6 +1716,7 @@ class SolutionApplicationTarget {
1681
1716
case Kind::function:
1682
1717
case Kind::stmtCondition:
1683
1718
case Kind::patternBinding:
1719
+ case Kind::uninitializedWrappedVar:
1684
1720
return None;
1685
1721
1686
1722
case Kind::caseLabelItem:
@@ -1695,13 +1731,28 @@ class SolutionApplicationTarget {
1695
1731
case Kind::function:
1696
1732
case Kind::stmtCondition:
1697
1733
case Kind::caseLabelItem:
1734
+ case Kind::uninitializedWrappedVar:
1698
1735
return nullptr ;
1699
1736
1700
1737
case Kind::patternBinding:
1701
1738
return patternBinding;
1702
1739
}
1703
1740
}
1704
1741
1742
+ VarDecl *getAsUninitializedWrappedVar () const {
1743
+ switch (kind) {
1744
+ case Kind::expression:
1745
+ case Kind::function:
1746
+ case Kind::stmtCondition:
1747
+ case Kind::caseLabelItem:
1748
+ case Kind::patternBinding:
1749
+ return nullptr ;
1750
+
1751
+ case Kind::uninitializedWrappedVar:
1752
+ return uninitializedWrappedVar;
1753
+ }
1754
+ }
1755
+
1705
1756
BraceStmt *getFunctionBody () const {
1706
1757
assert (kind == Kind::function);
1707
1758
return function.body ;
@@ -1730,6 +1781,9 @@ class SolutionApplicationTarget {
1730
1781
1731
1782
case Kind::patternBinding:
1732
1783
return patternBinding->getSourceRange ();
1784
+
1785
+ case Kind::uninitializedWrappedVar:
1786
+ return uninitializedWrappedVar->getSourceRange ();
1733
1787
}
1734
1788
llvm_unreachable (" invalid target type" );
1735
1789
}
@@ -1751,6 +1805,9 @@ class SolutionApplicationTarget {
1751
1805
1752
1806
case Kind::patternBinding:
1753
1807
return patternBinding->getLoc ();
1808
+
1809
+ case Kind::uninitializedWrappedVar:
1810
+ return uninitializedWrappedVar->getLoc ();
1754
1811
}
1755
1812
llvm_unreachable (" invalid target type" );
1756
1813
}
0 commit comments