diff --git a/samples/monster_generated.h b/samples/monster_generated.h
index b761d6fca60a55d86a5f62e9a78af54b442ccd1b..878a7688b6a165aec0457c0724eb42df6e0262ff 100644
--- a/samples/monster_generated.h
+++ b/samples/monster_generated.h
@@ -23,7 +23,7 @@ inline const char **EnumNamesColor() {
   return names;
 }
 
-inline const char *EnumNameColor(Color e) { return EnumNamesColor()[e]; }
+inline const char *EnumNameColor(Color e) { return EnumNamesColor()[static_cast<int>(e)]; }
 
 enum Any {
   Any_NONE = 0,
@@ -35,7 +35,7 @@ inline const char **EnumNamesAny() {
   return names;
 }
 
-inline const char *EnumNameAny(Any e) { return EnumNamesAny()[e]; }
+inline const char *EnumNameAny(Any e) { return EnumNamesAny()[static_cast<int>(e)]; }
 
 inline bool VerifyAny(flatbuffers::Verifier &verifier, const void *union_obj, Any type);
 
diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp
index 077320bfadd4542e53c73dc55e36beb74360a09f..d5aa31201ea3631a39678e2527f6e4726f9b17e0 100644
--- a/src/idl_parser.cpp
+++ b/src/idl_parser.cpp
@@ -1080,7 +1080,7 @@ void Parser::ParseProtoDecl() {
       Expect(kTokenIntegerConstant);
       auto &field = AddField(struct_def, name, type);
       field.doc_comment = field_comment;
-      field.required = required;
+      if (!IsScalar(type.base_type)) field.required = required;
       // See if there's a default specified.
       if (IsNext('[')) {
         if (attribute_ != "default") Error("\'default\' expected");
diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h
index c468b1082d887a5f521e337f011fb35dc72b4c0d..6564a9bd77dbc1a55bc96bed4ad0b0f8e13f9027 100644
--- a/tests/monster_test_generated.h
+++ b/tests/monster_test_generated.h
@@ -31,7 +31,7 @@ inline const char **EnumNamesColor() {
   return names;
 }
 
-inline const char *EnumNameColor(Color e) { return EnumNamesColor()[e - Color_Red]; }
+inline const char *EnumNameColor(Color e) { return EnumNamesColor()[static_cast<int>(e) - static_cast<int>(Color_Red)]; }
 
 enum Any {
   Any_NONE = 0,
@@ -44,7 +44,7 @@ inline const char **EnumNamesAny() {
   return names;
 }
 
-inline const char *EnumNameAny(Any e) { return EnumNamesAny()[e]; }
+inline const char *EnumNameAny(Any e) { return EnumNamesAny()[static_cast<int>(e)]; }
 
 inline bool VerifyAny(flatbuffers::Verifier &verifier, const void *union_obj, Any type);