@@ -856,6 +856,7 @@ class SolutionApplicationTargetsKey {
856856 stmtCondElement,
857857 stmt,
858858 patternBindingEntry,
859+ varDecl,
859860 };
860861
861862private:
@@ -870,6 +871,8 @@ class SolutionApplicationTargetsKey {
870871 const PatternBindingDecl *patternBinding;
871872 unsigned index;
872873 } patternBindingEntry;
874+
875+ const VarDecl *varDecl;
873876 } storage;
874877
875878public:
@@ -895,6 +898,11 @@ class SolutionApplicationTargetsKey {
895898 storage.patternBindingEntry .index = index;
896899 }
897900
901+ SolutionApplicationTargetsKey (const VarDecl *varDecl) {
902+ kind = Kind::varDecl;
903+ storage.varDecl = varDecl;
904+ }
905+
898906 friend bool operator ==(
899907 SolutionApplicationTargetsKey lhs, SolutionApplicationTargetsKey rhs) {
900908 if (lhs.kind != rhs.kind )
@@ -916,6 +924,9 @@ class SolutionApplicationTargetsKey {
916924 == rhs.storage .patternBindingEntry .patternBinding ) &&
917925 (lhs.storage .patternBindingEntry .index
918926 == rhs.storage .patternBindingEntry .index );
927+
928+ case Kind::varDecl:
929+ return lhs.storage .varDecl == rhs.storage .varDecl ;
919930 }
920931 llvm_unreachable (" invalid SolutionApplicationTargetsKey kind" );
921932 }
@@ -951,6 +962,11 @@ class SolutionApplicationTargetsKey {
951962 storage.patternBindingEntry .patternBinding ),
952963 DenseMapInfo<unsigned >::getHashValue (
953964 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 ));
954970 }
955971 llvm_unreachable (" invalid statement kind" );
956972 }
@@ -1343,6 +1359,7 @@ class SolutionApplicationTarget {
13431359 stmtCondition,
13441360 caseLabelItem,
13451361 patternBinding,
1362+ uninitializedWrappedVar,
13461363 } kind;
13471364
13481365private:
@@ -1409,6 +1426,8 @@ class SolutionApplicationTarget {
14091426 } caseLabelItem;
14101427
14111428 PatternBindingDecl *patternBinding;
1429+
1430+ VarDecl *uninitializedWrappedVar;
14121431 };
14131432
14141433 // If the pattern contains a single variable that has an attached
@@ -1454,6 +1473,11 @@ class SolutionApplicationTarget {
14541473 this ->patternBinding = patternBinding;
14551474 }
14561475
1476+ SolutionApplicationTarget (VarDecl *wrappedVar) {
1477+ kind = Kind::uninitializedWrappedVar;
1478+ this ->uninitializedWrappedVar = wrappedVar;
1479+ }
1480+
14571481 // / Form a target for the initialization of a pattern from an expression.
14581482 static SolutionApplicationTarget forInitialization (
14591483 Expr *initializer, DeclContext *dc, Type patternType, Pattern *pattern,
@@ -1471,6 +1495,11 @@ class SolutionApplicationTarget {
14711495 ForEachStmt *stmt, ProtocolDecl *sequenceProto, DeclContext *dc,
14721496 bool bindPatternVarsOneWay);
14731497
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+
14741503 Expr *getAsExpr () const {
14751504 switch (kind) {
14761505 case Kind::expression:
@@ -1480,6 +1509,7 @@ class SolutionApplicationTarget {
14801509 case Kind::stmtCondition:
14811510 case Kind::caseLabelItem:
14821511 case Kind::patternBinding:
1512+ case Kind::uninitializedWrappedVar:
14831513 return nullptr ;
14841514 }
14851515 llvm_unreachable (" invalid expression type" );
@@ -1501,6 +1531,9 @@ class SolutionApplicationTarget {
15011531
15021532 case Kind::patternBinding:
15031533 return patternBinding->getDeclContext ();
1534+
1535+ case Kind::uninitializedWrappedVar:
1536+ return uninitializedWrappedVar->getDeclContext ();
15041537 }
15051538 llvm_unreachable (" invalid decl context type" );
15061539 }
@@ -1653,6 +1686,7 @@ class SolutionApplicationTarget {
16531686 case Kind::stmtCondition:
16541687 case Kind::caseLabelItem:
16551688 case Kind::patternBinding:
1689+ case Kind::uninitializedWrappedVar:
16561690 return None;
16571691
16581692 case Kind::function:
@@ -1667,6 +1701,7 @@ class SolutionApplicationTarget {
16671701 case Kind::function:
16681702 case Kind::caseLabelItem:
16691703 case Kind::patternBinding:
1704+ case Kind::uninitializedWrappedVar:
16701705 return None;
16711706
16721707 case Kind::stmtCondition:
@@ -1681,6 +1716,7 @@ class SolutionApplicationTarget {
16811716 case Kind::function:
16821717 case Kind::stmtCondition:
16831718 case Kind::patternBinding:
1719+ case Kind::uninitializedWrappedVar:
16841720 return None;
16851721
16861722 case Kind::caseLabelItem:
@@ -1695,13 +1731,28 @@ class SolutionApplicationTarget {
16951731 case Kind::function:
16961732 case Kind::stmtCondition:
16971733 case Kind::caseLabelItem:
1734+ case Kind::uninitializedWrappedVar:
16981735 return nullptr ;
16991736
17001737 case Kind::patternBinding:
17011738 return patternBinding;
17021739 }
17031740 }
17041741
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+
17051756 BraceStmt *getFunctionBody () const {
17061757 assert (kind == Kind::function);
17071758 return function.body ;
@@ -1730,6 +1781,9 @@ class SolutionApplicationTarget {
17301781
17311782 case Kind::patternBinding:
17321783 return patternBinding->getSourceRange ();
1784+
1785+ case Kind::uninitializedWrappedVar:
1786+ return uninitializedWrappedVar->getSourceRange ();
17331787 }
17341788 llvm_unreachable (" invalid target type" );
17351789 }
@@ -1751,6 +1805,9 @@ class SolutionApplicationTarget {
17511805
17521806 case Kind::patternBinding:
17531807 return patternBinding->getLoc ();
1808+
1809+ case Kind::uninitializedWrappedVar:
1810+ return uninitializedWrappedVar->getLoc ();
17541811 }
17551812 llvm_unreachable (" invalid target type" );
17561813 }
0 commit comments