Вот зараза, про угловые скобки забыл.
включая замену
unsigned long foo(unsigned long u) {
return u << 32;
}
на голый ret, оставляя в регистре возврата мусор, который там был при входе"
Причём независимо от того - баг ли, фича ли есть это маскирование у x86-го. То, что QC2.5 занёс в результат "ожидаемые" нули -
случайное совпадение с нашими ожиданиями.
То, что BC5.02 и gcc-x86 undefined behavior сделали как NOP, выброшенный затем оптиизатором, и результат совпал с поведением ассемблерной команды x86 - тоже
случайное совпадение.