From 248eba487a966ac2838599a048ffd11da5176326 Mon Sep 17 00:00:00 2001 From: Andrew Schwartz Date: Sat, 28 Mar 2026 06:45:12 -0700 Subject: [PATCH 1/2] [C++] gate constexpr char-constant accessor on c++14 --- .../sbe/generation/cpp/CppGenerator.java | 11 ++++++-- .../sbe/generation/cpp/CppGeneratorTest.java | 27 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java index 3ee0208cbb..ae795aeaeb 100755 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java @@ -2630,12 +2630,19 @@ private void generateConstPropertyMethods( values); sb.append(String.format("\n" + + indent + " #if __cplusplus >= 201402L\n" + + indent + " SBE_NODISCARD static SBE_CONSTEXPR %1$s %2$s(const std::uint64_t index) SBE_NOEXCEPT\n" + + indent + " {\n" + + indent + " const std::uint8_t %2$sValues[] = { %3$s, 0 };\n\n" + + indent + " return (char)%2$sValues[index];\n" + + indent + " }\n" + + indent + " #else\n" + indent + " SBE_NODISCARD %1$s %2$s(const std::uint64_t index) const\n" + indent + " {\n" + indent + " static const std::uint8_t %2$sValues[] = { %3$s, 0 };\n\n" + - indent + " return (char)%2$sValues[index];\n" + - indent + " }\n", + indent + " }\n" + + indent + " #endif\n", cppTypeName, propertyName, values)); diff --git a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java index 2cdb37ecce..8d0b3995fa 100644 --- a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java +++ b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java @@ -75,6 +75,33 @@ void shouldUseConstexprWhenInitializingSemanticVersion() throws Exception } } + @Test + void shouldGenerateConstexprConstantCharAccessorOnlyForCpp14AndLater() throws Exception + { + try (InputStream in = Tests.getLocalResource("code-generation-schema.xml")) + { + final ParserOptions options = ParserOptions.builder().stopOnError(true).build(); + final MessageSchema schema = parse(in, options); + final IrGenerator irg = new IrGenerator(); + final Ir ir = irg.generate(schema); + final StringWriterOutputManager outputManager = new StringWriterOutputManager(); + outputManager.setPackageName(ir.applicableNamespace()); + + final CppGenerator generator = new CppGenerator(ir, false, outputManager); + generator.generate(); + + final String source = outputManager.getSource("code.generation.test.Engine").toString(); + assertThat(source, containsString("#if __cplusplus >= 201402L")); + assertThat(source, containsString( + "SBE_NODISCARD static SBE_CONSTEXPR char fuel(const std::uint64_t index) SBE_NOEXCEPT")); + assertThat(source, containsString("const std::uint8_t fuelValues[] = { 80, 101, 116, 114, 111, 108, 0 };")); + assertThat(source, containsString("#else")); + assertThat(source, containsString("SBE_NODISCARD char fuel(const std::uint64_t index) const")); + assertThat(source, containsString( + "static const std::uint8_t fuelValues[] = { 80, 101, 116, 114, 111, 108, 0 };")); + } + } + @Test void dtosShouldReferenceTypesInDifferentPackages() throws Exception { From e8e26c2be4b79bf9c021b6ab3fb103f03cf774d8 Mon Sep 17 00:00:00 2001 From: Andrew Schwartz Date: Sat, 28 Mar 2026 07:09:28 -0700 Subject: [PATCH 2/2] [C++] initialize test buffer before manufacturer code read --- sbe-tool/src/test/c/CodeGenTest.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sbe-tool/src/test/c/CodeGenTest.cpp b/sbe-tool/src/test/c/CodeGenTest.cpp index 4135804ad3..474915d769 100644 --- a/sbe-tool/src/test/c/CodeGenTest.cpp +++ b/sbe-tool/src/test/c/CodeGenTest.cpp @@ -253,6 +253,7 @@ class CodeGenTest : public testing::Test output << static_cast(CGT(car_discountedModel(&car))) << ';'; char code_buf[4]; + memset(code_buf, 0, sizeof(code_buf)); CGT(engine) engine = {}; if (CGT(car_engine)(&car, &engine)) { @@ -354,6 +355,7 @@ class CodeGenTest : public testing::Test } char code_buf[4]; + memset(code_buf, 0, sizeof(code_buf)); CGT(engine) engine = {}; if (CGT(car_engine)(&car, &engine)) {