@@ -7248,10 +7248,9 @@ class AsyncConverter : private SourceEntityWalker {
7248
7248
AllBindings.append (SuccessBindings.begin (), SuccessBindings.end ());
7249
7249
AllBindings.push_back (ErrParam);
7250
7250
7251
- // Don't do any unwrapping or placeholder replacement since all params
7252
- // are still valid in the fallback case
7253
7251
prepareNames (ClassifiedBlock (), AllBindings, InlinePatterns);
7254
-
7252
+ preparePlaceholdersAndUnwraps (HandlerDesc, CallbackParams,
7253
+ PlaceholderMode::FALLBACK);
7255
7254
addFallbackVars (AllBindings, Blocks);
7256
7255
addDo ();
7257
7256
addAwaitCall (CE, ArgList.ref (), Blocks.SuccessBlock , SuccessBindings,
@@ -7306,7 +7305,7 @@ class AsyncConverter : private SourceEntityWalker {
7306
7305
7307
7306
prepareNames (Blocks.SuccessBlock , SuccessBindings, InlinePatterns);
7308
7307
preparePlaceholdersAndUnwraps (HandlerDesc, CallbackParams,
7309
- /* Success= */ true );
7308
+ PlaceholderMode::SUCCESS_BLOCK );
7310
7309
7311
7310
addAwaitCall (CE, ArgList.ref (), Blocks.SuccessBlock , SuccessBindings,
7312
7311
InlinePatterns, HandlerDesc, /* AddDeclarations=*/ true );
@@ -7323,7 +7322,7 @@ class AsyncConverter : private SourceEntityWalker {
7323
7322
ErrInlinePatterns,
7324
7323
/* AddIfMissing=*/ HandlerDesc.Type != HandlerType::RESULT);
7325
7324
preparePlaceholdersAndUnwraps (HandlerDesc, CallbackParams,
7326
- /* Success= */ false );
7325
+ PlaceholderMode::ERROR_BLOCK );
7327
7326
7328
7327
addCatch (ErrOrResultParam);
7329
7328
convertNodes (Blocks.ErrorBlock .nodesToPrint ());
@@ -7608,14 +7607,31 @@ class AsyncConverter : private SourceEntityWalker {
7608
7607
OS << tok::l_brace;
7609
7608
}
7610
7609
7610
+ enum class PlaceholderMode {
7611
+ SUCCESS_BLOCK, ERROR_BLOCK, FALLBACK
7612
+ };
7613
+
7611
7614
void preparePlaceholdersAndUnwraps (AsyncHandlerDesc HandlerDesc,
7612
7615
const ClosureCallbackParams &Params,
7613
- bool Success) {
7616
+ PlaceholderMode Mode) {
7617
+ // Params that have been dropped always need placeholdering.
7618
+ for (auto *Param : Params.getAllParams ()) {
7619
+ if (!Params.hasBinding (Param))
7620
+ Placeholders.insert (Param);
7621
+ }
7622
+ // For the fallback case, no other params need placeholdering, as they are
7623
+ // all freely accessible in the fallback case.
7624
+ if (Mode == PlaceholderMode::FALLBACK)
7625
+ return ;
7626
+
7614
7627
switch (HandlerDesc.Type ) {
7615
7628
case HandlerType::PARAMS: {
7616
7629
auto *ErrParam = Params.getErrParam ();
7617
7630
auto SuccessParams = Params.getSuccessParams ();
7618
- if (!Success) {
7631
+ switch (Mode) {
7632
+ case PlaceholderMode::FALLBACK:
7633
+ llvm_unreachable (" Already handled" );
7634
+ case PlaceholderMode::ERROR_BLOCK:
7619
7635
if (ErrParam) {
7620
7636
if (HandlerDesc.shouldUnwrap (ErrParam->getType ())) {
7621
7637
Placeholders.insert (ErrParam);
@@ -7624,7 +7640,8 @@ class AsyncConverter : private SourceEntityWalker {
7624
7640
// Can't use success params in the error body
7625
7641
Placeholders.insert (SuccessParams.begin (), SuccessParams.end ());
7626
7642
}
7627
- } else {
7643
+ break ;
7644
+ case PlaceholderMode::SUCCESS_BLOCK:
7628
7645
for (auto *SuccessParam : SuccessParams) {
7629
7646
auto Ty = SuccessParam->getType ();
7630
7647
if (HandlerDesc.shouldUnwrap (Ty)) {
@@ -7634,10 +7651,6 @@ class AsyncConverter : private SourceEntityWalker {
7634
7651
Placeholders.insert (SuccessParam);
7635
7652
}
7636
7653
7637
- // If the parameter doesn't have a binding, it needs placeholdering.
7638
- if (!Params.hasBinding (SuccessParam))
7639
- Placeholders.insert (SuccessParam);
7640
-
7641
7654
// Void parameters get omitted where possible, so turn any reference
7642
7655
// into a placeholder, as its usage is unlikely what the user wants.
7643
7656
if (HandlerDesc.getSuccessParamAsyncReturnType (Ty)->isVoid ())
@@ -7646,6 +7659,7 @@ class AsyncConverter : private SourceEntityWalker {
7646
7659
// Can't use the error param in the success body
7647
7660
if (ErrParam)
7648
7661
Placeholders.insert (ErrParam);
7662
+ break ;
7649
7663
}
7650
7664
break ;
7651
7665
}
0 commit comments