Skip to content

Commit b1a939f

Browse files
Merge pull request #60795 from LucianoPAlmeida/parse-underscore
[Parse] Handle underscored integer in #sourceLocation line directive
2 parents 24dc203 + 5170a2e commit b1a939f

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

include/swift/Parse/Parser.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,6 +1653,8 @@ class Parser {
16531653
ParserResult<Expr> parseExprRegexLiteral();
16541654

16551655
StringRef copyAndStripUnderscores(StringRef text);
1656+
StringRef stripUnderscoresIfNeeded(StringRef text,
1657+
SmallVectorImpl<char> &buffer);
16561658

16571659
ParserStatus parseStringSegments(SmallVectorImpl<Lexer::StringSegment> &Segments,
16581660
Token EntireTok,

lib/Parse/ParseDecl.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5809,7 +5809,9 @@ ParserStatus Parser::parseLineDirective(bool isLine) {
58095809
diagnose(Tok, diag::expected_line_directive_number);
58105810
return makeParserError();
58115811
}
5812-
if (Tok.getText().getAsInteger(0, StartLine)) {
5812+
SmallString<16> buffer;
5813+
auto text = stripUnderscoresIfNeeded(Tok.getText(), buffer);
5814+
if (text.getAsInteger(0, StartLine)) {
58135815
diagnose(Tok, diag::expected_line_directive_number);
58145816
return makeParserError();
58155817
}
@@ -5840,7 +5842,9 @@ ParserStatus Parser::parseLineDirective(bool isLine) {
58405842
diagnose(Tok, diag::expected_line_directive_number);
58415843
return makeParserError();
58425844
}
5843-
if (Tok.getText().getAsInteger(0, StartLine)) {
5845+
SmallString<16> buffer;
5846+
auto text = stripUnderscoresIfNeeded(Tok.getText(), buffer);
5847+
if (text.getAsInteger(0, StartLine)) {
58445848
diagnose(Tok, diag::expected_line_directive_number);
58455849
return makeParserError();
58465850
}

lib/Parse/ParseExpr.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,6 +1009,17 @@ StringRef Parser::copyAndStripUnderscores(StringRef orig) {
10091009
return StringRef(start, p - start);
10101010
}
10111011

1012+
StringRef Parser::stripUnderscoresIfNeeded(StringRef text,
1013+
SmallVectorImpl<char> &buffer) {
1014+
if (text.contains('_')) {
1015+
buffer.clear();
1016+
llvm::copy_if(text, std::back_inserter(buffer),
1017+
[](char ch) { return ch != '_'; });
1018+
return StringRef(buffer.data(), buffer.size());
1019+
}
1020+
return text;
1021+
}
1022+
10121023
/// Disambiguate the parse after '{' token that is in a place that might be
10131024
/// the start of a trailing closure, or start the variable accessor block.
10141025
///

test/Parse/line-directive.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,13 @@ enum E {
6767
// CHECK: sr8772.swift:400:2: error: expected member name following '.'
6868
// CHECK: sr8772.swift:400:3: error: consecutive statements on a line must be separated by ';'
6969
// CHECK: sr8772.swift:400:3: error: expected expression
70+
71+
// https://github.com/apple/swift/issues/55049
72+
class I55049 {
73+
#sourceLocation(file: "issue-55049.swift", line: 1_000)
74+
let bar = 12
75+
#sourceLocation(file: "issue-55049.swift", line: 2_000)
76+
}
77+
78+
#line 1_000 "issue-55049.swift"
79+
class I55049_1 {}

0 commit comments

Comments
 (0)