@@ -5620,11 +5620,13 @@ static void diagnoseOperatorFixityAttributes(Parser &P,
56205620
56215621static unsigned skipUntilMatchingRBrace (Parser &P,
56225622 bool &HasPoundDirective,
5623+ bool &HasPoundSourceLocation,
56235624 bool &HasOperatorDeclarations,
56245625 bool &HasNestedClassDeclarations,
56255626 bool &HasNestedTypeDeclarations,
56265627 bool &HasPotentialRegexLiteral) {
56275628 HasPoundDirective = false ;
5629+ HasPoundSourceLocation = false ;
56285630 HasOperatorDeclarations = false ;
56295631 HasNestedClassDeclarations = false ;
56305632 HasNestedTypeDeclarations = false ;
@@ -5646,8 +5648,11 @@ static unsigned skipUntilMatchingRBrace(Parser &P,
56465648
56475649 HasNestedClassDeclarations |= P.Tok .is (tok::kw_class);
56485650
5649- HasPoundDirective |= P.Tok .isAny (tok::pound_sourceLocation, tok::pound_line,
5650- tok::pound_if, tok::pound_else, tok::pound_endif, tok::pound_elseif);
5651+ HasPoundSourceLocation |= P.Tok .isAny (tok::pound_sourceLocation,
5652+ tok::pound_line);
5653+ HasPoundDirective |= HasPoundSourceLocation;
5654+ HasPoundDirective |= P.Tok .isAny (tok::pound_if, tok::pound_else,
5655+ tok::pound_endif, tok::pound_elseif);
56515656
56525657 HasNestedTypeDeclarations |= P.Tok .isAny (tok::kw_class, tok::kw_struct,
56535658 tok::kw_enum, tok::kw_typealias,
@@ -7080,25 +7085,27 @@ bool Parser::canDelayMemberDeclParsing(bool &HasOperatorDeclarations,
70807085 // If explicitly disabled, respect the flag.
70817086 if (!isDelayedParsingEnabled ())
70827087 return false ;
7083- // Recovering parser status later for #sourceLocation is not-trivial and
7084- // it may not worth it.
7085- if (InPoundLineEnvironment)
7086- return false ;
70877088
70887089 // Skip until the matching right curly bracket; if we find a pound directive,
70897090 // we can't lazily parse.
70907091 CancellableBacktrackingScope BackTrack (*this );
70917092 bool HasPoundDirective;
7093+ bool HasPoundSourceLocation;
70927094 bool HasNestedTypeDeclarations;
70937095 bool HasPotentialRegexLiteral;
70947096 skipUntilMatchingRBrace (*this ,
70957097 HasPoundDirective,
7098+ HasPoundSourceLocation,
70967099 HasOperatorDeclarations,
70977100 HasNestedClassDeclarations,
70987101 HasNestedTypeDeclarations,
70997102 HasPotentialRegexLiteral);
7100- if (!HasPoundDirective && !HasPotentialRegexLiteral)
7103+ if (!HasPoundDirective && !HasPotentialRegexLiteral) {
7104+ // If we didn't see any pound directive, we must not have seen
7105+ // #sourceLocation either.
7106+ ASSERT (!HasPoundSourceLocation);
71017107 BackTrack.cancelBacktrack ();
7108+ }
71027109 return !BackTrack.willBacktrack ();
71037110}
71047111
@@ -7694,17 +7701,20 @@ bool Parser::canDelayFunctionBodyParsing(bool &HasNestedTypeDeclarations) {
76947701 return false ;
76957702
76967703 // Skip until the matching right curly bracket; If it has a potential regex
7697- // literal, we can't skip. We don't care others, so just ignore them;
7704+ // literal, we can't skip. If there's a `#sourceLocation`, we also can't skip
7705+ // since we rely on setting and restoring state in the parser. Other cases we
7706+ // can handle.
76987707 CancellableBacktrackingScope BackTrack (*this );
76997708 consumeToken (tok::l_brace);
77007709 bool HasPoundDirectives;
7710+ bool HasPoundSourceLocation;
77017711 bool HasOperatorDeclarations;
77027712 bool HasNestedClassDeclarations;
77037713 bool HasPotentialRegexLiteral;
7704- skipUntilMatchingRBrace (*this , HasPoundDirectives, HasOperatorDeclarations ,
7705- HasNestedClassDeclarations, HasNestedTypeDeclarations ,
7706- HasPotentialRegexLiteral);
7707- if (HasPotentialRegexLiteral)
7714+ skipUntilMatchingRBrace (*this , HasPoundDirectives, HasPoundSourceLocation ,
7715+ HasOperatorDeclarations, HasNestedClassDeclarations ,
7716+ HasNestedTypeDeclarations, HasPotentialRegexLiteral);
7717+ if (HasPoundSourceLocation || HasPotentialRegexLiteral)
77087718 return false ;
77097719
77107720 BackTrack.cancelBacktrack ();
0 commit comments