Fix generation of C++ code with Optional<Enum> (#6155)
authorVladimir Glavnyy <31897320+vglavnyy@users.noreply.github.com>
Fri, 2 Oct 2020 17:27:30 +0000 (00:27 +0700)
committerGitHub <noreply@github.com>
Fri, 2 Oct 2020 17:27:30 +0000 (10:27 -0700)
src/idl_gen_cpp.cpp
tests/cpp17/generated_cpp17/optional_scalars_generated.h
tests/optional_scalars_generated.h
tests/test.cpp

index 260f022..4043533 100644 (file)
@@ -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}}\\";
   }
index 60c09e7..9fa03e5 100644 (file)
@@ -77,7 +77,7 @@ struct ScalarStuffT : public flatbuffers::NativeTable {
   flatbuffers::Optional<double> maybe_f64 = flatbuffers::nullopt;
   double default_f64 = 42.0;
   bool just_bool = false;
-  flatbuffers::Optional<bool> maybe_bool = true;
+  flatbuffers::Optional<bool> 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;
index 6e2b49c..60dcf78 100644 (file)
@@ -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) {
index 93f95d9..602438c 100644 (file)
@@ -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());