[C++] Fix union type handling on object api in C++17 (#6745)

This commit is contained in:
Taiju Tsuiki
2021-07-25 18:20:34 +09:00
committed by GitHub
parent 12e341e4f8
commit 8be8a0a713
8 changed files with 872 additions and 19 deletions

View File

@@ -929,10 +929,12 @@ class CppGenerator : public BaseGenerator {
}
std::string UnionVectorVerifySignature(const EnumDef &enum_def) {
return "bool Verify" + Name(enum_def) + "Vector" +
auto name = Name(enum_def);
auto type = opts_.scoped_enums ? name : "uint8_t";
return "bool Verify" + name + "Vector" +
"(flatbuffers::Verifier &verifier, " +
"const flatbuffers::Vector<flatbuffers::Offset<void>> *values, " +
"const flatbuffers::Vector<uint8_t> *types)";
"const flatbuffers::Vector<" + type + "> *types)";
}
std::string UnionUnPackSignature(const EnumDef &enum_def, bool inclass) {
@@ -2941,10 +2943,15 @@ class CppGenerator : public BaseGenerator {
}
case BASE_TYPE_UTYPE: {
value = StripUnionType(value);
code += "_fbb.CreateVector<uint8_t>(" + value +
".size(), [](size_t i, _VectorArgs *__va) { "
"return static_cast<uint8_t>(__va->_" +
value + "[i].type); }, &_va)";
auto type = opts_.scoped_enums ? Name(*field.value.type.enum_def)
: "uint8_t";
auto enum_value = "__va->_" + value + "[i].type";
if (!opts_.scoped_enums)
enum_value = "static_cast<uint8_t>(" + enum_value + ")";
code += "_fbb.CreateVector<" + type + ">(" + value +
".size(), [](size_t i, _VectorArgs *__va) { return " +
enum_value + "; }, &_va)";
break;
}
default: {