| Index: third_party/protobuf/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs | 
| diff --git a/third_party/protobuf/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs b/third_party/protobuf/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs | 
| index 8ed54cfb48458011a135b9dd9617efa91f687df8..6852f75f8eb269defcefafaf3c3b090a1e2a4570 100644 | 
| --- a/third_party/protobuf/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs | 
| +++ b/third_party/protobuf/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs | 
| @@ -75,10 +75,96 @@ namespace Google.Protobuf.Collections | 
| } | 
|  | 
| [Test] | 
| -        public void Add_RepeatedField() | 
| +        public void AddRange_SlowPath() | 
| +        { | 
| +            var list = new RepeatedField<string>(); | 
| +            list.AddRange(new[] { "foo", "bar" }.Select(x => x)); | 
| +            Assert.AreEqual(2, list.Count); | 
| +            Assert.AreEqual("foo", list[0]); | 
| +            Assert.AreEqual("bar", list[1]); | 
| +        } | 
| + | 
| +        [Test] | 
| +        public void AddRange_SlowPath_NullsProhibited_ReferenceType() | 
| +        { | 
| +            var list = new RepeatedField<string>(); | 
| +            // It's okay for this to throw ArgumentNullException if necessary. | 
| +            // It's not ideal, but not awful. | 
| +            Assert.Catch<ArgumentException>(() => list.AddRange(new[] { "foo", null }.Select(x => x))); | 
| +        } | 
| + | 
| +        [Test] | 
| +        public void AddRange_SlowPath_NullsProhibited_NullableValueType() | 
| +        { | 
| +            var list = new RepeatedField<int?>(); | 
| +            // It's okay for this to throw ArgumentNullException if necessary. | 
| +            // It's not ideal, but not awful. | 
| +            Assert.Catch<ArgumentException>(() => list.AddRange(new[] { 20, (int?)null }.Select(x => x))); | 
| +        } | 
| + | 
| +        [Test] | 
| +        public void AddRange_Optimized_NonNullableValueType() | 
| +        { | 
| +            var list = new RepeatedField<int>(); | 
| +            list.AddRange(new List<int> { 20, 30 }); | 
| +            Assert.AreEqual(2, list.Count); | 
| +            Assert.AreEqual(20, list[0]); | 
| +            Assert.AreEqual(30, list[1]); | 
| +        } | 
| + | 
| +        [Test] | 
| +        public void AddRange_Optimized_ReferenceType() | 
| +        { | 
| +            var list = new RepeatedField<string>(); | 
| +            list.AddRange(new List<string> { "foo", "bar" }); | 
| +            Assert.AreEqual(2, list.Count); | 
| +            Assert.AreEqual("foo", list[0]); | 
| +            Assert.AreEqual("bar", list[1]); | 
| +        } | 
| + | 
| +        [Test] | 
| +        public void AddRange_Optimized_NullableValueType() | 
| +        { | 
| +            var list = new RepeatedField<int?>(); | 
| +            list.AddRange(new List<int?> { 20, 30 }); | 
| +            Assert.AreEqual(2, list.Count); | 
| +            Assert.AreEqual((int?) 20, list[0]); | 
| +            Assert.AreEqual((int?) 30, list[1]); | 
| +        } | 
| + | 
| +        [Test] | 
| +        public void AddRange_Optimized_NullsProhibited_ReferenceType() | 
| +        { | 
| +            // We don't just trust that a collection with a nullable element type doesn't contain nulls | 
| +            var list = new RepeatedField<string>(); | 
| +            // It's okay for this to throw ArgumentNullException if necessary. | 
| +            // It's not ideal, but not awful. | 
| +            Assert.Catch<ArgumentException>(() => list.AddRange(new List<string> { "foo", null })); | 
| +        } | 
| + | 
| +        [Test] | 
| +        public void AddRange_Optimized_NullsProhibited_NullableValueType() | 
| +        { | 
| +            // We don't just trust that a collection with a nullable element type doesn't contain nulls | 
| +            var list = new RepeatedField<int?>(); | 
| +            // It's okay for this to throw ArgumentNullException if necessary. | 
| +            // It's not ideal, but not awful. | 
| +            Assert.Catch<ArgumentException>(() => list.AddRange(new List<int?> { 20, null })); | 
| +        } | 
| + | 
| +        [Test] | 
| +        public void AddRange_AlreadyNotEmpty() | 
| +        { | 
| +            var list = new RepeatedField<int> { 1, 2, 3 }; | 
| +            list.AddRange(new List<int> { 4, 5, 6 }); | 
| +            CollectionAssert.AreEqual(new[] { 1, 2, 3, 4, 5, 6 }, list); | 
| +        } | 
| + | 
| +        [Test] | 
| +        public void AddRange_RepeatedField() | 
| { | 
| var list = new RepeatedField<string> { "original" }; | 
| -            list.Add(new RepeatedField<string> { "foo", "bar" }); | 
| +            list.AddRange(new RepeatedField<string> { "foo", "bar" }); | 
| Assert.AreEqual(3, list.Count); | 
| Assert.AreEqual("original", list[0]); | 
| Assert.AreEqual("foo", list[1]); | 
|  |