Fixed upb encoder for field numbers > 2**28. The encoder was improperly sign-extending the tag to 64 bits.
diff --git a/tests/bindings/lua/test.proto b/tests/bindings/lua/test.proto index 2803835..6b45350 100644 --- a/tests/bindings/lua/test.proto +++ b/tests/bindings/lua/test.proto
@@ -22,3 +22,7 @@ repeated fixed32 f32_packed = 4 [packed = false]; repeated fixed64 f64_packed = 5 [packed = false]; } + +message TestLargeFieldNumber { + optional int32 i32 = 456214797; +}
diff --git a/tests/bindings/lua/test_upb.lua b/tests/bindings/lua/test_upb.lua index df99d2e..e2d5345 100644 --- a/tests/bindings/lua/test_upb.lua +++ b/tests/bindings/lua/test_upb.lua
@@ -706,6 +706,14 @@ assert_error(function() upb.encode(msg) end) end +function test_large_field_number() + local msg = upb_test.TestLargeFieldNumber() + msg.i32 = 5 + local serialized = upb.encode(msg) + local msg2 = upb.decode(upb_test.TestLargeFieldNumber, serialized) + assert_equal(msg.i32, msg2.i32) +end + function test_gc() local top = test_messages_proto3.TestAllTypesProto3() local n = 100