Skip to content

Commit ef659c9

Browse files
authored
Merge pull request #2743 from guwirth/cpp23_extended_floating_point_types
C++23: floting point suffixes
2 parents df8b1e0 + f000b41 commit ef659c9

File tree

5 files changed

+54
-6
lines changed

5 files changed

+54
-6
lines changed

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,6 @@ conditional-escape-sequence-char:
9999
any member of the basic character set that is not an octal-digit, a simple-escape-sequence-char, or the
100100
characters N, o, u, U, or x
101101

102-
floating-point-suffix: one of
103-
f l f16 f32 f64 f128 bf16 F L F16 F32 F64 F128 BF16
104-
105102
s-char:
106103
basic-s-char
107104

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
@@ -51,7 +51,7 @@ public final class CxxLexerPool {
5151
private static final String EXPONENT = "[Ee][+-]?+[0-9_]([']?+[0-9_]++)*+";
5252
private static final String BINARY_EXPONENT = "[pP][+-]?+\\d([']?+\\d++)*+"; // since C++17
5353
//private static final String INTEGER_SUFFIX = "(((U|u)(i64|LL|ll|L|l)?)|((i64|LL|ll|L|l)(u|U)?)|((z|Z)(u|U)))";
54-
//private static final String FLOAT_SUFFIX = "(f|l|F|L)";
54+
//private static final String FLOAT_SUFFIX = "(f|l|F|L|f16|f32|f64|f128|bf16|F16|F32|F64|F128|BF16)";
5555
// ud-suffix: identifier (including INTEGER_SUFFIX, FLOAT_SUFFIX)
5656
private static final String UD_SUFFIX = "[_a-zA-Z]\\w*+";
5757
private static final String DECDIGIT_SEQUENCE = "\\d([']?+\\d++)*+";

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,13 +414,24 @@ void floating_point_literals() {
414414
LiteralValuesBuilder.builder("3.14e-10L").tokenValue("3.14e-10L").tokenType(CxxTokenType.NUMBER).build(),
415415
LiteralValuesBuilder.builder("3.14E-10L").tokenValue("3.14E-10L").tokenType(CxxTokenType.NUMBER).build(),
416416
LiteralValuesBuilder.builder("0e0L").tokenValue("0e0L").tokenType(CxxTokenType.NUMBER).build(),
417-
// c++17: hexadecimal floating literals
417+
// C++17: hexadecimal floating literals
418418
LiteralValuesBuilder.builder("0x1ffp10").tokenValue("0x1ffp10").tokenType(CxxTokenType.NUMBER).build(),
419419
LiteralValuesBuilder.builder("0X0p-1").tokenValue("0X0p-1").tokenType(CxxTokenType.NUMBER).build(),
420420
LiteralValuesBuilder.builder("0x1.p0").tokenValue("0x1.p0").tokenType(CxxTokenType.NUMBER).build(),
421421
LiteralValuesBuilder.builder("0xf.p-1").tokenValue("0xf.p-1").tokenType(CxxTokenType.NUMBER).build(),
422422
LiteralValuesBuilder.builder("0x0.123p-1").tokenValue("0x0.123p-1").tokenType(CxxTokenType.NUMBER).build(),
423-
LiteralValuesBuilder.builder("0xa.bp10l").tokenValue("0xa.bp10l").tokenType(CxxTokenType.NUMBER).build()
423+
LiteralValuesBuilder.builder("0xa.bp10l").tokenValue("0xa.bp10l").tokenType(CxxTokenType.NUMBER).build(),
424+
// C++23
425+
LiteralValuesBuilder.builder("1.f16").tokenValue("1.f16").tokenType(CxxTokenType.NUMBER).build(),
426+
LiteralValuesBuilder.builder("1.f32").tokenValue("1.f32").tokenType(CxxTokenType.NUMBER).build(),
427+
LiteralValuesBuilder.builder("1.f64").tokenValue("1.f64").tokenType(CxxTokenType.NUMBER).build(),
428+
LiteralValuesBuilder.builder("1.f128").tokenValue("1.f128").tokenType(CxxTokenType.NUMBER).build(),
429+
LiteralValuesBuilder.builder("1.bf16").tokenValue("1.bf16").tokenType(CxxTokenType.NUMBER).build(),
430+
LiteralValuesBuilder.builder("1.F16").tokenValue("1.F16").tokenType(CxxTokenType.NUMBER).build(),
431+
LiteralValuesBuilder.builder("1.F32").tokenValue("1.F32").tokenType(CxxTokenType.NUMBER).build(),
432+
LiteralValuesBuilder.builder("1.F64").tokenValue("1.F64").tokenType(CxxTokenType.NUMBER).build(),
433+
LiteralValuesBuilder.builder("1.F128").tokenValue("1.F128").tokenType(CxxTokenType.NUMBER).build(),
434+
LiteralValuesBuilder.builder("1.BF16").tokenValue("1.BF16").tokenType(CxxTokenType.NUMBER).build()
424435
));
425436

426437
values.forEach(value

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,21 @@ void numbers() {
8181
assertThat(evaluate("0x1ZU")).isTrue();
8282
assertThat(evaluate("0b1z")).isTrue();
8383
assertThat(evaluate("0b1ZU")).isTrue();
84+
assertThat(evaluate("1.")).isTrue();
85+
assertThat(evaluate("1.f")).isTrue();
86+
assertThat(evaluate("1.F")).isTrue();
87+
assertThat(evaluate("1.l")).isTrue();
88+
assertThat(evaluate("1.L")).isTrue();
89+
assertThat(evaluate("1.f16")).isTrue();
90+
assertThat(evaluate("1.f32")).isTrue();
91+
assertThat(evaluate("1.f64")).isTrue();
92+
assertThat(evaluate("1.f128")).isTrue();
93+
assertThat(evaluate("1.bf16")).isTrue();
94+
assertThat(evaluate("1.F16")).isTrue();
95+
assertThat(evaluate("1.F32")).isTrue();
96+
assertThat(evaluate("1.F64")).isTrue();
97+
assertThat(evaluate("1.F128")).isTrue();
98+
assertThat(evaluate("1.BF16")).isTrue();
8499

85100
assertThat(evaluate("0")).isFalse();
86101
assertThat(evaluate("0x0")).isFalse();
@@ -91,6 +106,21 @@ void numbers() {
91106
assertThat(evaluate("0x0ZU")).isFalse();
92107
assertThat(evaluate("0b0z")).isFalse();
93108
assertThat(evaluate("0b0ZU")).isFalse();
109+
assertThat(evaluate("0.")).isFalse();
110+
assertThat(evaluate("0.f")).isFalse();
111+
assertThat(evaluate("0.F")).isFalse();
112+
assertThat(evaluate("0.l")).isFalse();
113+
assertThat(evaluate("0.L")).isFalse();
114+
assertThat(evaluate("0.f16")).isFalse();
115+
assertThat(evaluate("0.f32")).isFalse();
116+
assertThat(evaluate("0.f64")).isFalse();
117+
assertThat(evaluate("0.f128")).isFalse();
118+
assertThat(evaluate("0.bf16")).isFalse();
119+
assertThat(evaluate("0.F16")).isFalse();
120+
assertThat(evaluate("0.F32")).isFalse();
121+
assertThat(evaluate("0.F64")).isFalse();
122+
assertThat(evaluate("0.F128")).isFalse();
123+
assertThat(evaluate("0.BF16")).isFalse();
94124
}
95125

96126
@Test
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
std::float16_t f = 58.f16;
2+
std::float16_t f = 0x1p5F16;
3+
std::float32_t f = 4e2f32;
4+
std::float32_t f = 1.18e-4932lF32;
5+
std::float64_t f = 123.456e-67f64;
6+
std::float64_t f = 0.1F64;
7+
std::float128_t f = .1E4f128;
8+
std::float128_t f = .1F128;
9+
std::bfloat16_t f = 3.14'15'92bf16;
10+
std::bfloat16_t f = -10.0BF16;

0 commit comments

Comments
 (0)