From 3980cf9df1ca9c66718f1fe9817011134f87bbcd Mon Sep 17 00:00:00 2001
From: Jon Skeet <jonskeet@google.com>
Date: Thu, 30 Jul 2015 13:35:42 +0100
Subject: [PATCH] Prohibit null values for string/bytes fields in generated
 code.

---
 .../src/Google.Protobuf.Test/GeneratedMessageTest.cs  | 10 ++++++++++
 .../protobuf/compiler/csharp/csharp_field_base.cc     | 11 -----------
 .../compiler/csharp/csharp_primitive_field.cc         |  4 ++--
 3 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
index dfaac48cd0..140b878c15 100644
--- a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
+++ b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
@@ -111,6 +111,16 @@ namespace Google.Protobuf
             Assert.IsNull(message.OneofNestedMessage);
         }
 
+        [Test]
+        public void NullStringAndBytesRejected()
+        {
+            var message = new TestAllTypes();
+            Assert.Throws<ArgumentNullException>(() => message.SingleString = null);
+            Assert.Throws<ArgumentNullException>(() => message.OneofString = null);
+            Assert.Throws<ArgumentNullException>(() => message.SingleBytes = null);
+            Assert.Throws<ArgumentNullException>(() => message.OneofBytes = null);
+        }
+
         [Test]
         public void RoundTrip_Empty()
         {
diff --git a/src/google/protobuf/compiler/csharp/csharp_field_base.cc b/src/google/protobuf/compiler/csharp/csharp_field_base.cc
index 2459d457ed..7e3bbeef51 100644
--- a/src/google/protobuf/compiler/csharp/csharp_field_base.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_field_base.cc
@@ -127,17 +127,6 @@ void FieldGeneratorBase::AddDeprecatedFlag(io::Printer* printer) {
   }
 }
 
-void FieldGeneratorBase::AddNullCheck(io::Printer* printer) {
-  AddNullCheck(printer, "value");
-}
-
-void FieldGeneratorBase::AddNullCheck(io::Printer* printer, const std::string& name) {
-  if (is_nullable_type()) {
-    printer->Print("  pb::ThrowHelper.ThrowIfNull($name$, \"$name$\");\n",
-                   "name", name);
-  }
-}
-
 void FieldGeneratorBase::AddPublicMemberAttributes(io::Printer* printer) {
   AddDeprecatedFlag(printer);
 }
diff --git a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
index 80f4a92d02..fc043ec06c 100644
--- a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
@@ -81,7 +81,7 @@ void PrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) {
   } else {
     printer->Print(
       variables_,
-      "    $name$_ = value ?? $default_value$;\n");
+      "    $name$_ = pb::Preconditions.CheckNotNull(value, \"value\");\n");
   }
   printer->Print(
     "  }\n"
@@ -183,7 +183,7 @@ void PrimitiveOneofFieldGenerator::GenerateMembers(io::Printer* printer) {
     } else {
       printer->Print(
         variables_,
-        "    $oneof_name$_ = value ?? $default_value$;\n");
+        "    $oneof_name$_ = pb::Preconditions.CheckNotNull(value, \"value\");\n");
     }
     printer->Print(
       variables_,