internal/impl: fix validation of required group fields

Change-Id: I3c3b5cfbea599dc08096aa5992b7829c2e50f25d
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/218578
Reviewed-by: Joe Tsai <joetsai@google.com>
diff --git a/internal/impl/validate.go b/internal/impl/validate.go
index e568c75..06acc78 100644
--- a/internal/impl/validate.go
+++ b/internal/impl/validate.go
@@ -343,8 +343,10 @@
 					ok = wtyp == wire.Fixed32Type
 				case validationTypeFixed64:
 					ok = wtyp == wire.Fixed64Type
-				case validationTypeBytes, validationTypeUTF8String, validationTypeMessage, validationTypeGroup:
+				case validationTypeBytes, validationTypeUTF8String, validationTypeMessage:
 					ok = wtyp == wire.BytesType
+				case validationTypeGroup:
+					ok = wtyp == wire.StartGroupType
 				}
 				if ok {
 					st.requiredMask |= vi.requiredBit
diff --git a/proto/testmessages_test.go b/proto/testmessages_test.go
index 7a2eaad..a1c1d1e 100644
--- a/proto/testmessages_test.go
+++ b/proto/testmessages_test.go
@@ -1007,6 +1007,39 @@
 		}.Marshal(),
 	},
 	{
+		desc:          "required message unset",
+		checkFastInit: true,
+		partial:       true,
+		decodeTo:      makeMessages(protobuild.Message{}, &requiredpb.Message{}),
+	},
+	{
+		desc:          "required message set",
+		checkFastInit: true,
+		decodeTo: makeMessages(protobuild.Message{
+			"v": protobuild.Message{},
+		}, &requiredpb.Message{}),
+		wire: pack.Message{
+			pack.Tag{1, pack.BytesType}, pack.LengthPrefix(pack.Message{}),
+		}.Marshal(),
+	},
+	{
+		desc:          "required group unset",
+		checkFastInit: true,
+		partial:       true,
+		decodeTo:      makeMessages(protobuild.Message{}, &requiredpb.Group{}),
+	},
+	{
+		desc:          "required group set",
+		checkFastInit: true,
+		decodeTo: makeMessages(protobuild.Message{
+			"group": protobuild.Message{},
+		}, &requiredpb.Group{}),
+		wire: pack.Message{
+			pack.Tag{1, pack.StartGroupType},
+			pack.Tag{1, pack.EndGroupType},
+		}.Marshal(),
+	},
+	{
 		desc:          "required field with incompatible wire type",
 		checkFastInit: true,
 		partial:       true,