Skip to content

Commit e6ea44c

Browse files
Fix upb_MiniTable_GetOneof(miniTable, field) to work correctly if field is the very first field in the proto.
PiperOrigin-RevId: 580285127
1 parent b837d17 commit e6ea44c

4 files changed

Lines changed: 22 additions & 1 deletion

File tree

upb/mini_table/message.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ const upb_MiniTableField* upb_MiniTable_GetOneof(const upb_MiniTable* m,
5555
}
5656
const upb_MiniTableField* ptr = &m->fields[0];
5757
const upb_MiniTableField* end = &m->fields[m->field_count];
58-
while (++ptr < end) {
58+
for (; ptr < end; ptr++) {
5959
if (ptr->presence == (*f).presence) {
6060
return ptr;
6161
}

upb/test/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ cc_test(
239239
],
240240
deps = [
241241
":empty_upb_proto_reflection",
242+
":proto3_test_upb_proto",
242243
":test_messages_proto2_upb_minitable",
243244
":test_upb_proto",
244245
"@com_google_googletest//:gtest_main",

upb/test/proto3_test.proto

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,13 @@ message TestMessage3 {
2727
optional TestMessage3 msg = 5;
2828
repeated TestMessage3 r_msg = 6;
2929
}
30+
31+
// See the InitialFieldOneOf test in test_mini_table_oneof.cc.
32+
message TestOneOfInitialField {
33+
oneof oneof_field {
34+
int32 a = 1;
35+
uint32 b = 2;
36+
}
37+
38+
float c = 3;
39+
}

upb/test/test_mini_table_oneof.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "google/protobuf/test_messages_proto2.upb_minitable.h"
1010
#include "upb/mini_table/field.h"
1111
#include "upb/mini_table/message.h"
12+
#include "upb/test/proto3_test.upb.h"
1213

1314
// Must be last.
1415
#include "upb/port/def.inc"
@@ -29,6 +30,15 @@ TEST(MiniTableOneofTest, OneOfIteratorProto2) {
2930
} while (upb_MiniTable_NextOneofField(google_protobuf_table, &ptr));
3031
}
3132

33+
TEST(MiniTableOneofTest, InitialFieldOneOf) {
34+
const upb_MiniTable* table = &upb__test__TestOneOfInitialField_msg_init;
35+
const upb_MiniTableField* field = upb_MiniTable_FindFieldByNumber(table, 1);
36+
ASSERT_TRUE(field != nullptr);
37+
38+
const upb_MiniTableField* ptr = upb_MiniTable_GetOneof(table, field);
39+
EXPECT_TRUE(ptr == field);
40+
}
41+
3242
TEST(MiniTableOneofTest, InitialFieldNotOneOf) {
3343
constexpr int test_field_number = 1; // optional int that is not a oneof
3444
const upb_MiniTable* google_protobuf_table =

0 commit comments

Comments
 (0)