mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-10-08 17:51:46 -04:00
207559daad
Wave P drafted at 97% and cost A DOZEN clean rebuilds to bank, and not one of those rebuilds failed on a matching problem -- every one failed on a TEXTUAL property of the substituted file that a grep could have reported instantly. This is that grep. gate_main's resolve_conflicts cannot answer it, and not from carelessness: it inspects the DRAFTS while the compiler sees the FILE THEY LAND IN -- after typedef stripping and renaming, at each draft's own insertion offset, interleaved with declarations the file already had. Those transformations run AFTER the conflict check passes. So substitute() gained write=False and this tool checks the artifact itself. Five checks, each earned by a rebuild lost this session (§176h): typedef used above its definition; type never defined anywhere; duplicate typedef with different bodies; one symbol declared two incompatible ways; definition contradicting a visible prototype. CALIBRATED AGAINST THE COMPILER, NOT AGAINST C89 PEDANTRY -- and this mattered. The first version reported 4 hard FAILUREs on the slate that had just built BYTE-IDENTICAL: - it ignored SCOPE, but the project deliberately uses block-scope extern blocks, and a declaration inside one function cannot conflict with a definition elsewhere. Now brace-depth aware. - it split `void f()` from `void f(void)`, which gcc-2.7.2 accepts. Normalized. - it called every def-vs-decl mismatch fatal, but gcc-2.7.2 accepted `void f(void*,s32)` against a `void f(s8*,s32)` definition and even `G3P *f(...)` against `G4P *f(...)`. What it REJECTED was a void/non-void RETURN split (func_8001ABBC). That split alone is FAIL; the rest are WARN. Comments are masked via cdecl before any use-site scan (an unmasked scan reported 7 phantom hits). R39 controls: the slate that banked is FAIL-free (exit 0, 3 informative warnings); four synthetic defects each reported at FAIL; a clean text reports nothing; a block-scope extern does not conflict; `short` vs `s16` does not conflict; array-vs-scalar does.