Здравствуйте, Sinclair, Вы писали:
CC>>Вот тут лежит огроменный болт, ибо frontend пишется вообще без оглядки на платформу. S>Эмм, есть примерно два класса компиляторов. Один — это платформенно-специфичные, вроде того же intel classic. У них нет никакой "без оглядки на платформу", потому что платформа им хорошо известна. S>И другой класс — это LLVM-фронты, вроде кланга, современного gcc, и современного icx. Они никаких "символьных вычислений" не делают, т.к. это не их проблема. Все оптимизации, которые они выполняют — платформенно-независимы. S>А все вот эти символьные преобразования, которые вас так пугают, делаются внутри оптимизатора LLVM. И там никогда-никогда не бывает так, что мы считаем среднее двух интов и вдруг мы решили его вычислить через лонг, и в компайл-тайме переполнения не произошло. А в другом месте мы его вычисление отложили до рантайма, и получилось переполнение.
Тут коллега не прав.
Аналогичных эффектов можно добиться и без того, чтобы оптимизатор подставил константу в is_max и выдал готовый ответ вместо исполнения тела ф-ии.
Я прошёлся по куче компиляторов — даже когда is_max не уничтожается (подавал не константу компиляции) — эффект был тот же на -O2, всё те же oops для первоначального варианта. ))