reflect/protodesc: only check enum dependency syntax if resolved

For proto3 messages with an enum field that could not be resolved,
do not check the syntax of that enum dependency.

Change-Id: I7c646539351edc35243ab950d335f4018cc4c0e9
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/186001
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/reflect/protodesc/desc_validate.go b/reflect/protodesc/desc_validate.go
index 9a7fbac..c71ad7b 100644
--- a/reflect/protodesc/desc_validate.go
+++ b/reflect/protodesc/desc_validate.go
@@ -159,7 +159,7 @@
 				if f.Cardinality() == protoreflect.Required {
 					return errors.New("message field %q using proto3 semantics cannot be required", f.FullName())
 				}
-				if f.Enum() != nil && f.Enum().Syntax() != protoreflect.Proto3 {
+				if f.Enum() != nil && !f.Enum().IsPlaceholder() && f.Enum().Syntax() != protoreflect.Proto3 {
 					return errors.New("message field %q using proto3 semantics may only depend on a proto3 enum", f.FullName())
 				}
 			}
diff --git a/reflect/protodesc/file_test.go b/reflect/protodesc/file_test.go
index 9de1d03..f3e0b0a 100644
--- a/reflect/protodesc/file_test.go
+++ b/reflect/protodesc/file_test.go
@@ -831,6 +831,20 @@
 				]
 			}]}]
 		`),
+	}, {
+		label: "proto3 message with unresolved enum",
+		inDesc: mustParseFile(`
+			name:    "test.proto"
+			package: ""
+			syntax:  "proto3"
+			message_type: [{
+				name: "M"
+				field: [
+					{name:"enum" number:1 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".fizz.buzz.Enum"}
+				]
+			}]
+		`),
+		inOpts: []option{allowUnresolvable()},
 		// TODO: Test field and oneof handling in validateMessageDeclarations
 		// TODO: Test unmarshalDefault
 		// TODO: Test validateExtensionDeclarations