https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124163
Bug ID: 124163
Summary: Float'Succ and Float'Adjacent don't work unless
applied to variables of type Float
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: ada
Assignee: unassigned at gcc dot gnu.org
Reporter: dirk.herrmann-privat at gmx dot de
CC: dkm at gcc dot gnu.org
Target Milestone: ---
With gcc 13.3.0, I get unexpected behaviour, see the sample code below.
Essentially,
Float'Succ(Pi)
with Pi from Ada.Numerics does deliver just Pi in contrast to the successor
Float value. Same problem with
Float'Succ(Float(Pi))
The problem may lie deeper, because it is the same with
Float'Adjacent(Pi, Float'Last)
and
Float'Adjacent(Float(Pi), Float'Last).
In both cases, the operations behave as expected when applied to a variable of
type Float, like, when operating on a variable of type float:
Float_Pi : Float := Pi;
When applied to Float_Pi, both Succ and Adjacent work as expected.
A discussion of the topic has already happened on StackOverflow, see
https://stackoverflow.com/questions/79890531/why-does-floatsucc-behave-differently-on-float-variables-than-on-float-expressi
Particularly the contribution https://stackoverflow.com/a/79891914 will be
interesting because of the comments with respect to the generated assembly
code.
Sample code (can also be obtained from StackOverflow):
procedure Succ_Adjacent is
Float_Pi : Float := Pi;
Succ_Pi : Float := Float'Succ(Float_Pi);
Adj_Last_Pi : Float := Float'Adjacent(Float_Pi, Float'Last);
procedure Show(Nr: Positive; Expr: String; Result: Float) is
begin
Put(Nr, 2);
Put(": ");
Put(Expr);
Put(Result, Fore => 5, Aft => 20, Exp => 2);
New_Line(1);
end Show;
begin
Show( 1, "Pi : ", Pi);
Show( 2, "Float_Pi : ", Float_Pi);
Show( 3, "Succ_Pi : ", Succ_Pi);
Show( 4, "Float'Succ(Pi) : ", Float'Succ(Pi));
Show( 5, "Float'Succ(Float(Pi)) : ", Float'Succ(Float(Pi)));
Show( 6, "Float'Succ(Float_Pi) : ", Float'Succ(Float_Pi));
Show( 7, "Adj_Last_Pi : ", Adj_Last_Pi);
Show( 8, "Float'Adjacent(Pi, Float'Last) : ",
Float'Adjacent(Pi, Float'Last));
Show( 9, "Float'Adjacent(Float(Pi), Float'Last): ",
Float'Adjacent(Float(Pi), Float'Last));
Show(10, "Float'Adjacent(Float_Pi, Float'Last) : ",
Float'Adjacent(Float_Pi, Float'Last));
Show(11, "Float'Adjacent(Float'Succ(Pi), Float'Last) : ",
Float'Adjacent(Float'Succ(Pi), Float'Last));
Show(12, "Float'Adjacent(Float'Adjacent(Pi, Float'Last), Float'Last): ",
Float'Adjacent(Float'Adjacent(Pi, Float'Last), Float'Last));
end Succ_Adjacent;