@@ -5620,11 +5620,13 @@ static void diagnoseOperatorFixityAttributes(Parser &P,
5620
5620
5621
5621
static unsigned skipUntilMatchingRBrace (Parser &P,
5622
5622
bool &HasPoundDirective,
5623
+ bool &HasPoundSourceLocation,
5623
5624
bool &HasOperatorDeclarations,
5624
5625
bool &HasNestedClassDeclarations,
5625
5626
bool &HasNestedTypeDeclarations,
5626
5627
bool &HasPotentialRegexLiteral) {
5627
5628
HasPoundDirective = false ;
5629
+ HasPoundSourceLocation = false ;
5628
5630
HasOperatorDeclarations = false ;
5629
5631
HasNestedClassDeclarations = false ;
5630
5632
HasNestedTypeDeclarations = false ;
@@ -5646,8 +5648,11 @@ static unsigned skipUntilMatchingRBrace(Parser &P,
5646
5648
5647
5649
HasNestedClassDeclarations |= P.Tok .is (tok::kw_class);
5648
5650
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);
5651
5656
5652
5657
HasNestedTypeDeclarations |= P.Tok .isAny (tok::kw_class, tok::kw_struct,
5653
5658
tok::kw_enum, tok::kw_typealias,
@@ -7080,25 +7085,27 @@ bool Parser::canDelayMemberDeclParsing(bool &HasOperatorDeclarations,
7080
7085
// If explicitly disabled, respect the flag.
7081
7086
if (!isDelayedParsingEnabled ())
7082
7087
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 ;
7087
7088
7088
7089
// Skip until the matching right curly bracket; if we find a pound directive,
7089
7090
// we can't lazily parse.
7090
7091
CancellableBacktrackingScope BackTrack (*this );
7091
7092
bool HasPoundDirective;
7093
+ bool HasPoundSourceLocation;
7092
7094
bool HasNestedTypeDeclarations;
7093
7095
bool HasPotentialRegexLiteral;
7094
7096
skipUntilMatchingRBrace (*this ,
7095
7097
HasPoundDirective,
7098
+ HasPoundSourceLocation,
7096
7099
HasOperatorDeclarations,
7097
7100
HasNestedClassDeclarations,
7098
7101
HasNestedTypeDeclarations,
7099
7102
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);
7101
7107
BackTrack.cancelBacktrack ();
7108
+ }
7102
7109
return !BackTrack.willBacktrack ();
7103
7110
}
7104
7111
@@ -7694,17 +7701,20 @@ bool Parser::canDelayFunctionBodyParsing(bool &HasNestedTypeDeclarations) {
7694
7701
return false ;
7695
7702
7696
7703
// 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.
7698
7707
CancellableBacktrackingScope BackTrack (*this );
7699
7708
consumeToken (tok::l_brace);
7700
7709
bool HasPoundDirectives;
7710
+ bool HasPoundSourceLocation;
7701
7711
bool HasOperatorDeclarations;
7702
7712
bool HasNestedClassDeclarations;
7703
7713
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)
7708
7718
return false ;
7709
7719
7710
7720
BackTrack.cancelBacktrack ();
0 commit comments