@@ -7184,10 +7184,9 @@ class AsyncConverter : private SourceEntityWalker {
7184
7184
AllBindings.append (SuccessBindings.begin (), SuccessBindings.end ());
7185
7185
AllBindings.push_back (ErrParam);
7186
7186
7187
- // Don't do any unwrapping or placeholder replacement since all params
7188
- // are still valid in the fallback case
7189
7187
prepareNames (ClassifiedBlock (), AllBindings, InlinePatterns);
7190
-
7188
+ preparePlaceholdersAndUnwraps (HandlerDesc, CallbackParams,
7189
+ PlaceholderMode::FALLBACK);
7191
7190
addFallbackVars (AllBindings, Blocks);
7192
7191
addDo ();
7193
7192
addAwaitCall (CE, Blocks.SuccessBlock , SuccessBindings, InlinePatterns,
@@ -7243,7 +7242,7 @@ class AsyncConverter : private SourceEntityWalker {
7243
7242
7244
7243
prepareNames (Blocks.SuccessBlock , SuccessBindings, InlinePatterns);
7245
7244
preparePlaceholdersAndUnwraps (HandlerDesc, CallbackParams,
7246
- /* Success= */ true );
7245
+ PlaceholderMode::SUCCESS_BLOCK );
7247
7246
7248
7247
addAwaitCall (CE, Blocks.SuccessBlock , SuccessBindings, InlinePatterns,
7249
7248
HandlerDesc, /* AddDeclarations=*/ true );
@@ -7260,7 +7259,7 @@ class AsyncConverter : private SourceEntityWalker {
7260
7259
ErrInlinePatterns,
7261
7260
/* AddIfMissing=*/ HandlerDesc.Type != HandlerType::RESULT);
7262
7261
preparePlaceholdersAndUnwraps (HandlerDesc, CallbackParams,
7263
- /* Success= */ false );
7262
+ PlaceholderMode::ERROR_BLOCK );
7264
7263
7265
7264
addCatch (ErrOrResultParam);
7266
7265
convertNodes (Blocks.ErrorBlock .nodesToPrint ());
@@ -7547,14 +7546,31 @@ class AsyncConverter : private SourceEntityWalker {
7547
7546
OS << tok::l_brace;
7548
7547
}
7549
7548
7549
+ enum class PlaceholderMode {
7550
+ SUCCESS_BLOCK, ERROR_BLOCK, FALLBACK
7551
+ };
7552
+
7550
7553
void preparePlaceholdersAndUnwraps (AsyncHandlerDesc HandlerDesc,
7551
7554
const ClosureCallbackParams &Params,
7552
- bool Success) {
7555
+ PlaceholderMode Mode) {
7556
+ // Params that have been dropped always need placeholdering.
7557
+ for (auto *Param : Params.getAllParams ()) {
7558
+ if (!Params.hasBinding (Param))
7559
+ Placeholders.insert (Param);
7560
+ }
7561
+ // For the fallback case, no other params need placeholdering, as they are
7562
+ // all freely accessible in the fallback case.
7563
+ if (Mode == PlaceholderMode::FALLBACK)
7564
+ return ;
7565
+
7553
7566
switch (HandlerDesc.Type ) {
7554
7567
case HandlerType::PARAMS: {
7555
7568
auto *ErrParam = Params.getErrParam ();
7556
7569
auto SuccessParams = Params.getSuccessParams ();
7557
- if (!Success) {
7570
+ switch (Mode) {
7571
+ case PlaceholderMode::FALLBACK:
7572
+ llvm_unreachable (" Already handled" );
7573
+ case PlaceholderMode::ERROR_BLOCK:
7558
7574
if (ErrParam) {
7559
7575
if (HandlerDesc.shouldUnwrap (ErrParam->getType ())) {
7560
7576
Placeholders.insert (ErrParam);
@@ -7563,7 +7579,8 @@ class AsyncConverter : private SourceEntityWalker {
7563
7579
// Can't use success params in the error body
7564
7580
Placeholders.insert (SuccessParams.begin (), SuccessParams.end ());
7565
7581
}
7566
- } else {
7582
+ break ;
7583
+ case PlaceholderMode::SUCCESS_BLOCK:
7567
7584
for (auto *SuccessParam : SuccessParams) {
7568
7585
auto Ty = SuccessParam->getType ();
7569
7586
if (HandlerDesc.shouldUnwrap (Ty)) {
@@ -7573,10 +7590,6 @@ class AsyncConverter : private SourceEntityWalker {
7573
7590
Placeholders.insert (SuccessParam);
7574
7591
}
7575
7592
7576
- // If the parameter doesn't have a binding, it needs placeholdering.
7577
- if (!Params.hasBinding (SuccessParam))
7578
- Placeholders.insert (SuccessParam);
7579
-
7580
7593
// Void parameters get omitted where possible, so turn any reference
7581
7594
// into a placeholder, as its usage is unlikely what the user wants.
7582
7595
if (HandlerDesc.getSuccessParamAsyncReturnType (Ty)->isVoid ())
@@ -7585,6 +7598,7 @@ class AsyncConverter : private SourceEntityWalker {
7585
7598
// Can't use the error param in the success body
7586
7599
if (ErrParam)
7587
7600
Placeholders.insert (ErrParam);
7601
+ break ;
7588
7602
}
7589
7603
break ;
7590
7604
}
0 commit comments