Fixed bug spotted by danielr
diff --git a/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs b/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
index 8caa953..b3f5d7b 100644
--- a/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
+++ b/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
@@ -155,8 +155,9 @@
       writer.WriteLine("size += dataSize;");
       int tagSize = CodedOutputStream.ComputeTagSize(Descriptor.FieldNumber);
       if (Descriptor.IsPacked) {
-        writer.WriteLine("size += {0};", tagSize);
-        writer.WriteLine("size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);");
+        writer.WriteLine("if ({0}_.Count != 0) {{", Name);
+        writer.WriteLine("  size += {0} + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);", tagSize);
+        writer.WriteLine("}");
       } else {
         writer.WriteLine("size += {0} * {1}_.Count;", tagSize, Name);
       }
diff --git a/src/ProtocolBuffers.Test/GeneratedMessageTest.cs b/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
index aee11d8..5f98817 100644
--- a/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
+++ b/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
@@ -452,5 +452,11 @@
       Assert.AreEqual(UnitTestProtoFile.RepeatedNestedMessageExtensionFieldNumber, 48);
       Assert.AreEqual(UnitTestProtoFile.RepeatedNestedEnumExtensionFieldNumber, 51);
     }
+
+    [Test]
+    public void EmptyPackedValue() {
+      TestPackedTypes empty = new TestPackedTypes.Builder().Build();
+      Assert.AreEqual(0, empty.SerializedSize);
+    }
   }
 }
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
index 123b5ec..811556d 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
@@ -12765,8 +12765,9 @@
             dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedInt32_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedInt32MemoizedSerializedSize = dataSize;
         }
         {
@@ -12775,8 +12776,9 @@
             dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedInt64_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedInt64MemoizedSerializedSize = dataSize;
         }
         {
@@ -12785,8 +12787,9 @@
             dataSize += pb::CodedOutputStream.ComputeUInt32SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedUint32_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedUint32MemoizedSerializedSize = dataSize;
         }
         {
@@ -12795,8 +12798,9 @@
             dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedUint64_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedUint64MemoizedSerializedSize = dataSize;
         }
         {
@@ -12805,8 +12809,9 @@
             dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedSint32_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedSint32MemoizedSerializedSize = dataSize;
         }
         {
@@ -12815,64 +12820,72 @@
             dataSize += pb::CodedOutputStream.ComputeSInt64SizeNoTag(element);
           }
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedSint64_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedSint64MemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 4 * packedFixed32_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedFixed32_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedFixed32MemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 8 * packedFixed64_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedFixed64_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedFixed64MemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 4 * packedSfixed32_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedSfixed32_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedSfixed32MemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 8 * packedSfixed64_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedSfixed64_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedSfixed64MemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 4 * packedFloat_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedFloat_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedFloatMemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 8 * packedDouble_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedDouble_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedDoubleMemoizedSerializedSize = dataSize;
         }
         {
           int dataSize = 0;
           dataSize = 1 * packedBool_.Count;
           size += dataSize;
-          size += 2;
-          size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          if (packedBool_.Count != 0) {
+            size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
           packedBoolMemoizedSerializedSize = dataSize;
         }
         {