diff --git a/jvm/src/test/scala/io/kaitai/struct/translators/TranslatorSpec.scala b/jvm/src/test/scala/io/kaitai/struct/translators/TranslatorSpec.scala index a7ff883d0..0514c8ea6 100644 --- a/jvm/src/test/scala/io/kaitai/struct/translators/TranslatorSpec.scala +++ b/jvm/src/test/scala/io/kaitai/struct/translators/TranslatorSpec.scala @@ -854,7 +854,7 @@ class TranslatorSpec extends AnyFunSpec { describe("to do type enforcement") { // type enforcement: casting to non-literal byte array full("[0 + 1, 5].as", CalcIntType, CalcBytesType, ResultMap( - CppCompiler -> "???", + CppCompiler -> "std::string({static_cast(0 + 1), static_cast(5)})", CSharpCompiler -> "new byte[] { 0 + 1, 5 }", GoCompiler -> "[]uint8{0 + 1, 5}", JavaCompiler -> "new byte[] { 0 + 1, 5 }", diff --git a/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala b/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala index 197192cf8..4b160487d 100644 --- a/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala +++ b/shared/src/main/scala/io/kaitai/struct/translators/CppTranslator.scala @@ -113,12 +113,22 @@ class CppTranslator(provider: TypeProvider, importListSrc: CppImportList, import // TODO: C++14 } } else { - throw new RuntimeException("C++ literal arrays are not implemented yet") + throw new RuntimeException("literal arrays are not implemented yet in C++98") } } override def doByteArrayLiteral(arr: Seq[Byte]): String = "std::string(\"" + Utils.hexEscapeByteArray(arr) + "\", " + arr.length + ")" + override def doByteArrayNonLiteral(values: Seq[Ast.expr]): String = { + // It is assumed that every expression produces integer in the range [0; 255] + if (config.cppConfig.useListInitializers) { + "std::string({" + values.map(value => s"static_cast(${translate(value)})").mkString(", ") + "})" + } else { + // TODO: We need to produce an expression, but this is possible only with initializer lists + // or variadic templates (if use a helper function) which both available only since C++11 + throw new RuntimeException("literal byte arrays are not implemented yet in C++98") + } + } override def genericBinOp(left: Ast.expr, op: Ast.operator, right: Ast.expr, extPrec: Int) = { (detectType(left), detectType(right), op) match {