@@ -1699,6 +1699,17 @@ class SolutionApplicationTarget {
1699
1699
uninitializedVar.type = Type ();
1700
1700
}
1701
1701
1702
+ SolutionApplicationTarget (PatternBindingDecl *binding, unsigned index,
1703
+ Pattern *var, Type patternTy)
1704
+ : kind(Kind::uninitializedVar) {
1705
+ assert (patternBinding);
1706
+
1707
+ patternBinding = binding;
1708
+ uninitializedVar.index = index;
1709
+ uninitializedVar.declaration = var;
1710
+ uninitializedVar.type = patternTy;
1711
+ }
1712
+
1702
1713
// / Form a target for the initialization of a pattern from an expression.
1703
1714
static SolutionApplicationTarget forInitialization (
1704
1715
Expr *initializer, DeclContext *dc, Type patternType, Pattern *pattern,
@@ -1723,6 +1734,12 @@ class SolutionApplicationTarget {
1723
1734
return {wrappedVar};
1724
1735
}
1725
1736
1737
+ static SolutionApplicationTarget
1738
+ forUninitializedVar (PatternBindingDecl *binding, unsigned index, Pattern *var,
1739
+ Type patternTy) {
1740
+ return {binding, index, var, patternTy};
1741
+ }
1742
+
1726
1743
// / Form a target for a synthesized property wrapper initializer.
1727
1744
static SolutionApplicationTarget forPropertyWrapperInitializer (
1728
1745
VarDecl *wrappedVar, DeclContext *dc, Expr *initializer);
@@ -1821,6 +1838,9 @@ class SolutionApplicationTarget {
1821
1838
1822
1839
// / For a pattern initialization target, retrieve the pattern.
1823
1840
Pattern *getInitializationPattern () const {
1841
+ if (kind == Kind::uninitializedVar)
1842
+ return uninitializedVar.declaration .get <Pattern *>();
1843
+
1824
1844
assert (kind == Kind::expression);
1825
1845
assert (expression.contextualPurpose == CTP_Initialization);
1826
1846
return expression.pattern ;
@@ -1925,6 +1945,12 @@ class SolutionApplicationTarget {
1925
1945
}
1926
1946
1927
1947
void setPattern (Pattern *pattern) {
1948
+ if (kind == Kind::uninitializedVar) {
1949
+ assert (uninitializedVar.declaration .is <Pattern *>());
1950
+ uninitializedVar.declaration = pattern;
1951
+ return ;
1952
+ }
1953
+
1928
1954
assert (kind == Kind::expression);
1929
1955
assert (expression.contextualPurpose == CTP_Initialization ||
1930
1956
expression.contextualPurpose == CTP_ForEachStmt);
@@ -2006,6 +2032,66 @@ class SolutionApplicationTarget {
2006
2032
llvm_unreachable (" invalid case label type" );
2007
2033
}
2008
2034
2035
+ Pattern *getAsUninitializedVar () const {
2036
+ switch (kind) {
2037
+ case Kind::expression:
2038
+ case Kind::function:
2039
+ case Kind::stmtCondition:
2040
+ case Kind::caseLabelItem:
2041
+ case Kind::patternBinding:
2042
+ return nullptr ;
2043
+
2044
+ case Kind::uninitializedVar:
2045
+ return uninitializedVar.declaration .dyn_cast <Pattern *>();
2046
+ }
2047
+ llvm_unreachable (" invalid case label type" );
2048
+ }
2049
+
2050
+ Type getTypeOfUninitializedVar () const {
2051
+ switch (kind) {
2052
+ case Kind::expression:
2053
+ case Kind::function:
2054
+ case Kind::stmtCondition:
2055
+ case Kind::caseLabelItem:
2056
+ case Kind::patternBinding:
2057
+ return nullptr ;
2058
+
2059
+ case Kind::uninitializedVar:
2060
+ return uninitializedVar.type ;
2061
+ }
2062
+ llvm_unreachable (" invalid case label type" );
2063
+ }
2064
+
2065
+ PatternBindingDecl *getPatternBindingOfUninitializedVar () const {
2066
+ switch (kind) {
2067
+ case Kind::expression:
2068
+ case Kind::function:
2069
+ case Kind::stmtCondition:
2070
+ case Kind::caseLabelItem:
2071
+ case Kind::patternBinding:
2072
+ return nullptr ;
2073
+
2074
+ case Kind::uninitializedVar:
2075
+ return patternBinding;
2076
+ }
2077
+ llvm_unreachable (" invalid case label type" );
2078
+ }
2079
+
2080
+ unsigned getIndexOfUninitializedVar () const {
2081
+ switch (kind) {
2082
+ case Kind::expression:
2083
+ case Kind::function:
2084
+ case Kind::stmtCondition:
2085
+ case Kind::caseLabelItem:
2086
+ case Kind::patternBinding:
2087
+ return 0 ;
2088
+
2089
+ case Kind::uninitializedVar:
2090
+ return uninitializedVar.index ;
2091
+ }
2092
+ llvm_unreachable (" invalid case label type" );
2093
+ }
2094
+
2009
2095
BraceStmt *getFunctionBody () const {
2010
2096
assert (kind == Kind::function);
2011
2097
return function.body ;
0 commit comments