@@ -393,8 +393,7 @@ static bool isMemberChainTail(Expr *expr, Expr *parent, MemberChainKind kind) {
393393}
394394
395395static bool isValidForwardReference (ValueDecl *D, DeclContext *DC,
396- ValueDecl *&localDeclAfterUse,
397- bool &shouldUseOuterResults) {
396+ ValueDecl *&localDeclAfterUse) {
398397 // Only VarDecls require declaration before use.
399398 auto *VD = dyn_cast<VarDecl>(D);
400399 if (!VD)
@@ -412,11 +411,6 @@ static bool isValidForwardReference(ValueDecl *D, DeclContext *DC,
412411 }
413412 if (isa<AbstractClosureExpr>(DC) ||
414413 (isa<FuncDecl>(DC) && cast<FuncDecl>(DC)->isDeferBody ())) {
415- // If we cross a closure, don't context, don't allow falling back to
416- // an outer result if we have a forward reference. This preserves the
417- // behavior prior to diagnosing this in Sema.
418- if (isa<AbstractClosureExpr>(DC))
419- shouldUseOuterResults = false ;
420414 DC = DC->getParent ();
421415 continue ;
422416 }
@@ -594,20 +588,18 @@ static Expr *resolveDeclRefExpr(UnresolvedDeclRefExpr *UDRE, DeclContext *DC,
594588 Lookup = TypeChecker::lookupUnqualified (DC, LookupName, Loc, lookupOptions);
595589
596590 ValueDecl *localDeclAfterUse = nullptr ;
597- bool shouldUseOuterResults = true ;
598591 AllDeclRefs = findNonMembers (
599592 Lookup.innerResults (), UDRE->getRefKind (),
600593 /* breakOnMember=*/ true , ResultValues, [&](ValueDecl *D) {
601- return isValidForwardReference (D, DC, localDeclAfterUse,
602- shouldUseOuterResults);
594+ return isValidForwardReference (D, DC, localDeclAfterUse);
603595 });
604596
605597 // If local declaration after use is found, check outer results for
606598 // better matching candidates.
607599 if (ResultValues.empty () && localDeclAfterUse) {
608600 auto innerDecl = localDeclAfterUse;
609601 while (localDeclAfterUse) {
610- if (!shouldUseOuterResults || Lookup.outerResults ().empty ()) {
602+ if (Lookup.outerResults ().empty ()) {
611603 Context.Diags .diagnose (Loc, diag::use_local_before_declaration, Name);
612604 Context.Diags .diagnose (innerDecl, diag::decl_declared_here,
613605 localDeclAfterUse);
@@ -620,8 +612,7 @@ static Expr *resolveDeclRefExpr(UnresolvedDeclRefExpr *UDRE, DeclContext *DC,
620612 AllDeclRefs = findNonMembers (
621613 Lookup.innerResults (), UDRE->getRefKind (),
622614 /* breakOnMember=*/ true , ResultValues, [&](ValueDecl *D) {
623- return isValidForwardReference (D, DC, localDeclAfterUse,
624- shouldUseOuterResults);
615+ return isValidForwardReference (D, DC, localDeclAfterUse);
625616 });
626617 }
627618 }
0 commit comments