[api] Scope generated decode cases that declare locals

A case body with a declaration or several statements now gets its own
block, as the per wire type overrides had, so no jump to a later case
label crosses an initialization.
This commit is contained in:
J. Nick Koston
2026-09-07 15:57:13 +02:00
parent bcf812d62b
commit 0641dae9d2
3 changed files with 65 additions and 33 deletions
@@ -252,3 +252,14 @@ def test_message_gets_a_single_decode_field_override() -> None:
assert "const ProtoFieldValue value(data, scalar);" in cpp
for number, wire_type in ((1, 2), (2, 0), (3, 5)):
assert f"case PROTO_DECODE_CASE({number}, {wire_type}):" in cpp, cpp
def test_multi_statement_decode_cases_are_scoped() -> None:
"""Bodies with several statements or locals get their own block so no jump crosses an initialization."""
bytes_type = descriptor_pb2.FieldDescriptorProto.TYPE_BYTES
cases = _decode_cases(bytes_type, 4)
assert len(cases) == 1, cases
lines = cases[0].splitlines()
assert lines[0] == "case PROTO_DECODE_CASE(4, 2): {", cases[0]
assert lines[-1] == "}", cases[0]
assert "value.data();" in cases[0] and "value.size();" in cases[0]