proto, internal/impl: make IsInitialized more consistent

Make the fast-path and slow-path versions of IsInitialized report
exactly the same errors: An errors.RequiredNotSet containing the
full name of one of the unset required fields.

Bugfix: Fast-path IsInitialized on a nil message reports an error only
when the message directly contains required fields.

Bugfix: Include fast-path IsInitialized in legacy messageIfaceWrapper.

Fixes golang/protobuf#887

Change-Id: Ia5e4b386f8c23f6f855d995f4a098b1338acbae3
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/185397
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/proto/decode_test.go b/proto/decode_test.go
index 3b919aa..03f337a 100644
--- a/proto/decode_test.go
+++ b/proto/decode_test.go
@@ -952,6 +952,11 @@
 		}.Marshal(),
 	},
 	{
+		desc:     "required field in nil message unset",
+		partial:  true,
+		decodeTo: []proto.Message{(*testpb.TestRequired)(nil)},
+	},
+	{
 		desc:     "required field unset",
 		partial:  true,
 		decodeTo: []proto.Message{&testpb.TestRequired{}},
@@ -1224,6 +1229,14 @@
 		}.Marshal(),
 	},
 	{
+		desc: "nil messages",
+		decodeTo: []proto.Message{
+			(*testpb.TestAllTypes)(nil),
+			(*test3pb.TestAllTypes)(nil),
+			(*testpb.TestAllExtensions)(nil),
+		},
+	},
+	{
 		desc:    "legacy",
 		partial: true,
 		decodeTo: []proto.Message{