Skip to content

Commit fa4b888

Browse files
authored
Fix string literals with prefix, closes #298 (#299)
* Fix parsing of string literals with prefix The current solution use '"' as opening sequence for all strings. It should use different opening sequence depending on prefix. This fix corrects this behaviour - original opening is used. * Add regression tests
1 parent 5a0d77f commit fa4b888

13 files changed

+50
-1
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
main: () = {
2+
s1 := u"u\"";
3+
s2 := U"U\"";
4+
s3 := u8"u8\"";
5+
s4 := L"L\"";
6+
s5 := R"(R")";
7+
s6 := uR"(uR")";
8+
s7 := u8R"(u8R")";
9+
s8 := UR"(UR")";
10+
s9 := LR"(LR")";
11+
}

regression-tests/test-results/apple-clang-14/pure2-various-string-literals.cpp.execution

Whitespace-only changes.

regression-tests/test-results/apple-clang-14/pure2-various-string-literals.cpp.output

Whitespace-only changes.

regression-tests/test-results/clang-12/pure2-various-string-literals.cpp.execution

Whitespace-only changes.

regression-tests/test-results/clang-12/pure2-various-string-literals.cpp.output

Whitespace-only changes.

regression-tests/test-results/gcc-10/pure2-various-string-literals.cpp.execution

Whitespace-only changes.

regression-tests/test-results/gcc-10/pure2-various-string-literals.cpp.output

Whitespace-only changes.

regression-tests/test-results/msvc-2022/pure2-various-string-literals.cpp.execution

Whitespace-only changes.

regression-tests/test-results/msvc-2022/pure2-various-string-literals.cpp.output

Whitespace-only changes.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
2+
#define CPP2_USE_MODULES Yes
3+
4+
#include "cpp2util.h"
5+
6+
#line 1 "pure2-various-string-literals.cpp2"
7+
auto main() -> int;
8+
9+
//=== Cpp2 definitions ==========================================================
10+
11+
#line 1 "pure2-various-string-literals.cpp2"
12+
auto main() -> int{
13+
auto s1 {u"u\""};
14+
auto s2 {U"U\""};
15+
auto s3 {u8"u8\""};
16+
auto s4 {L"L\""};
17+
auto s5 {R"(R")"};
18+
auto s6 {uR"(uR")"};
19+
auto s7 {u8R"(u8R")"};
20+
auto s8 {UR"(UR")"};
21+
auto s9 {LR"(LR")"};
22+
}
23+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
main: () = {
2+
s1 := u"u\"";
3+
s2 := U"U\"";
4+
s3 := u8"u8\"";
5+
s4 := L"L\"";
6+
s5 := R"(R")";
7+
s6 := uR"(uR")";
8+
s7 := u8R"(u8R")";
9+
s8 := UR"(UR")";
10+
s9 := LR"(LR")";
11+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pure2-various-string-literals.cpp2... ok (all Cpp2, passes safety checks)
2+

source/lex.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,9 @@ auto expand_string_literal(
373373
++pos;
374374
auto current_start = pos; // the current offset before which the string has been added to ret
375375

376-
auto parts = string_parts{"\"", "\"", string_parts::on_both_ends};
376+
auto parts = string_parts{std::string(text.substr(0, current_start)), // begin sequence ", U", u8" depends on the string type
377+
"\"", // end sequence
378+
string_parts::on_both_ends}; // add opening and closing sequence to generated string
377379

378380
// Now we're on the first character of the string itself
379381
for (

0 commit comments

Comments
 (0)