Skip to content

Commit 481d82b

Browse files
committed
Recognize literal encoding-prefixes also in the brace-match to find end of a top-level Cpp2 declaration
Closes #1142
1 parent 0820ccb commit 481d82b

File tree

5 files changed

+53
-27
lines changed

5 files changed

+53
-27
lines changed

regression-tests/test-results/version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
cppfront compiler v0.7.0 Build 9712:0834
2+
cppfront compiler v0.7.0 Build 9712:0914
33
Copyright(c) Herb Sutter All rights reserved
44

55
SPDX-License-Identifier: CC-BY-NC-ND-4.0

source/build.info

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
"9712:0850"
1+
"9712:0914"

source/common.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,46 @@ auto is_separator_or(auto pred, char c)
375375
}
376376

377377

378+
auto peek(
379+
std::string_view line,
380+
int i,
381+
int num
382+
)
383+
{
384+
return
385+
(i + num < std::ssize(line) && i + num >= 0)
386+
? line[i + num]
387+
: '\0';
388+
}
389+
390+
391+
//G encoding-prefix: one of
392+
//G 'u8' 'u' 'uR' 'u8R' 'U' 'UR' 'L' 'LR' 'R'
393+
//G
394+
auto is_encoding_prefix_and(std::string_view line, int i, char next) {
395+
auto peek1 = peek(line, i, 1);
396+
auto peek2 = peek(line, i, 2);
397+
auto peek3 = peek(line, i, 3);
398+
if (line[i] == next) { return 1; } // "
399+
else if (line[i] == 'u') {
400+
if (peek1 == next) { return 2; } // u"
401+
else if (peek1 == '8' && peek2 == next) { return 3; } // u8"
402+
else if (peek1 == 'R' && peek2 == next) { return 3; } // uR"
403+
else if (peek1 == '8' && peek2 == 'R' && peek3 == next) { return 4; } // u8R"
404+
}
405+
else if (line[i] == 'U') {
406+
if (peek1 == next) { return 2; } // U"
407+
else if (peek1 == 'R' && peek2 == next) { return 3; } // UR"
408+
}
409+
else if (line[i] == 'L') {
410+
if (peek1 == next) { return 2; } // L"
411+
else if (peek1 == 'R' && peek2 == next) { return 3; } // LR"
412+
}
413+
else if (line[i] == 'R' && peek1 == next) { return 2; } // R"
414+
return 0;
415+
};
416+
417+
378418
// Bool to string
379419
//
380420
template<typename T>

source/io.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,15 @@ auto process_cpp2_line(
741741
break;default: ;
742742
}
743743
}
744+
else if (
745+
auto j = is_encoding_prefix_and(line, i, '\'');
746+
j > 1
747+
)
748+
{
749+
in_char_literal = true;
750+
i += j-1;
751+
prev = line[i-1];
752+
}
744753
else
745754
{
746755
switch (line[i])

source/lex.h

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,29 +1236,6 @@ auto lex_line(
12361236
auto peek2 = peek(2);
12371237
auto peek3 = peek(3);
12381238

1239-
//G encoding-prefix: one of
1240-
//G 'u8' 'u' 'uR' 'u8R' 'U' 'UR' 'L' 'LR' 'R'
1241-
//G
1242-
auto is_encoding_prefix_and = [&](char next) {
1243-
if (line[i] == next) { return 1; } // "
1244-
else if (line[i] == 'u') {
1245-
if (peek1 == next) { return 2; } // u"
1246-
else if (peek1 == '8' && peek2 == next) { return 3; } // u8"
1247-
else if (peek1 == 'R' && peek2 == next) { return 3; } // uR"
1248-
else if (peek1 == '8' && peek2 == 'R' && peek3 == next) { return 4; } // u8R"
1249-
}
1250-
else if (line[i] == 'U') {
1251-
if ( peek1 == next) { return 2; } // U"
1252-
else if (peek1 == 'R' && peek2 == next) { return 3; } // UR"
1253-
}
1254-
else if (line[i] == 'L') {
1255-
if ( peek1 == next ) { return 2; } // L"
1256-
else if (peek1 == 'R' && peek2 == next) { return 3; } // LR"
1257-
}
1258-
else if (line[i] == 'R' && peek1 == next) { return 2; } // R"
1259-
return 0;
1260-
};
1261-
12621239
// If we're currently in a multiline comment,
12631240
// the only thing to look for is the */ comment end
12641241
//
@@ -1728,7 +1705,7 @@ auto lex_line(
17281705
//G interpolation:
17291706
//G '(' expression ')' '$'
17301707
//G
1731-
else if (auto j = is_encoding_prefix_and('\"')) {
1708+
else if (auto j = is_encoding_prefix_and(line, i, '\"')) {
17321709
// if peek(j-2) is 'R' it means that we deal with raw-string literal
17331710
if (peek(j-2) == 'R') {
17341711
auto seq_pos = i + j;
@@ -1805,7 +1782,7 @@ auto lex_line(
18051782
//G c-char
18061783
//G c-char-seq c-char
18071784
//G
1808-
else if (auto j = is_encoding_prefix_and('\'')) {
1785+
else if (auto j = is_encoding_prefix_and(line, i, '\'')) {
18091786
auto len = peek_is_sc_char(j, '\'');
18101787
if (len > 0) {
18111788
j += len;

0 commit comments

Comments
 (0)