Kompatibilita s dřívějšími kódy se ztratila změnou C++ standardu. Ve chvíli, kdy se do C++ standardu zavedl strict aliasing, tak se do všech dříve korektních programů, které používaly aliasing pointerů různého typu, zavedlo undefined behavior.
Tohle se vědělo a udělalo se to záměrně, protože strict aliasing umožňuje překladači lépe optimalizovat kód a překladače to využívají, aby byl výsledný kód rychlejší.
Takže tvůj předpoklad, že překladač musí dodržovat kompatibilitu s dřívejšími kódy, není správný. Překladač musí dodržovat kompatibilitu pouze s C++ standardem.