You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Independent C-frontend PRs conflict with each other in three places where additions tend to land at the same anchor line, even though the changes themselves don't overlap.
Seam comment. The file comment in c_parse_internal.h lists every test-seam group in one sentence ("Private test seams for production constexpr, call arity, expression typing, …"). Every PR that adds a seam group rewrites that sentence.
Seam anchors. New seam declarations in c_parse_internal.h go either at the end of the file, just before #endif, or right after the same existing declaration.
Fixture anchor. A new BUSTER_TEST_FIXTURE(arguments, c_test_…) line in c_frontend_tests (c_test.c) tends to go right after a recently added fixture, so PRs branched around the same time often pick the same anchor line (unverified as a rule; the anchor counts below are what I measured). New test-function definitions cluster the same way.
Expected: two PRs that add unrelated seams or tests merge in either order without manual resolution. Observed: such pairs conflict. The resolution is always "keep both sides", but it is done by hand and costs a revalidation cycle and a new CI run.
Evidence
Revision: main425b8b5. Open PR heads were fetched at about 2026-09-28 07:30Z.
Hit on #1523. Three of its four main merges conflicted only at these spots. Each was resolved by keeping both sides.
32 of the 42 merge cleanly into main. Method: I merged each of them into main, then merged every pair of those results with main as the merge base (git merge-tree --write-tree --merge-base=origin/main). The pairs below share no commits and conflict only in these two files:
<<<<<<<
// label-provenance gate, validation-candidate and layout-solve queries.
=======
// label-provenance gate, validation-candidate and type-compatibility walk queries.
>>>>>>>
Prior record:#1041 (closed) is a merge that silently dropped a regression test. #403 (closed) settled a single add/add conflict on this header between two PRs. This issue is the recurring form.
the declaration block (14 BUSTER_F_DECLs on 425b8b5), in particular the end before #endif and the spots after c_test_aggregate_lookup_rollback and c_test_parse_direct_expression_type.
c_frontend_tests in src/buster/tests/compiler/frontend/c/c_test.c: 165 c_test_ fixture registrations, plus the test functions defined next to their neighbours.
Validation already run
Only the git merge-tree classification above. It has no compiler or test component.
Possible repairs (not evaluated)
Drop the seam-group list from the file comment. Each declaration group already has its own comment. This removes conflict 1 outright.
Give additions a position determined by their content. For example, keep seam declarations and fixture registrations sorted by name, or grouped by owning area and sorted within each group. Then state the rule in docs/agents/testing.md. Independent additions would then land at different anchors unless their names are adjacent.
Not recommended: a merge=union attribute on these files. It would also union unrelated hunks elsewhere in c_test.c and could silently duplicate code.
Remaining uncertainty
Fixture order: I did not check whether the order of fixtures in c_frontend_tests matters, for example through shared scratch arenas, the memory and timing reports, or the inline tests that follow the list. Option 2 needs that answered first.
Snapshot: the pairwise results use today's heads. Several heads are up to 221 commits behind main, so the set of conflicting pairs will shift as main moves.
Test-function conflicts: "inserted at the same line" is classified only by hunk location. Some of those pairs may be touching related tests rather than just sharing an anchor.
Completion criteria
Two PRs that each add one seam group to c_parse_internal.h merge in either order without a conflict.
Two PRs that each add one unrelated fixture to c_frontend_tests merge in either order without a conflict. If sorting is chosen, this excludes names that sort next to each other.
Where new seams and fixtures go is written down in the testing guide.
Summary
Independent C-frontend PRs conflict with each other in three places where additions tend to land at the same anchor line, even though the changes themselves don't overlap.
c_parse_internal.hlists every test-seam group in one sentence ("Private test seams for production constexpr, call arity, expression typing, …"). Every PR that adds a seam group rewrites that sentence.c_parse_internal.hgo either at the end of the file, just before#endif, or right after the same existing declaration.BUSTER_TEST_FIXTURE(arguments, c_test_…)line inc_frontend_tests(c_test.c) tends to go right after a recently added fixture, so PRs branched around the same time often pick the same anchor line (unverified as a rule; the anchor counts below are what I measured). New test-function definitions cluster the same way.Expected: two PRs that add unrelated seams or tests merge in either order without manual resolution.
Observed: such pairs conflict. The resolution is always "keep both sides", but it is done by hand and costs a revalidation cycle and a new CI run.
Evidence
Revision:
main425b8b5. Open PR heads were fetched at about 2026-09-28 07:30Z.Hit on #1523. Three of its four
mainmerges conflicted only at these spots. Each was resolved by keeping both sides.mainmainchange22bc3bb3b3182f15967ef)#endif)abba5517d236db0b4a547)c_test.c:3005)df5ee156af2c9eea04c03)Across open PRs. 42 of the 98 open PRs change
c_test.corc_parse_internal.h.mainat these spots:#endif); nothing else conflicts.c_test.c; Fix noreturn call and unreachable handling in expressions #1644: the fixture list and a test function inserted at the same line. Both also conflict in other files.main. Method: I merged each of them intomain, then merged every pair of those results withmainas the merge base (git merge-tree --write-tree --merge-base=origin/main). The pairs below share no commits and conflict only in these two files:c_test_typeof_expression_frames: c: answer lone-literal type queries without the type machine (#1530) #1532, efficiency campaign: integration of #1531, #1532, #1533, #1536 and #1538 (combined work ledger) #1537, c: diagnose a malformed typeof operand without flagging unmodeled type names (#1664) #1672;c_test_type_parse_rollback_growth: c: keep rollback snapshots out of the type-machine frame row (#1497) #1533, efficiency campaign: integration of #1531, #1532, #1533, #1536 and #1538 (combined work ledger) #1537, c: find promoted members without clearing a flag per type-table row (#1297) #1538;c_test_sizeof_update_operand_constraints: c: require ')' after a type name in sizeof/_Alignof/typeof operands (#1535) #1670, c: syntax-check constant expressions outside function bodies (#1666) #1695, c: accept a GNU statement expression as a sizeof/_Alignof operand (#1668) #1699;c_test_declarator_trailing_token_diagnostics: c: diagnose trailing tokens after a member declarator (#1534) #1663, c: diagnose a typeof operand that is neither a type name nor an expression (#1662) #1691.#endif: c: resolve parse-side builtin-kind target facts once per preprocess result #1373, c: answer machineless uncached layout queries from the requested closure (#1457) #1463, c: decide a type compared with itself without the pair walk (#1520) #1523, c: answer body scope queries from a per-function token map (#1586) #1587;c_test_aggregate_lookup_rollback: c: keep rollback snapshots out of the type-machine frame row (#1497) #1533, efficiency campaign: integration of #1531, #1532, #1533, #1536 and #1538 (combined work ledger) #1537, c: find promoted members without clearing a flag per type-table row (#1297) #1538;c_test_parse_direct_expression_type: c: answer lone-literal type queries without the type machine (#1530) #1532, efficiency campaign: integration of #1531, #1532, #1533, #1536 and #1538 (combined work ledger) #1537.Fixture anchor, #1695 × #1699:
Seam comment, #1463 × #1523:
Prior record: #1041 (closed) is a merge that silently dropped a regression test. #403 (closed) settled a single add/add conflict on this header between two PRs. This issue is the recurring form.
Affected symbols
src/buster/lib/compiler/frontend/c/c_parse_internal.h:BUSTER_F_DECLs on425b8b5), in particular the end before#endifand the spots afterc_test_aggregate_lookup_rollbackandc_test_parse_direct_expression_type.c_frontend_testsinsrc/buster/tests/compiler/frontend/c/c_test.c: 165c_test_fixture registrations, plus the test functions defined next to their neighbours.Validation already run
Only the
git merge-treeclassification above. It has no compiler or test component.Possible repairs (not evaluated)
docs/agents/testing.md. Independent additions would then land at different anchors unless their names are adjacent.merge=unionattribute on these files. It would also union unrelated hunks elsewhere inc_test.cand could silently duplicate code.Remaining uncertainty
c_frontend_testsmatters, for example through shared scratch arenas, the memory and timing reports, or the inline tests that follow the list. Option 2 needs that answered first.main, so the set of conflicting pairs will shift asmainmoves.Completion criteria
c_parse_internal.hmerge in either order without a conflict.c_frontend_testsmerge in either order without a conflict. If sorting is chosen, this excludes names that sort next to each other.Found while driving #1523 (tracking #1520).