diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 260f0223a..404353378 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -1598,7 +1598,9 @@ class CppGenerator : public BaseGenerator { std::string GetDefaultScalarValue(const FieldDef &field, bool is_ctor) { 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); if (ev) { return WrapInNameSpace(type.enum_def->defined_namespace, @@ -1620,8 +1622,7 @@ class CppGenerator : public BaseGenerator { return "0"; } } else { - return field.IsScalarOptional() ? GenOptionalNull() - : GenDefaultConstant(field); + return GenDefaultConstant(field); } } @@ -1647,13 +1648,11 @@ class CppGenerator : public BaseGenerator { code_.SetValue("PARAM_VALUE", "nullptr"); } else { 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_VALUE", GenOptionalNull()); - } else { + else code_.SetValue("PARAM_TYPE", GenTypeWire(type, " ", true)); - code_.SetValue("PARAM_VALUE", GetDefaultScalarValue(field, false)); - } } code_ += "{{PRE}}{{PARAM_TYPE}}{{PARAM_NAME}} = {{PARAM_VALUE}}\\"; } diff --git a/tests/cpp17/generated_cpp17/optional_scalars_generated.h b/tests/cpp17/generated_cpp17/optional_scalars_generated.h index 60c09e76f..9fa03e553 100644 --- a/tests/cpp17/generated_cpp17/optional_scalars_generated.h +++ b/tests/cpp17/generated_cpp17/optional_scalars_generated.h @@ -77,7 +77,7 @@ struct ScalarStuffT : public flatbuffers::NativeTable { flatbuffers::Optional maybe_f64 = flatbuffers::nullopt; double default_f64 = 42.0; bool just_bool = false; - flatbuffers::Optional maybe_bool = true; + flatbuffers::Optional maybe_bool = flatbuffers::nullopt; bool default_bool = true; optional_scalars::OptionalByte just_enum = optional_scalars::OptionalByte::None; optional_scalars::OptionalByte default_enum = optional_scalars::OptionalByte::One; diff --git a/tests/optional_scalars_generated.h b/tests/optional_scalars_generated.h index 6e2b49cc1..60dcf784c 100644 --- a/tests/optional_scalars_generated.h +++ b/tests/optional_scalars_generated.h @@ -116,7 +116,7 @@ struct ScalarStuffT : public flatbuffers::NativeTable { maybe_f64(flatbuffers::nullopt), default_f64(42.0), just_bool(false), - maybe_bool(true), + maybe_bool(flatbuffers::nullopt), default_bool(true), just_enum(optional_scalars::OptionalByte_None), default_enum(optional_scalars::OptionalByte_One) { diff --git a/tests/test.cpp b/tests/test.cpp index 93f95d9aa..602438cb6 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -3516,6 +3516,8 @@ void OptionalScalarsTest() { TEST_ASSERT(!opts->mutate_maybe_i16(-10)); optional_scalars::ScalarStuffT obj; + TEST_ASSERT(!obj.maybe_bool); + TEST_ASSERT(!obj.maybe_f32.has_value()); opts->UnPackTo(&obj); TEST_ASSERT(!obj.maybe_bool); TEST_ASSERT(!obj.maybe_f32.has_value());