Skip to content

Commit df8b1e0

Browse files
authored
Merge pull request #2742 from guwirth/cpp23-literal-suffix-size_t
C++23: literal suffix for (signed) size_t
2 parents 34c41b1 + 960d74a commit df8b1e0

File tree

5 files changed

+59
-16
lines changed

5 files changed

+59
-16
lines changed

cxx-squid/dox/diff-cpp20-cpp23_grammar.txt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,6 @@ identifier-continue:
5454
nondigit
5555
an element of the translation character set with the Unicode property XID_Continue
5656

57-
integer-suffix:
58-
unsigned-suffix long-suffixopt
59-
unsigned-suffix long-long-suffixopt
60-
unsigned-suffix size-suffixopt
61-
long-suffix unsigned-suffixopt
62-
long-long-suffix unsigned-suffixopt
63-
size-suffix unsigned-suffixopt
64-
65-
size-suffix: one of
66-
z Z
67-
6857
c-char:
6958
basic-c-char
7059
escape-sequence

cxx-squid/src/main/java/org/sonar/cxx/parser/CxxLexerPool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public final class CxxLexerPool {
5050
private static final String BIN_PREFIX = "0[bB]";
5151
private static final String EXPONENT = "[Ee][+-]?+[0-9_]([']?+[0-9_]++)*+";
5252
private static final String BINARY_EXPONENT = "[pP][+-]?+\\d([']?+\\d++)*+"; // since C++17
53-
//private static final String INTEGER_SUFFIX = "(((U|u)(i64|LL|ll|L|l)?)|((i64|LL|ll|L|l)(u|U)?))";
53+
//private static final String INTEGER_SUFFIX = "(((U|u)(i64|LL|ll|L|l)?)|((i64|LL|ll|L|l)(u|U)?)|((z|Z)(u|U)))";
5454
//private static final String FLOAT_SUFFIX = "(f|l|F|L)";
5555
// ud-suffix: identifier (including INTEGER_SUFFIX, FLOAT_SUFFIX)
5656
private static final String UD_SUFFIX = "[_a-zA-Z]\\w*+";

cxx-squid/src/test/java/org/sonar/cxx/lexer/CxxLexerTest.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,14 @@ void decimal_integer_literals() {
132132
LiteralValuesBuilder.builder("7LLU").tokenValue("7LLU").tokenType(CxxTokenType.NUMBER).build(),
133133
// With Microsoft specific 64-bit integer-suffix: i64
134134
LiteralValuesBuilder.builder("7i64").tokenValue("7i64").tokenType(CxxTokenType.NUMBER).build(),
135-
LiteralValuesBuilder.builder("7ui64").tokenValue("7ui64").tokenType(CxxTokenType.NUMBER).build()
135+
LiteralValuesBuilder.builder("7ui64").tokenValue("7ui64").tokenType(CxxTokenType.NUMBER).build(),
136+
// C++23
137+
LiteralValuesBuilder.builder("7z").tokenValue("7z").tokenType(CxxTokenType.NUMBER).build(),
138+
LiteralValuesBuilder.builder("7uz").tokenValue("7uz").tokenType(CxxTokenType.NUMBER).build(),
139+
LiteralValuesBuilder.builder("7zu").tokenValue("7zu").tokenType(CxxTokenType.NUMBER).build(),
140+
LiteralValuesBuilder.builder("7Z").tokenValue("7Z").tokenType(CxxTokenType.NUMBER).build(),
141+
LiteralValuesBuilder.builder("7UZ").tokenValue("7UZ").tokenType(CxxTokenType.NUMBER).build(),
142+
LiteralValuesBuilder.builder("7ZU").tokenValue("7ZU").tokenType(CxxTokenType.NUMBER).build()
136143
));
137144

138145
values.forEach(value
@@ -179,7 +186,14 @@ void octal_integer_literals() {
179186
LiteralValuesBuilder.builder("07LLU").tokenValue("07LLU").tokenType(CxxTokenType.NUMBER).build(),
180187
// With Microsoft specific 64-bit integer-suffix: i64
181188
LiteralValuesBuilder.builder("07i64").tokenValue("07i64").tokenType(CxxTokenType.NUMBER).build(),
182-
LiteralValuesBuilder.builder("07ui64").tokenValue("07ui64").tokenType(CxxTokenType.NUMBER).build()
189+
LiteralValuesBuilder.builder("07ui64").tokenValue("07ui64").tokenType(CxxTokenType.NUMBER).build(),
190+
// C++23
191+
LiteralValuesBuilder.builder("07z").tokenValue("07z").tokenType(CxxTokenType.NUMBER).build(),
192+
LiteralValuesBuilder.builder("07uz").tokenValue("07uz").tokenType(CxxTokenType.NUMBER).build(),
193+
LiteralValuesBuilder.builder("07zu").tokenValue("07zu").tokenType(CxxTokenType.NUMBER).build(),
194+
LiteralValuesBuilder.builder("07Z").tokenValue("07Z").tokenType(CxxTokenType.NUMBER).build(),
195+
LiteralValuesBuilder.builder("07UZ").tokenValue("07UZ").tokenType(CxxTokenType.NUMBER).build(),
196+
LiteralValuesBuilder.builder("07ZU").tokenValue("07ZU").tokenType(CxxTokenType.NUMBER).build()
183197
));
184198

185199
values.forEach(value
@@ -226,7 +240,14 @@ void hex_integer_literals() {
226240
LiteralValuesBuilder.builder("0x7LLU").tokenValue("0x7LLU").tokenType(CxxTokenType.NUMBER).build(),
227241
// With Microsoft specific 64-bit integer-suffix: i64
228242
LiteralValuesBuilder.builder("0x7i64").tokenValue("0x7i64").tokenType(CxxTokenType.NUMBER).build(),
229-
LiteralValuesBuilder.builder("0x7ui64").tokenValue("0x7ui64").tokenType(CxxTokenType.NUMBER).build()
243+
LiteralValuesBuilder.builder("0x7ui64").tokenValue("0x7ui64").tokenType(CxxTokenType.NUMBER).build(),
244+
// C++23
245+
LiteralValuesBuilder.builder("0x7z").tokenValue("0x7z").tokenType(CxxTokenType.NUMBER).build(),
246+
LiteralValuesBuilder.builder("0x7uz").tokenValue("0x7uz").tokenType(CxxTokenType.NUMBER).build(),
247+
LiteralValuesBuilder.builder("0x7zu").tokenValue("0x7zu").tokenType(CxxTokenType.NUMBER).build(),
248+
LiteralValuesBuilder.builder("0x7Z").tokenValue("0x7Z").tokenType(CxxTokenType.NUMBER).build(),
249+
LiteralValuesBuilder.builder("0x7UZ").tokenValue("0x7UZ").tokenType(CxxTokenType.NUMBER).build(),
250+
LiteralValuesBuilder.builder("0x7ZU").tokenValue("0x7ZU").tokenType(CxxTokenType.NUMBER).build()
230251
));
231252

232253
values.forEach(value
@@ -243,7 +264,14 @@ void bin_integer_literals() {
243264
// bin integer
244265
LiteralValuesBuilder.builder("0b0").tokenValue("0b0").tokenType(CxxTokenType.NUMBER).build(),
245266
LiteralValuesBuilder.builder("0B1").tokenValue("0B1").tokenType(CxxTokenType.NUMBER).build(),
246-
LiteralValuesBuilder.builder("0b10101001").tokenValue("0b10101001").tokenType(CxxTokenType.NUMBER).build()
267+
LiteralValuesBuilder.builder("0b10101001").tokenValue("0b10101001").tokenType(CxxTokenType.NUMBER).build(),
268+
// C++23
269+
LiteralValuesBuilder.builder("0b1z").tokenValue("0b1z").tokenType(CxxTokenType.NUMBER).build(),
270+
LiteralValuesBuilder.builder("0b1uz").tokenValue("0b1uz").tokenType(CxxTokenType.NUMBER).build(),
271+
LiteralValuesBuilder.builder("0b1zu").tokenValue("0b1zu").tokenType(CxxTokenType.NUMBER).build(),
272+
LiteralValuesBuilder.builder("0b1Z").tokenValue("0b1Z").tokenType(CxxTokenType.NUMBER).build(),
273+
LiteralValuesBuilder.builder("0b1UZ").tokenValue("0b1UZ").tokenType(CxxTokenType.NUMBER).build(),
274+
LiteralValuesBuilder.builder("0b1ZU").tokenValue("0b1ZU").tokenType(CxxTokenType.NUMBER).build()
247275
));
248276

249277
values.forEach(value

cxx-squid/src/test/java/org/sonar/cxx/preprocessor/PPExpressionTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,22 @@ void numbers() {
7575
assertThat(evaluate("0xffffffffffffffffui64")).isTrue();
7676
assertThat(evaluate("0xffffffffffffffffi64")).isTrue();
7777
assertThat(evaluate("0x7FFFFFL")).isTrue();
78+
assertThat(evaluate("1z")).isTrue();
79+
assertThat(evaluate("1ZU")).isTrue();
80+
assertThat(evaluate("0x1z")).isTrue();
81+
assertThat(evaluate("0x1ZU")).isTrue();
82+
assertThat(evaluate("0b1z")).isTrue();
83+
assertThat(evaluate("0b1ZU")).isTrue();
7884

7985
assertThat(evaluate("0")).isFalse();
8086
assertThat(evaluate("0x0")).isFalse();
87+
assertThat(evaluate("0b0")).isFalse();
88+
assertThat(evaluate("0z")).isFalse();
89+
assertThat(evaluate("0ZU")).isFalse();
90+
assertThat(evaluate("0x0z")).isFalse();
91+
assertThat(evaluate("0x0ZU")).isFalse();
92+
assertThat(evaluate("0b0z")).isFalse();
93+
assertThat(evaluate("0b0ZU")).isFalse();
8194
}
8295

8396
@Test
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
auto a = 0z;
2+
auto b = 0zu;
3+
auto c = 0uz;
4+
5+
auto d = 0Z;
6+
auto e = 0ZU;
7+
auto f = 0UZ;
8+
9+
void foo() {
10+
for (auto i = 0zu; i < v.size(); ++i) {
11+
std::cout << i << ": " << v[i] << '\n';
12+
}
13+
}

0 commit comments

Comments
 (0)