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;

Reply via email to