diff options
Diffstat (limited to 'gcc/ada/exp_ch4.adb')
-rw-r--r-- | gcc/ada/exp_ch4.adb | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index e0a62be..74b8f27 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -11879,33 +11879,20 @@ package body Exp_Ch4 is -- which used to fail when Fix_Val was a bound of the type and -- the 'Small was not a representable number. -- This transformation requires an integer type large enough to - -- accommodate a fixed-point value. This will not be the case - -- in systems where Duration is larger than Long_Integer. + -- accommodate a fixed-point value. if Is_Ordinary_Fixed_Point_Type (Target_Type) and then Is_Floating_Point_Type (Etype (Expr)) - and then RM_Size (Btyp) <= RM_Size (Standard_Long_Integer) + and then RM_Size (Btyp) <= System_Max_Integer_Size and then Nkind (Lo) = N_Real_Literal and then Nkind (Hi) = N_Real_Literal then declare Expr_Id : constant Entity_Id := Make_Temporary (Loc, 'T', Conv); - Int_Type : Entity_Id; + Int_Typ : constant Entity_Id := + Small_Integer_Type_For (RM_Size (Btyp), False); begin - -- Find an integer type of the appropriate size to perform an - -- unchecked conversion to the target fixed-point type. - - if RM_Size (Btyp) > RM_Size (Standard_Integer) then - Int_Type := Standard_Long_Integer; - - elsif RM_Size (Btyp) > RM_Size (Standard_Short_Integer) then - Int_Type := Standard_Integer; - - else - Int_Type := Standard_Short_Integer; - end if; - -- Generate a temporary with the integer value. Required in the -- CCG compiler to ensure that run-time checks reference this -- integer expression (instead of the resulting fixed-point @@ -11915,23 +11902,23 @@ package body Exp_Ch4 is Insert_Action (N, Make_Object_Declaration (Loc, Defining_Identifier => Expr_Id, - Object_Definition => New_Occurrence_Of (Int_Type, Loc), + Object_Definition => New_Occurrence_Of (Int_Typ, Loc), Constant_Present => True, Expression => - Convert_To (Int_Type, Expression (Conv)))); + Convert_To (Int_Typ, Expression (Conv)))); -- Create integer objects for range checking of result. Lo_Arg := Unchecked_Convert_To - (Int_Type, New_Occurrence_Of (Expr_Id, Loc)); + (Int_Typ, New_Occurrence_Of (Expr_Id, Loc)); Lo_Val := Make_Integer_Literal (Loc, Corresponding_Integer_Value (Lo)); Hi_Arg := Unchecked_Convert_To - (Int_Type, New_Occurrence_Of (Expr_Id, Loc)); + (Int_Typ, New_Occurrence_Of (Expr_Id, Loc)); Hi_Val := Make_Integer_Literal (Loc, Corresponding_Integer_Value (Hi)); |