@@ -451,25 +451,17 @@ class PatternMatchEmission {
451
451
452
452
void bindRefutablePatterns (const ClauseRow &row, ArgArray args,
453
453
const FailureHandler &failure);
454
- void bindRefutablePattern (Pattern *pattern, ConsumableManagedValue v,
455
- const FailureHandler &failure);
456
- void bindExprPattern (ExprPattern *pattern, ConsumableManagedValue v,
457
- const FailureHandler &failure);
458
454
void emitGuardBranch (SILLocation loc, Expr *guard,
459
455
const FailureHandler &failure,
460
456
Pattern *usingImplicitVariablesFromPattern,
461
457
CaseStmt *usingImplicitVariablesFromStmt);
462
458
463
459
void bindIrrefutablePatterns (const ClauseRow &row, ArgArray args,
464
460
bool forIrrefutableRow, bool hasMultipleItems);
465
- void bindIrrefutablePattern (Pattern *pattern, ConsumableManagedValue v,
466
- bool forIrrefutableRow, bool hasMultipleItems);
467
- void bindNamedPattern (NamedPattern *pattern, ConsumableManagedValue v,
468
- bool forIrrefutableRow, bool hasMultipleItems);
469
461
470
- void bindVariable (SILLocation loc , VarDecl *var,
471
- ConsumableManagedValue value, CanType formalValueType ,
472
- bool isIrrefutable, bool hasMultipleItems);
462
+ void bindVariable (Pattern *pattern , VarDecl *var,
463
+ ConsumableManagedValue value, bool isIrrefutable ,
464
+ bool hasMultipleItems);
473
465
474
466
void emitSpecializedDispatch (ClauseMatrix &matrix, ArgArray args,
475
467
unsigned &lastRow, unsigned column,
@@ -1104,63 +1096,38 @@ void PatternMatchEmission::emitWildcardDispatch(ClauseMatrix &clauses,
1104
1096
assert (!SGF.B .hasValidInsertionPoint ());
1105
1097
}
1106
1098
1107
- // / Bind all the irrefutable patterns in the given row, which is
1108
- // / nothing but wildcard patterns.
1099
+ // / Bind all the refutable patterns in the given row.
1109
1100
void PatternMatchEmission::
1110
1101
bindRefutablePatterns (const ClauseRow &row, ArgArray args,
1111
1102
const FailureHandler &failure) {
1112
1103
assert (row.columns () == args.size ());
1113
1104
for (unsigned i = 0 , e = args.size (); i != e; ++i) {
1114
- bindRefutablePattern (row[i], args[i], failure);
1115
- }
1116
- }
1117
-
1118
- // / Bind a refutable wildcard pattern to a given value.
1119
- void PatternMatchEmission::bindRefutablePattern (Pattern *pattern,
1120
- ConsumableManagedValue value,
1121
- const FailureHandler &failure) {
1122
- // We use null patterns to mean artificial AnyPatterns.
1123
- if (!pattern) return ;
1124
-
1125
- pattern = pattern->getSemanticsProvidingPattern ();
1126
- switch (pattern->getKind ()) {
1127
- // Non-wildcard patterns.
1128
- case PatternKind::Tuple:
1129
- case PatternKind::EnumElement:
1130
- case PatternKind::OptionalSome:
1131
- case PatternKind::Bool:
1132
- case PatternKind::Is:
1133
- llvm_unreachable (" didn't specialize specializable pattern?" );
1134
-
1135
- // Non-semantic patterns.
1136
- case PatternKind::Paren:
1137
- case PatternKind::Typed:
1138
- case PatternKind::Var:
1139
- llvm_unreachable (" should have skipped non-semantic pattern" );
1105
+ if (!row[i]) // We use null patterns to mean artificial AnyPatterns
1106
+ continue ;
1140
1107
1141
- // Refutable patterns that we'll handle in a later pass.
1142
- case PatternKind::Any:
1143
- case PatternKind::Named:
1144
- return ;
1108
+ Pattern *pattern = row[i]->getSemanticsProvidingPattern ();
1109
+ switch (pattern->getKind ()) {
1110
+ // Irrefutable patterns that we'll handle in a later pass.
1111
+ case PatternKind::Any:
1112
+ break ;
1113
+ case PatternKind::Named:
1114
+ break ;
1145
1115
1146
- case PatternKind::Expr:
1147
- bindExprPattern (cast<ExprPattern>(pattern), value, failure);
1148
- return ;
1116
+ case PatternKind::Expr: {
1117
+ ExprPattern *exprPattern = cast<ExprPattern>(pattern);
1118
+ DebugLocOverrideRAII LocOverride{SGF.B ,
1119
+ getSubjectLocationOverride (pattern)};
1120
+ FullExpr scope (SGF.Cleanups , CleanupLocation (pattern));
1121
+ bindVariable (pattern, exprPattern->getMatchVar (), args[i],
1122
+ /* isForSuccess*/ false , /* hasMultipleItems */ false );
1123
+ emitGuardBranch (pattern, exprPattern->getMatchExpr (), failure, nullptr ,
1124
+ nullptr );
1125
+ break ;
1126
+ }
1127
+ default :
1128
+ llvm_unreachable (" bad pattern kind" );
1129
+ }
1149
1130
}
1150
- llvm_unreachable (" bad pattern kind" );
1151
- }
1152
-
1153
- // / Check whether an expression pattern is satisfied.
1154
- void PatternMatchEmission::bindExprPattern (ExprPattern *pattern,
1155
- ConsumableManagedValue value,
1156
- const FailureHandler &failure) {
1157
- DebugLocOverrideRAII LocOverride{SGF.B , getSubjectLocationOverride (pattern)};
1158
- FullExpr scope (SGF.Cleanups , CleanupLocation (pattern));
1159
- bindVariable (pattern, pattern->getMatchVar (), value,
1160
- pattern->getType ()->getCanonicalType (),
1161
- /* isForSuccess*/ false , /* hasMultipleItems */ false );
1162
- emitGuardBranch (pattern, pattern->getMatchExpr (), failure,
1163
- nullptr , nullptr );
1164
1131
}
1165
1132
1166
1133
// / Bind all the irrefutable patterns in the given row, which is nothing
@@ -1174,59 +1141,26 @@ void PatternMatchEmission::bindIrrefutablePatterns(const ClauseRow &row,
1174
1141
bool hasMultipleItems) {
1175
1142
assert (row.columns () == args.size ());
1176
1143
for (unsigned i = 0 , e = args.size (); i != e; ++i) {
1177
- bindIrrefutablePattern (row[i], args[i], forIrrefutableRow, hasMultipleItems);
1178
- }
1179
- }
1144
+ if (!row[i]) // We use null patterns to mean artificial AnyPatterns
1145
+ continue ;
1180
1146
1181
- // / Bind an irrefutable wildcard pattern to a given value.
1182
- void PatternMatchEmission::bindIrrefutablePattern (Pattern *pattern,
1183
- ConsumableManagedValue value,
1184
- bool forIrrefutableRow,
1185
- bool hasMultipleItems) {
1186
- // We use null patterns to mean artificial AnyPatterns.
1187
- if (!pattern) return ;
1188
-
1189
- pattern = pattern->getSemanticsProvidingPattern ();
1190
- switch (pattern->getKind ()) {
1191
- // Non-wildcard patterns.
1192
- case PatternKind::Tuple:
1193
- case PatternKind::EnumElement:
1194
- case PatternKind::OptionalSome:
1195
- case PatternKind::Bool:
1196
- case PatternKind::Is:
1197
- llvm_unreachable (" didn't specialize specializable pattern?" );
1198
-
1199
- // Non-semantic patterns.
1200
- case PatternKind::Paren:
1201
- case PatternKind::Typed:
1202
- case PatternKind::Var:
1203
- llvm_unreachable (" should have skipped non-semantic pattern" );
1204
-
1205
- // We can just drop Any values.
1206
- case PatternKind::Any:
1207
- return ;
1208
-
1209
- // Ignore expression patterns, which we should have bound in an
1210
- // earlier pass.
1211
- case PatternKind::Expr:
1212
- return ;
1213
-
1214
- case PatternKind::Named:
1215
- bindNamedPattern (cast<NamedPattern>(pattern), value,
1216
- forIrrefutableRow, hasMultipleItems);
1217
- return ;
1147
+ Pattern *pattern = row[i]->getSemanticsProvidingPattern ();
1148
+ switch (pattern->getKind ()) {
1149
+ case PatternKind::Any: // We can just drop Any values.
1150
+ break ;
1151
+ case PatternKind::Expr: // Ignore expression patterns, which we should have
1152
+ // bound in an earlier pass.
1153
+ break ;
1154
+ case PatternKind::Named: {
1155
+ NamedPattern *named = cast<NamedPattern>(pattern);
1156
+ bindVariable (pattern, named->getDecl (), args[i], forIrrefutableRow,
1157
+ hasMultipleItems);
1158
+ break ;
1159
+ }
1160
+ default :
1161
+ llvm_unreachable (" bad pattern kind" );
1162
+ }
1218
1163
}
1219
- llvm_unreachable (" bad pattern kind" );
1220
- }
1221
-
1222
- // / Bind a named pattern to a given value.
1223
- void PatternMatchEmission::bindNamedPattern (NamedPattern *pattern,
1224
- ConsumableManagedValue value,
1225
- bool forIrrefutableRow,
1226
- bool hasMultipleItems) {
1227
- bindVariable (pattern, pattern->getDecl (), value,
1228
- pattern->getType ()->getCanonicalType (), forIrrefutableRow,
1229
- hasMultipleItems);
1230
1164
}
1231
1165
1232
1166
// / Should we take control of the mang
@@ -1240,26 +1174,23 @@ static bool shouldTake(ConsumableManagedValue value, bool isIrrefutable) {
1240
1174
}
1241
1175
1242
1176
// / Bind a variable into the current scope.
1243
- void PatternMatchEmission::bindVariable (SILLocation loc , VarDecl *var,
1177
+ void PatternMatchEmission::bindVariable (Pattern *pattern , VarDecl *var,
1244
1178
ConsumableManagedValue value,
1245
- CanType formalValueType,
1246
1179
bool isIrrefutable,
1247
1180
bool hasMultipleItems) {
1248
1181
// If this binding is one of multiple patterns, each individual binding
1249
1182
// will just be let, and then the chosen value will get forwarded into
1250
1183
// a var box in the final shared case block.
1251
- bool forcedLet = var->isLet ();
1252
- if (hasMultipleItems && !var->isLet ())
1253
- forcedLet = true ;
1254
-
1255
- // Initialize the variable value.
1256
- InitializationPtr init = SGF.emitInitializationForVarDecl (var, forcedLet);
1184
+ bool immutable = var->isLet () || hasMultipleItems;
1257
1185
1258
- RValue rv (SGF, loc, formalValueType, value.getFinalManagedValue ());
1186
+ // Initialize the variable value.
1187
+ InitializationPtr init = SGF.emitInitializationForVarDecl (var, immutable);
1188
+ CanType formalValueType = pattern->getType ()->getCanonicalType ();
1189
+ RValue rv (SGF, pattern, formalValueType, value.getFinalManagedValue ());
1259
1190
if (shouldTake (value, isIrrefutable)) {
1260
- std::move (rv).forwardInto (SGF, loc , init.get ());
1191
+ std::move (rv).forwardInto (SGF, pattern , init.get ());
1261
1192
} else {
1262
- std::move (rv).copyInto (SGF, loc , init.get ());
1193
+ std::move (rv).copyInto (SGF, pattern , init.get ());
1263
1194
}
1264
1195
}
1265
1196
0 commit comments