На этой странице Джон Барнс пишет:
Если условное выражение является аргументом преобразования типа, то фактически преобразование считается переданным зависимым выражениям. Таким образом
X := Float(if P then A else B);
эквивалентно
X := (if P then Float(A) else Float(B));
Так почему я не могу скомпилировать следующую программу под GNAT 10.3.0?
procedure Main is
P : Boolean := True;
X : Float;
begin
X := Float (if P then 0.5 else 32);
end Main;
Compile
[Ada] main.adb
main.adb:5:35: expected a real type
main.adb:5:35: found type universal integer
gprbuild: *** compilation phase failed
Потому что вы нашли давнюю ошибку в компиляторе! (такое же поведение в GCC 12.1.0).
Обоснование Джона Барнса находится на AARM 4.5.7(10ff).
спасибо за предоставление реального кода и сообщений об ошибках!