mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-25 22:08:39 +00:00
Fix generation of C++ code with Optional<Enum> (#6155)
This commit is contained in:
@@ -1598,7 +1598,9 @@ class CppGenerator : public BaseGenerator {
|
|||||||
|
|
||||||
std::string GetDefaultScalarValue(const FieldDef &field, bool is_ctor) {
|
std::string GetDefaultScalarValue(const FieldDef &field, bool is_ctor) {
|
||||||
const auto &type = field.value.type;
|
const auto &type = field.value.type;
|
||||||
if (type.enum_def && IsScalar(type.base_type)) {
|
if (field.IsScalarOptional()) {
|
||||||
|
return GenOptionalNull();
|
||||||
|
} else if (type.enum_def && IsScalar(type.base_type)) {
|
||||||
auto ev = type.enum_def->FindByValue(field.value.constant);
|
auto ev = type.enum_def->FindByValue(field.value.constant);
|
||||||
if (ev) {
|
if (ev) {
|
||||||
return WrapInNameSpace(type.enum_def->defined_namespace,
|
return WrapInNameSpace(type.enum_def->defined_namespace,
|
||||||
@@ -1620,8 +1622,7 @@ class CppGenerator : public BaseGenerator {
|
|||||||
return "0";
|
return "0";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return field.IsScalarOptional() ? GenOptionalNull()
|
return GenDefaultConstant(field);
|
||||||
: GenDefaultConstant(field);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1647,13 +1648,11 @@ class CppGenerator : public BaseGenerator {
|
|||||||
code_.SetValue("PARAM_VALUE", "nullptr");
|
code_.SetValue("PARAM_VALUE", "nullptr");
|
||||||
} else {
|
} else {
|
||||||
const auto &type = field.value.type;
|
const auto &type = field.value.type;
|
||||||
if (field.IsScalarOptional()) {
|
code_.SetValue("PARAM_VALUE", GetDefaultScalarValue(field, false));
|
||||||
|
if (field.IsScalarOptional())
|
||||||
code_.SetValue("PARAM_TYPE", GenOptionalDecl(type));
|
code_.SetValue("PARAM_TYPE", GenOptionalDecl(type));
|
||||||
code_.SetValue("PARAM_VALUE", GenOptionalNull());
|
else
|
||||||
} else {
|
|
||||||
code_.SetValue("PARAM_TYPE", GenTypeWire(type, " ", true));
|
code_.SetValue("PARAM_TYPE", GenTypeWire(type, " ", true));
|
||||||
code_.SetValue("PARAM_VALUE", GetDefaultScalarValue(field, false));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
code_ += "{{PRE}}{{PARAM_TYPE}}{{PARAM_NAME}} = {{PARAM_VALUE}}\\";
|
code_ += "{{PRE}}{{PARAM_TYPE}}{{PARAM_NAME}} = {{PARAM_VALUE}}\\";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ struct ScalarStuffT : public flatbuffers::NativeTable {
|
|||||||
flatbuffers::Optional<double> maybe_f64 = flatbuffers::nullopt;
|
flatbuffers::Optional<double> maybe_f64 = flatbuffers::nullopt;
|
||||||
double default_f64 = 42.0;
|
double default_f64 = 42.0;
|
||||||
bool just_bool = false;
|
bool just_bool = false;
|
||||||
flatbuffers::Optional<bool> maybe_bool = true;
|
flatbuffers::Optional<bool> maybe_bool = flatbuffers::nullopt;
|
||||||
bool default_bool = true;
|
bool default_bool = true;
|
||||||
optional_scalars::OptionalByte just_enum = optional_scalars::OptionalByte::None;
|
optional_scalars::OptionalByte just_enum = optional_scalars::OptionalByte::None;
|
||||||
optional_scalars::OptionalByte default_enum = optional_scalars::OptionalByte::One;
|
optional_scalars::OptionalByte default_enum = optional_scalars::OptionalByte::One;
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ struct ScalarStuffT : public flatbuffers::NativeTable {
|
|||||||
maybe_f64(flatbuffers::nullopt),
|
maybe_f64(flatbuffers::nullopt),
|
||||||
default_f64(42.0),
|
default_f64(42.0),
|
||||||
just_bool(false),
|
just_bool(false),
|
||||||
maybe_bool(true),
|
maybe_bool(flatbuffers::nullopt),
|
||||||
default_bool(true),
|
default_bool(true),
|
||||||
just_enum(optional_scalars::OptionalByte_None),
|
just_enum(optional_scalars::OptionalByte_None),
|
||||||
default_enum(optional_scalars::OptionalByte_One) {
|
default_enum(optional_scalars::OptionalByte_One) {
|
||||||
|
|||||||
@@ -3516,6 +3516,8 @@ void OptionalScalarsTest() {
|
|||||||
TEST_ASSERT(!opts->mutate_maybe_i16(-10));
|
TEST_ASSERT(!opts->mutate_maybe_i16(-10));
|
||||||
|
|
||||||
optional_scalars::ScalarStuffT obj;
|
optional_scalars::ScalarStuffT obj;
|
||||||
|
TEST_ASSERT(!obj.maybe_bool);
|
||||||
|
TEST_ASSERT(!obj.maybe_f32.has_value());
|
||||||
opts->UnPackTo(&obj);
|
opts->UnPackTo(&obj);
|
||||||
TEST_ASSERT(!obj.maybe_bool);
|
TEST_ASSERT(!obj.maybe_bool);
|
||||||
TEST_ASSERT(!obj.maybe_f32.has_value());
|
TEST_ASSERT(!obj.maybe_f32.has_value());
|
||||||
|
|||||||
Reference in New Issue
Block a user