aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/exp_util.adb3
-rw-r--r--gcc/ada/freeze.adb8
-rw-r--r--gcc/ada/sem_ch13.adb20
-rw-r--r--gcc/ada/sem_util.adb16
-rw-r--r--gcc/ada/sem_util.ads22
-rw-r--r--gcc/ada/uintp.adb305
-rw-r--r--gcc/ada/uintp.ads281
7 files changed, 375 insertions, 280 deletions
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index b438d0b..9665481 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -4892,6 +4892,9 @@ package body Exp_Util is
then
return False;
+ elsif not Known_Normalized_First_Bit (Comp) then
+ return True;
+
-- Otherwise if the component is not byte aligned, we know we have the
-- nasty unaligned case.
diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb
index c3c4f53..15ce832 100644
--- a/gcc/ada/freeze.adb
+++ b/gcc/ada/freeze.adb
@@ -1268,9 +1268,13 @@ package body Freeze is
if Present (Component_Clause (Comp)) then
Comp_Byte_Aligned :=
- (Normalized_First_Bit (Comp) mod System_Storage_Unit = 0)
+ Known_Normalized_First_Bit (Comp)
and then
- (Esize (Comp) mod System_Storage_Unit = 0);
+ Known_Esize (Comp)
+ and then
+ Normalized_First_Bit (Comp) mod System_Storage_Unit = 0
+ and then
+ Esize (Comp) mod System_Storage_Unit = 0;
else
Comp_Byte_Aligned := not Is_Packed (Encl_Type);
end if;
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 43dd5e1..b6face3 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -7824,7 +7824,7 @@ package body Sem_Ch13 is
if Duplicate_Clause then
null;
- elsif Is_Elementary_Type (U_Ent) then
+ elsif Is_Elementary_Type (U_Ent) and then Present (Size) then
if Size /= System_Storage_Unit
and then Size /= System_Storage_Unit * 2
and then Size /= System_Storage_Unit * 3
@@ -11903,9 +11903,23 @@ package body Sem_Ch13 is
--------
function Lt (Op1, Op2 : Natural) return Boolean is
+ K1 : constant Boolean :=
+ Known_Component_Bit_Offset (Comps (Op1));
+ K2 : constant Boolean :=
+ Known_Component_Bit_Offset (Comps (Op2));
+ -- Record representation clauses can be incomplete, so the
+ -- Component_Bit_Offsets can be unknown.
begin
- return Component_Bit_Offset (Comps (Op1))
- < Component_Bit_Offset (Comps (Op2));
+ if K1 then
+ if K2 then
+ return Component_Bit_Offset (Comps (Op1))
+ < Component_Bit_Offset (Comps (Op2));
+ else
+ return True;
+ end if;
+ else
+ return K2;
+ end if;
end Lt;
----------
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 5028c22..5fd7266 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -11802,7 +11802,7 @@ package body Sem_Util is
-- Set to a factor of the offset from the base object when Expr is a
-- selected or indexed component, based on Component_Bit_Offset and
-- Component_Size respectively. A negative value is used to represent
- -- a value which is not known at compile time.
+ -- a value that is not known at compile time.
procedure Check_Prefix;
-- Checks the prefix recursively in the case where the expression
@@ -11910,7 +11910,7 @@ package body Sem_Util is
-- If we have a null offset, the result is entirely determined by
-- the base object and has already been computed recursively.
- if Offs = Uint_0 then
+ if Present (Offs) and then Offs = Uint_0 then
null;
-- Case where we know the alignment of the object
@@ -11932,7 +11932,7 @@ package body Sem_Util is
else
-- If we have an offset, see if it is compatible
- if Present (Offs) and Offs > Uint_0 then
+ if Present (Offs) and then Offs > Uint_0 then
if Offs mod (System_Storage_Unit * ObjA) /= 0 then
Set_Result (Known_Incompatible);
end if;
@@ -17549,9 +17549,9 @@ package body Sem_Util is
-- Is_False --
--------------
- function Is_False (U : Uint) return Boolean is
+ function Is_False (U : Opt_Ubool) return Boolean is
begin
- return (U = 0);
+ return not Is_True (U);
end Is_False;
---------------------------
@@ -21047,9 +21047,9 @@ package body Sem_Util is
-- Is_True --
-------------
- function Is_True (U : Uint) return Boolean is
+ function Is_True (U : Opt_Ubool) return Boolean is
begin
- return U /= 0;
+ return No (U) or else U = Uint_1;
end Is_True;
--------------------------------------
@@ -28498,7 +28498,7 @@ package body Sem_Util is
-- Static_Boolean --
--------------------
- function Static_Boolean (N : Node_Id) return Uint is
+ function Static_Boolean (N : Node_Id) return Opt_Ubool is
begin
Analyze_And_Resolve (N, Standard_Boolean);
diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads
index 2c5b2866..7c89585 100644
--- a/gcc/ada/sem_util.ads
+++ b/gcc/ada/sem_util.ads
@@ -2054,11 +2054,17 @@ package Sem_Util is
-- 3) An if expression with at least one EVF dependent_expression
-- 4) A case expression with at least one EVF dependent_expression
- function Is_False (U : Uint) return Boolean;
+ function Is_False (U : Opt_Ubool) return Boolean;
pragma Inline (Is_False);
- -- The argument is a Uint value which is the Boolean'Pos value of a Boolean
- -- operand (i.e. is either 0 for False, or 1 for True). This function tests
- -- if it is False (i.e. zero).
+ -- True if U is Boolean'Pos (False) (i.e. Uint_0)
+
+ function Is_True (U : Opt_Ubool) return Boolean;
+ pragma Inline (Is_True);
+ -- True if U is Boolean'Pos (True) (i.e. Uint_1). Also True if U is
+ -- No_Uint; we allow No_Uint because Static_Boolean returns that in
+ -- case of error. It doesn't really matter whether the error case is
+ -- considered True or False, but we don't want this to blow up in that
+ -- case.
function Is_Fixed_Model_Number (U : Ureal; T : Entity_Id) return Boolean;
-- Returns True iff the number U is a model number of the fixed-point type
@@ -2422,12 +2428,6 @@ package Sem_Util is
-- unconditional transfer of control at run time, i.e. the following
-- statement definitely will not be executed.
- function Is_True (U : Uint) return Boolean;
- pragma Inline (Is_True);
- -- The argument is a Uint value which is the Boolean'Pos value of a Boolean
- -- operand (i.e. is either 0 for False, or 1 for True). This function tests
- -- if it is True (i.e. non-zero).
-
function Is_Unchecked_Conversion_Instance (Id : Entity_Id) return Boolean;
-- Determine whether an arbitrary entity denotes an instance of function
-- Ada.Unchecked_Conversion.
@@ -3219,7 +3219,7 @@ package Sem_Util is
-- predefined unit. The _Par version should be called only from the parser;
-- the _Sem version should be called only during semantic analysis.
- function Static_Boolean (N : Node_Id) return Uint;
+ function Static_Boolean (N : Node_Id) return Opt_Ubool;
-- This function analyzes the given expression node and then resolves it
-- as Standard.Boolean. If the result is static, then Uint_1 or Uint_0 is
-- returned corresponding to the value, otherwise an error message is
diff --git a/gcc/ada/uintp.adb b/gcc/ada/uintp.adb
index 51af9b4..dad4e9b 100644
--- a/gcc/ada/uintp.adb
+++ b/gcc/ada/uintp.adb
@@ -110,12 +110,12 @@ package body Uintp is
-- Local Subprograms --
-----------------------
- function Direct (U : Uint) return Boolean;
+ function Direct (U : Valid_Uint) return Boolean;
pragma Inline (Direct);
-- Returns True if U is represented directly
- function Direct_Val (U : Uint) return Int;
- -- U is a Uint for is represented directly. The returned result is the
+ function Direct_Val (U : Valid_Uint) return Int;
+ -- U is a Uint that is represented directly. The returned result is the
-- value represented.
function GCD (Jin, Kin : Int) return Int;
@@ -129,7 +129,7 @@ package body Uintp is
-- UI_Image, and false for UI_Write, and Format is copied from the Format
-- parameter to UI_Image or UI_Write.
- procedure Init_Operand (UI : Uint; Vec : out UI_Vector);
+ procedure Init_Operand (UI : Valid_Uint; Vec : out UI_Vector);
pragma Inline (Init_Operand);
-- This procedure puts the value of UI into the vector in canonical
-- multiple precision format. The parameter should be of the correct size
@@ -141,7 +141,7 @@ package body Uintp is
function Vector_To_Uint
(In_Vec : UI_Vector;
- Negative : Boolean) return Uint;
+ Negative : Boolean) return Valid_Uint;
-- Functions that calculate values in UI_Vectors, call this function to
-- create and return the Uint value. In_Vec contains the multiple precision
-- (Base) representation of a non-negative value. Leading zeroes are
@@ -155,7 +155,7 @@ package body Uintp is
-- processing of signs is something that is done by the caller before
-- calling Vector_To_Uint.
- function Least_Sig_Digit (Arg : Uint) return Int;
+ function Least_Sig_Digit (Arg : Valid_Uint) return Int;
pragma Inline (Least_Sig_Digit);
-- Returns the Least Significant Digit of Arg quickly. When the given Uint
-- is less than 2**15, the value returned is the input value, in this case
@@ -165,8 +165,8 @@ package body Uintp is
-- two.
procedure Most_Sig_2_Digits
- (Left : Uint;
- Right : Uint;
+ (Left : Valid_Uint;
+ Right : Valid_Uint;
Left_Hat : out Int;
Right_Hat : out Int);
-- Returns leading two significant digits from the given pair of Uint's.
@@ -174,29 +174,40 @@ package body Uintp is
-- K is as small as possible S.T. Right_Hat < Base * Base. It is required
-- that Left >= Right for the algorithm to work.
- function N_Digits (Input : Uint) return Int;
+ function N_Digits (Input : Valid_Uint) return Int;
pragma Inline (N_Digits);
-- Returns number of "digits" in a Uint
procedure UI_Div_Rem
- (Left, Right : Uint;
+ (Left, Right : Valid_Uint;
Quotient : out Uint;
Remainder : out Uint;
Discard_Quotient : Boolean := False;
Discard_Remainder : Boolean := False);
-- Compute Euclidean division of Left by Right. If Discard_Quotient is
- -- False then the quotient is returned in Quotient (otherwise Quotient is
- -- set to No_Uint). If Discard_Remainder is False, then the remainder is
- -- returned in Remainder (otherwise Remainder is set to No_Uint).
+ -- False then the quotient is returned in Quotient. If Discard_Remainder
+ -- is False, then the remainder is returned in Remainder.
--
- -- If Discard_Quotient is True, Quotient is set to No_Uint
- -- If Discard_Remainder is True, Remainder is set to No_Uint
+ -- If Discard_Quotient is True, Quotient is set to No_Uint.
+ -- If Discard_Remainder is True, Remainder is set to No_Uint.
+
+ function UI_Modular_Exponentiation
+ (B : Valid_Uint;
+ E : Valid_Uint;
+ Modulo : Valid_Uint) return Valid_Uint with Unreferenced;
+ -- Efficiently compute (B**E) rem Modulo
+
+ function UI_Modular_Inverse
+ (N : Valid_Uint; Modulo : Valid_Uint) return Valid_Uint with Unreferenced;
+ -- Compute the multiplicative inverse of N in modular arithmetics with the
+ -- given Modulo (uses Euclid's algorithm). Note: the call is considered
+ -- to be erroneous (and the behavior is undefined) if n is not invertible.
------------
-- Direct --
------------
- function Direct (U : Uint) return Boolean is
+ function Direct (U : Valid_Uint) return Boolean is
begin
return Int (U) <= Int (Uint_Direct_Last);
end Direct;
@@ -205,7 +216,7 @@ package body Uintp is
-- Direct_Val --
----------------
- function Direct_Val (U : Uint) return Int is
+ function Direct_Val (U : Valid_Uint) return Int is
begin
pragma Assert (Direct (U));
return Int (U) - Int (Uint_Direct_Bias);
@@ -252,8 +263,8 @@ package body Uintp is
Format : UI_Format)
is
Marks : constant Uintp.Save_Mark := Uintp.Mark;
- Base : Uint;
- Ainput : Uint;
+ Base : Valid_Uint;
+ Ainput : Valid_Uint;
Digs_Output : Natural := 0;
-- Counts digits output. In hex mode, but not in decimal mode, we
@@ -277,7 +288,7 @@ package body Uintp is
-- Output non-zero exponent. Note that we only use the exponent form in
-- the buffer case, so we know that To_Buffer is true.
- procedure Image_Uint (U : Uint);
+ procedure Image_Uint (U : Valid_Uint);
-- Internal procedure to output characters of non-negative Uint
-------------------
@@ -285,8 +296,8 @@ package body Uintp is
-------------------
function Better_In_Hex return Boolean is
- T16 : constant Uint := Uint_2**Int'(16);
- A : Uint;
+ T16 : constant Valid_Uint := Uint_2**Int'(16);
+ A : Valid_Uint;
begin
A := UI_Abs (Input);
@@ -364,11 +375,11 @@ package body Uintp is
-- Image_Uint --
----------------
- procedure Image_Uint (U : Uint) is
+ procedure Image_Uint (U : Valid_Uint) is
H : constant array (Int range 0 .. 15) of Character :=
"0123456789ABCDEF";
- Q, R : Uint;
+ Q, R : Valid_Uint;
begin
UI_Div_Rem (U, Base, Q, R);
@@ -431,7 +442,7 @@ package body Uintp is
-- Init_Operand --
-------------------
- procedure Init_Operand (UI : Uint; Vec : out UI_Vector) is
+ procedure Init_Operand (UI : Valid_Uint; Vec : out UI_Vector) is
Loc : Int;
pragma Assert (Vec'First = Int'(1));
@@ -482,7 +493,7 @@ package body Uintp is
-- Least_Sig_Digit --
---------------------
- function Least_Sig_Digit (Arg : Uint) return Int is
+ function Least_Sig_Digit (Arg : Valid_Uint) return Int is
V : Int;
begin
@@ -518,8 +529,8 @@ package body Uintp is
-----------------------
procedure Most_Sig_2_Digits
- (Left : Uint;
- Right : Uint;
+ (Left : Valid_Uint;
+ Right : Valid_Uint;
Left_Hat : out Int;
Right_Hat : out Int)
is
@@ -580,9 +591,7 @@ package body Uintp is
-- N_Digits --
---------------
- -- Note: N_Digits returns 1 for No_Uint
-
- function N_Digits (Input : Uint) return Int is
+ function N_Digits (Input : Valid_Uint) return Int is
begin
if Direct (Input) then
if Direct_Val (Input) >= Base then
@@ -600,7 +609,7 @@ package body Uintp is
-- Num_Bits --
--------------
- function Num_Bits (Input : Uint) return Nat is
+ function Num_Bits (Input : Valid_Uint) return Nat is
Bits : Nat;
Num : Nat;
@@ -661,7 +670,7 @@ package body Uintp is
procedure Release (M : Save_Mark) is
begin
- Uints.Set_Last (Uint'Max (M.Save_Uint, Uints_Min));
+ Uints.Set_Last (Valid_Uint'Max (M.Save_Uint, Uints_Min));
Udigits.Set_Last (Int'Max (M.Save_Udigit, Udigits_Min));
end Release;
@@ -669,7 +678,7 @@ package body Uintp is
-- Release_And_Save --
----------------------
- procedure Release_And_Save (M : Save_Mark; UI : in out Uint) is
+ procedure Release_And_Save (M : Save_Mark; UI : in out Valid_Uint) is
begin
if Direct (UI) then
Release (M);
@@ -695,7 +704,7 @@ package body Uintp is
end if;
end Release_And_Save;
- procedure Release_And_Save (M : Save_Mark; UI1, UI2 : in out Uint) is
+ procedure Release_And_Save (M : Save_Mark; UI1, UI2 : in out Valid_Uint) is
begin
if Direct (UI1) then
Release_And_Save (M, UI2);
@@ -741,7 +750,7 @@ package body Uintp is
-- UI_Abs --
-------------
- function UI_Abs (Right : Uint) return Uint is
+ function UI_Abs (Right : Valid_Uint) return Unat is
begin
if Right < Uint_0 then
return -Right;
@@ -754,18 +763,23 @@ package body Uintp is
-- UI_Add --
-------------
- function UI_Add (Left : Int; Right : Uint) return Uint is
+ function UI_Add (Left : Int; Right : Valid_Uint) return Valid_Uint is
begin
return UI_Add (UI_From_Int (Left), Right);
end UI_Add;
- function UI_Add (Left : Uint; Right : Int) return Uint is
+ function UI_Add (Left : Valid_Uint; Right : Int) return Valid_Uint is
begin
return UI_Add (Left, UI_From_Int (Right));
end UI_Add;
- function UI_Add (Left : Uint; Right : Uint) return Uint is
+ function UI_Add (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint is
begin
+ pragma Assert (Present (Left));
+ pragma Assert (Present (Right));
+ -- Assertions are here in case we're called from C++ code, which does
+ -- not check the predicates.
+
-- Simple cases of direct operands and addition of zero
if Direct (Left) then
@@ -930,7 +944,7 @@ package body Uintp is
-- UI_Decimal_Digits_Hi --
--------------------------
- function UI_Decimal_Digits_Hi (U : Uint) return Nat is
+ function UI_Decimal_Digits_Hi (U : Valid_Uint) return Nat is
begin
-- The maximum value of a "digit" is 32767, which is 5 decimal digits,
-- so an N_Digit number could take up to 5 times this number of digits.
@@ -944,7 +958,7 @@ package body Uintp is
-- UI_Decimal_Digits_Lo --
--------------------------
- function UI_Decimal_Digits_Lo (U : Uint) return Nat is
+ function UI_Decimal_Digits_Lo (U : Valid_Uint) return Nat is
begin
-- The maximum value of a "digit" is 32767, which is more than four
-- decimal digits, but not a full five digits. The easily computed
@@ -959,24 +973,27 @@ package body Uintp is
-- UI_Div --
------------
- function UI_Div (Left : Int; Right : Uint) return Uint is
+ function UI_Div (Left : Int; Right : Nonzero_Uint) return Valid_Uint is
begin
return UI_Div (UI_From_Int (Left), Right);
end UI_Div;
- function UI_Div (Left : Uint; Right : Int) return Uint is
+ function UI_Div
+ (Left : Valid_Uint; Right : Nonzero_Int) return Valid_Uint
+ is
begin
return UI_Div (Left, UI_From_Int (Right));
end UI_Div;
- function UI_Div (Left, Right : Uint) return Uint is
- Quotient : Uint;
- Remainder : Uint;
- pragma Warnings (Off, Remainder);
+ function UI_Div
+ (Left : Valid_Uint; Right : Nonzero_Uint) return Valid_Uint
+ is
+ Quotient : Valid_Uint;
+ Ignored_Remainder : Uint;
begin
UI_Div_Rem
(Left, Right,
- Quotient, Remainder,
+ Quotient, Ignored_Remainder,
Discard_Remainder => True);
return Quotient;
end UI_Div;
@@ -986,7 +1003,7 @@ package body Uintp is
----------------
procedure UI_Div_Rem
- (Left, Right : Uint;
+ (Left, Right : Valid_Uint;
Quotient : out Uint;
Remainder : out Uint;
Discard_Quotient : Boolean := False;
@@ -1260,14 +1277,13 @@ package body Uintp is
if not Discard_Remainder then
declare
Remainder_V : UI_Vector (1 .. R_Length);
- Discard_Int : Int;
- pragma Warnings (Off, Discard_Int);
+ Ignore : Int;
begin
pragma Assert (D /= Int'(0));
UI_Div_Vector
(Dividend (Dividend'Last - R_Length + 1 .. Dividend'Last),
D,
- Remainder_V, Discard_Int);
+ Remainder_V, Ignore);
Remainder := Vector_To_Uint (Remainder_V, L_Vec (1) < Int_0);
end;
end if;
@@ -1279,17 +1295,17 @@ package body Uintp is
-- UI_Eq --
------------
- function UI_Eq (Left : Int; Right : Uint) return Boolean is
+ function UI_Eq (Left : Int; Right : Valid_Uint) return Boolean is
begin
return not UI_Ne (UI_From_Int (Left), Right);
end UI_Eq;
- function UI_Eq (Left : Uint; Right : Int) return Boolean is
+ function UI_Eq (Left : Valid_Uint; Right : Int) return Boolean is
begin
return not UI_Ne (Left, UI_From_Int (Right));
end UI_Eq;
- function UI_Eq (Left : Uint; Right : Uint) return Boolean is
+ function UI_Eq (Left : Valid_Uint; Right : Valid_Uint) return Boolean is
begin
return not UI_Ne (Left, Right);
end UI_Eq;
@@ -1298,22 +1314,24 @@ package body Uintp is
-- UI_Expon --
--------------
- function UI_Expon (Left : Int; Right : Uint) return Uint is
+ function UI_Expon (Left : Int; Right : Unat) return Valid_Uint is
begin
return UI_Expon (UI_From_Int (Left), Right);
end UI_Expon;
- function UI_Expon (Left : Uint; Right : Int) return Uint is
+ function UI_Expon (Left : Valid_Uint; Right : Nat) return Valid_Uint is
begin
return UI_Expon (Left, UI_From_Int (Right));
end UI_Expon;
- function UI_Expon (Left : Int; Right : Int) return Uint is
+ function UI_Expon (Left : Int; Right : Nat) return Valid_Uint is
begin
return UI_Expon (UI_From_Int (Left), UI_From_Int (Right));
end UI_Expon;
- function UI_Expon (Left : Uint; Right : Uint) return Uint is
+ function UI_Expon
+ (Left : Valid_Uint; Right : Unat) return Valid_Uint
+ is
begin
pragma Assert (Right >= Uint_0);
@@ -1386,9 +1404,9 @@ package body Uintp is
-- If we fall through, then we have the general case (see Knuth 4.6.3)
declare
- N : Uint := Right;
- Squares : Uint := Left;
- Result : Uint := Uint_1;
+ N : Valid_Uint := Right;
+ Squares : Valid_Uint := Left;
+ Result : Valid_Uint := Uint_1;
M : constant Uintp.Save_Mark := Uintp.Mark;
begin
@@ -1411,7 +1429,7 @@ package body Uintp is
-- UI_From_CC --
----------------
- function UI_From_CC (Input : Char_Code) return Uint is
+ function UI_From_CC (Input : Char_Code) return Valid_Uint is
begin
return UI_From_Int (Int (Input));
end UI_From_CC;
@@ -1420,12 +1438,12 @@ package body Uintp is
-- UI_From_Int --
-----------------
- function UI_From_Int (Input : Int) return Uint is
+ function UI_From_Int (Input : Int) return Valid_Uint is
U : Uint;
begin
if Min_Direct <= Input and then Input <= Max_Direct then
- return Uint (Int (Uint_Direct_Bias) + Input);
+ return Valid_Uint (Int (Uint_Direct_Bias) + Input);
end if;
-- If already in the hash table, return entry
@@ -1466,7 +1484,7 @@ package body Uintp is
-- UI_From_Integral --
----------------------
- function UI_From_Integral (Input : In_T) return Uint is
+ function UI_From_Integral (Input : In_T) return Valid_Uint is
begin
-- If in range of our normal conversion function, use it so we can use
-- direct access and our cache.
@@ -1487,7 +1505,7 @@ package body Uintp is
-- Base is defined so that 3 Uint digits is sufficient to hold the
-- largest possible Int value.
- U : Uint;
+ U : Valid_Uint;
V : UI_Vector (1 .. Max_For_In_T);
begin
@@ -1517,8 +1535,8 @@ package body Uintp is
-- We use the same notation as Knuth (U_Hat standing for the obvious)
- function UI_GCD (Uin, Vin : Uint) return Uint is
- U, V : Uint;
+ function UI_GCD (Uin, Vin : Valid_Uint) return Valid_Uint is
+ U, V : Valid_Uint;
-- Copies of Uin and Vin
U_Hat, V_Hat : Int;
@@ -1526,7 +1544,7 @@ package body Uintp is
A, B, C, D, T, Q, Den1, Den2 : Int;
- Tmp_UI : Uint;
+ Tmp_UI : Valid_Uint;
Marks : constant Uintp.Save_Mark := Uintp.Mark;
Iterations : Integer := 0;
@@ -1619,17 +1637,17 @@ package body Uintp is
-- UI_Ge --
------------
- function UI_Ge (Left : Int; Right : Uint) return Boolean is
+ function UI_Ge (Left : Int; Right : Valid_Uint) return Boolean is
begin
return not UI_Lt (UI_From_Int (Left), Right);
end UI_Ge;
- function UI_Ge (Left : Uint; Right : Int) return Boolean is
+ function UI_Ge (Left : Valid_Uint; Right : Int) return Boolean is
begin
return not UI_Lt (Left, UI_From_Int (Right));
end UI_Ge;
- function UI_Ge (Left : Uint; Right : Uint) return Boolean is
+ function UI_Ge (Left : Valid_Uint; Right : Valid_Uint) return Boolean is
begin
return not UI_Lt (Left, Right);
end UI_Ge;
@@ -1638,17 +1656,17 @@ package body Uintp is
-- UI_Gt --
------------
- function UI_Gt (Left : Int; Right : Uint) return Boolean is
+ function UI_Gt (Left : Int; Right : Valid_Uint) return Boolean is
begin
return UI_Lt (Right, UI_From_Int (Left));
end UI_Gt;
- function UI_Gt (Left : Uint; Right : Int) return Boolean is
+ function UI_Gt (Left : Valid_Uint; Right : Int) return Boolean is
begin
return UI_Lt (UI_From_Int (Right), Left);
end UI_Gt;
- function UI_Gt (Left : Uint; Right : Uint) return Boolean is
+ function UI_Gt (Left : Valid_Uint; Right : Valid_Uint) return Boolean is
begin
return UI_Lt (Left => Right, Right => Left);
end UI_Gt;
@@ -1681,11 +1699,14 @@ package body Uintp is
pragma Assert (Uint_Int_First /= Uint_0);
+ if No (Input) then -- Preserve old behavior
+ return True;
+ end if;
+
if Direct (Input) then
return True;
else
- return Input >= Uint_Int_First
- and then Input <= Uint_Int_Last;
+ return Input >= Uint_Int_First and then Input <= Uint_Int_Last;
end if;
end UI_Is_In_Int_Range;
@@ -1693,17 +1714,17 @@ package body Uintp is
-- UI_Le --
------------
- function UI_Le (Left : Int; Right : Uint) return Boolean is
+ function UI_Le (Left : Int; Right : Valid_Uint) return Boolean is
begin
return not UI_Lt (Right, UI_From_Int (Left));
end UI_Le;
- function UI_Le (Left : Uint; Right : Int) return Boolean is
+ function UI_Le (Left : Valid_Uint; Right : Int) return Boolean is
begin
return not UI_Lt (UI_From_Int (Right), Left);
end UI_Le;
- function UI_Le (Left : Uint; Right : Uint) return Boolean is
+ function UI_Le (Left : Valid_Uint; Right : Valid_Uint) return Boolean is
begin
return not UI_Lt (Left => Right, Right => Left);
end UI_Le;
@@ -1712,18 +1733,23 @@ package body Uintp is
-- UI_Lt --
------------
- function UI_Lt (Left : Int; Right : Uint) return Boolean is
+ function UI_Lt (Left : Int; Right : Valid_Uint) return Boolean is
begin
return UI_Lt (UI_From_Int (Left), Right);
end UI_Lt;
- function UI_Lt (Left : Uint; Right : Int) return Boolean is
+ function UI_Lt (Left : Valid_Uint; Right : Int) return Boolean is
begin
return UI_Lt (Left, UI_From_Int (Right));
end UI_Lt;
- function UI_Lt (Left : Uint; Right : Uint) return Boolean is
+ function UI_Lt (Left : Valid_Uint; Right : Valid_Uint) return Boolean is
begin
+ pragma Assert (Present (Left));
+ pragma Assert (Present (Right));
+ -- Assertions are here in case we're called from C++ code, which does
+ -- not check the predicates.
+
-- Quick processing for identical arguments
if Int (Left) = Int (Right) then
@@ -1805,17 +1831,17 @@ package body Uintp is
-- UI_Max --
------------
- function UI_Max (Left : Int; Right : Uint) return Uint is
+ function UI_Max (Left : Int; Right : Valid_Uint) return Valid_Uint is
begin
return UI_Max (UI_From_Int (Left), Right);
end UI_Max;
- function UI_Max (Left : Uint; Right : Int) return Uint is
+ function UI_Max (Left : Valid_Uint; Right : Int) return Valid_Uint is
begin
return UI_Max (Left, UI_From_Int (Right));
end UI_Max;
- function UI_Max (Left : Uint; Right : Uint) return Uint is
+ function UI_Max (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint is
begin
if Left >= Right then
return Left;
@@ -1828,17 +1854,17 @@ package body Uintp is
-- UI_Min --
------------
- function UI_Min (Left : Int; Right : Uint) return Uint is
+ function UI_Min (Left : Int; Right : Valid_Uint) return Valid_Uint is
begin
return UI_Min (UI_From_Int (Left), Right);
end UI_Min;
- function UI_Min (Left : Uint; Right : Int) return Uint is
+ function UI_Min (Left : Valid_Uint; Right : Int) return Valid_Uint is
begin
return UI_Min (Left, UI_From_Int (Right));
end UI_Min;
- function UI_Min (Left : Uint; Right : Uint) return Uint is
+ function UI_Min (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint is
begin
if Left <= Right then
return Left;
@@ -1851,18 +1877,22 @@ package body Uintp is
-- UI_Mod --
-------------
- function UI_Mod (Left : Int; Right : Uint) return Uint is
+ function UI_Mod (Left : Int; Right : Nonzero_Uint) return Valid_Uint is
begin
return UI_Mod (UI_From_Int (Left), Right);
end UI_Mod;
- function UI_Mod (Left : Uint; Right : Int) return Uint is
+ function UI_Mod
+ (Left : Valid_Uint; Right : Nonzero_Int) return Valid_Uint
+ is
begin
return UI_Mod (Left, UI_From_Int (Right));
end UI_Mod;
- function UI_Mod (Left : Uint; Right : Uint) return Uint is
- Urem : constant Uint := Left rem Right;
+ function UI_Mod
+ (Left : Valid_Uint; Right : Nonzero_Uint) return Valid_Uint
+ is
+ Urem : constant Valid_Uint := Left rem Right;
begin
if (Left < Uint_0) = (Right < Uint_0)
@@ -1879,15 +1909,15 @@ package body Uintp is
-------------------------------
function UI_Modular_Exponentiation
- (B : Uint;
- E : Uint;
- Modulo : Uint) return Uint
+ (B : Valid_Uint;
+ E : Valid_Uint;
+ Modulo : Valid_Uint) return Valid_Uint
is
M : constant Save_Mark := Mark;
- Result : Uint := Uint_1;
- Base : Uint := B;
- Exponent : Uint := E;
+ Result : Valid_Uint := Uint_1;
+ Base : Valid_Uint := B;
+ Exponent : Valid_Uint := E;
begin
while Exponent /= Uint_0 loop
@@ -1907,15 +1937,17 @@ package body Uintp is
-- UI_Modular_Inverse --
------------------------
- function UI_Modular_Inverse (N : Uint; Modulo : Uint) return Uint is
+ function UI_Modular_Inverse
+ (N : Valid_Uint; Modulo : Valid_Uint) return Valid_Uint
+ is
M : constant Save_Mark := Mark;
- U : Uint;
- V : Uint;
- Q : Uint;
- R : Uint;
- X : Uint;
- Y : Uint;
- T : Uint;
+ U : Valid_Uint;
+ V : Valid_Uint;
+ Q : Valid_Uint;
+ R : Valid_Uint;
+ X : Valid_Uint;
+ Y : Valid_Uint;
+ T : Valid_Uint;
S : Int := 1;
begin
@@ -1951,17 +1983,17 @@ package body Uintp is
-- UI_Mul --
------------
- function UI_Mul (Left : Int; Right : Uint) return Uint is
+ function UI_Mul (Left : Int; Right : Valid_Uint) return Valid_Uint is
begin
return UI_Mul (UI_From_Int (Left), Right);
end UI_Mul;
- function UI_Mul (Left : Uint; Right : Int) return Uint is
+ function UI_Mul (Left : Valid_Uint; Right : Int) return Valid_Uint is
begin
return UI_Mul (Left, UI_From_Int (Right));
end UI_Mul;
- function UI_Mul (Left : Uint; Right : Uint) return Uint is
+ function UI_Mul (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint is
begin
-- Case where product fits in the range of a 32-bit integer
@@ -2019,20 +2051,24 @@ package body Uintp is
-- UI_Ne --
------------
- function UI_Ne (Left : Int; Right : Uint) return Boolean is
+ function UI_Ne (Left : Int; Right : Valid_Uint) return Boolean is
begin
return UI_Ne (UI_From_Int (Left), Right);
end UI_Ne;
- function UI_Ne (Left : Uint; Right : Int) return Boolean is
+ function UI_Ne (Left : Valid_Uint; Right : Int) return Boolean is
begin
return UI_Ne (Left, UI_From_Int (Right));
end UI_Ne;
- function UI_Ne (Left : Uint; Right : Uint) return Boolean is
+ function UI_Ne (Left : Valid_Uint; Right : Valid_Uint) return Boolean is
begin
- -- Quick processing for identical arguments. Note that this takes
- -- care of the case of two No_Uint arguments.
+ pragma Assert (Present (Left));
+ pragma Assert (Present (Right));
+ -- Assertions are here in case we're called from C++ code, which does
+ -- not check the predicates.
+
+ -- Quick processing for identical arguments
if Int (Left) = Int (Right) then
return False;
@@ -2090,7 +2126,7 @@ package body Uintp is
-- UI_Negate --
----------------
- function UI_Negate (Right : Uint) return Uint is
+ function UI_Negate (Right : Valid_Uint) return Valid_Uint is
begin
-- Case where input is directly represented. Note that since the range
-- of Direct values is non-symmetrical, the result may not be directly
@@ -2123,20 +2159,23 @@ package body Uintp is
-- UI_Rem --
-------------
- function UI_Rem (Left : Int; Right : Uint) return Uint is
+ function UI_Rem (Left : Int; Right : Nonzero_Uint) return Valid_Uint is
begin
return UI_Rem (UI_From_Int (Left), Right);
end UI_Rem;
- function UI_Rem (Left : Uint; Right : Int) return Uint is
+ function UI_Rem
+ (Left : Valid_Uint; Right : Nonzero_Int) return Valid_Uint
+ is
begin
return UI_Rem (Left, UI_From_Int (Right));
end UI_Rem;
- function UI_Rem (Left, Right : Uint) return Uint is
- Remainder : Uint;
- Quotient : Uint;
- pragma Warnings (Off, Quotient);
+ function UI_Rem
+ (Left : Valid_Uint; Right : Nonzero_Uint) return Valid_Uint
+ is
+ Remainder : Valid_Uint;
+ Ignored_Quotient : Uint;
begin
pragma Assert (Right /= Uint_0);
@@ -2146,7 +2185,8 @@ package body Uintp is
else
UI_Div_Rem
- (Left, Right, Quotient, Remainder, Discard_Quotient => True);
+ (Left, Right, Ignored_Quotient, Remainder,
+ Discard_Quotient => True);
return Remainder;
end if;
end UI_Rem;
@@ -2155,17 +2195,17 @@ package body Uintp is
-- UI_Sub --
------------
- function UI_Sub (Left : Int; Right : Uint) return Uint is
+ function UI_Sub (Left : Int; Right : Valid_Uint) return Valid_Uint is
begin
return UI_Add (Left, -Right);
end UI_Sub;
- function UI_Sub (Left : Uint; Right : Int) return Uint is
+ function UI_Sub (Left : Valid_Uint; Right : Int) return Valid_Uint is
begin
return UI_Add (Left, -Right);
end UI_Sub;
- function UI_Sub (Left : Uint; Right : Uint) return Uint is
+ function UI_Sub (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint is
begin
if Direct (Left) and then Direct (Right) then
return UI_From_Int (Direct_Val (Left) - Direct_Val (Right));
@@ -2178,7 +2218,7 @@ package body Uintp is
-- UI_To_CC --
--------------
- function UI_To_CC (Input : Uint) return Char_Code is
+ function UI_To_CC (Input : Valid_Uint) return Char_Code is
begin
if Direct (Input) then
return Char_Code (Direct_Val (Input));
@@ -2309,8 +2349,7 @@ package body Uintp is
function Vector_To_Uint
(In_Vec : UI_Vector;
- Negative : Boolean)
- return Uint
+ Negative : Boolean) return Valid_Uint
is
Size : Int;
Val : Int;
@@ -2330,9 +2369,9 @@ package body Uintp is
if Size = Int_1 then
if Negative then
- return Uint (Int (Uint_Direct_Bias) - In_Vec (J));
+ return Valid_Uint (Int (Uint_Direct_Bias) - In_Vec (J));
else
- return Uint (Int (Uint_Direct_Bias) + In_Vec (J));
+ return Valid_Uint (Int (Uint_Direct_Bias) + In_Vec (J));
end if;
-- Positive two digit values may be in direct representation range
@@ -2341,7 +2380,7 @@ package body Uintp is
Val := In_Vec (J) * Base + In_Vec (J + 1);
if Val <= Max_Direct then
- return Uint (Int (Uint_Direct_Bias) + Val);
+ return Valid_Uint (Int (Uint_Direct_Bias) + Val);
end if;
end if;
diff --git a/gcc/ada/uintp.ads b/gcc/ada/uintp.ads
index eb7137c..75bc558 100644
--- a/gcc/ada/uintp.ads
+++ b/gcc/ada/uintp.ads
@@ -91,12 +91,18 @@ package Uintp is
Uint_Minus_128 : constant Uint;
function No (X : Uint) return Boolean is (X = No_Uint);
+ -- Note that this is using the predefined "=", not the "=" declared below,
+ -- which would blow up on No_Uint.
+
function Present (X : Uint) return Boolean is (not No (X));
subtype Valid_Uint is Uint with Predicate => Present (Valid_Uint);
subtype Unat is Valid_Uint with Predicate => Unat >= Uint_0; -- natural
subtype Upos is Valid_Uint with Predicate => Upos >= Uint_1; -- positive
subtype Nonzero_Uint is Valid_Uint with Predicate => Nonzero_Uint /= Uint_0;
+ subtype Ubool is Valid_Uint with Predicate => Ubool in Uint_0 | Uint_1;
+ subtype Opt_Ubool is Uint with
+ Predicate => No (Opt_Ubool) or else Opt_Ubool in Ubool;
-----------------
-- Subprograms --
@@ -107,141 +113,131 @@ package Uintp is
-- unit, these are among the few tables that can be expanded during
-- gigi processing.
- function UI_Abs (Right : Uint) return Uint;
+ function UI_Abs (Right : Valid_Uint) return Unat;
pragma Inline (UI_Abs);
-- Returns abs function of universal integer
- function UI_Add (Left : Uint; Right : Uint) return Uint;
- function UI_Add (Left : Int; Right : Uint) return Uint;
- function UI_Add (Left : Uint; Right : Int) return Uint;
+ function UI_Add (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint;
+ function UI_Add (Left : Int; Right : Valid_Uint) return Valid_Uint;
+ function UI_Add (Left : Valid_Uint; Right : Int) return Valid_Uint;
-- Returns sum of two integer values
- function UI_Decimal_Digits_Hi (U : Uint) return Nat;
+ function UI_Decimal_Digits_Hi (U : Valid_Uint) return Nat;
-- Returns an estimate of the number of decimal digits required to
-- represent the absolute value of U. This estimate is correct or high,
-- i.e. it never returns a value that is too low. The accuracy of the
-- estimate affects only the effectiveness of comparison optimizations
-- in Urealp.
- function UI_Decimal_Digits_Lo (U : Uint) return Nat;
+ function UI_Decimal_Digits_Lo (U : Valid_Uint) return Nat;
-- Returns an estimate of the number of decimal digits required to
-- represent the absolute value of U. This estimate is correct or low,
-- i.e. it never returns a value that is too high. The accuracy of the
-- estimate affects only the effectiveness of comparison optimizations
-- in Urealp.
- function UI_Div (Left : Uint; Right : Uint) return Uint;
- function UI_Div (Left : Int; Right : Uint) return Uint;
- function UI_Div (Left : Uint; Right : Int) return Uint;
+ function UI_Div (Left : Valid_Uint; Right : Nonzero_Uint) return Valid_Uint;
+ function UI_Div (Left : Int; Right : Nonzero_Uint) return Valid_Uint;
+ function UI_Div (Left : Valid_Uint; Right : Nonzero_Int) return Valid_Uint;
-- Returns quotient of two integer values. Fatal error if Right = 0
- function UI_Eq (Left : Uint; Right : Uint) return Boolean;
- function UI_Eq (Left : Int; Right : Uint) return Boolean;
- function UI_Eq (Left : Uint; Right : Int) return Boolean;
+ function UI_Eq (Left : Valid_Uint; Right : Valid_Uint) return Boolean;
+ function UI_Eq (Left : Int; Right : Valid_Uint) return Boolean;
+ function UI_Eq (Left : Valid_Uint; Right : Int) return Boolean;
pragma Inline (UI_Eq);
-- Compares integer values for equality
- function UI_Expon (Left : Uint; Right : Uint) return Uint;
- function UI_Expon (Left : Int; Right : Uint) return Uint;
- function UI_Expon (Left : Uint; Right : Int) return Uint;
- function UI_Expon (Left : Int; Right : Int) return Uint;
+ function UI_Expon (Left : Valid_Uint; Right : Unat) return Valid_Uint;
+ function UI_Expon (Left : Int; Right : Unat) return Valid_Uint;
+ function UI_Expon (Left : Valid_Uint; Right : Nat) return Valid_Uint;
+ function UI_Expon (Left : Int; Right : Nat) return Valid_Uint;
-- Returns result of exponentiating two integer values.
-- Fatal error if Right is negative.
- function UI_GCD (Uin, Vin : Uint) return Uint;
+ function UI_GCD (Uin, Vin : Valid_Uint) return Valid_Uint;
-- Computes GCD of input values. Assumes Uin >= Vin >= 0
- function UI_Ge (Left : Uint; Right : Uint) return Boolean;
- function UI_Ge (Left : Int; Right : Uint) return Boolean;
- function UI_Ge (Left : Uint; Right : Int) return Boolean;
+ function UI_Ge (Left : Valid_Uint; Right : Valid_Uint) return Boolean;
+ function UI_Ge (Left : Int; Right : Valid_Uint) return Boolean;
+ function UI_Ge (Left : Valid_Uint; Right : Int) return Boolean;
pragma Inline (UI_Ge);
-- Compares integer values for greater than or equal
- function UI_Gt (Left : Uint; Right : Uint) return Boolean;
- function UI_Gt (Left : Int; Right : Uint) return Boolean;
- function UI_Gt (Left : Uint; Right : Int) return Boolean;
+ function UI_Gt (Left : Valid_Uint; Right : Valid_Uint) return Boolean;
+ function UI_Gt (Left : Int; Right : Valid_Uint) return Boolean;
+ function UI_Gt (Left : Valid_Uint; Right : Int) return Boolean;
pragma Inline (UI_Gt);
-- Compares integer values for greater than
function UI_Is_In_Int_Range (Input : Uint) return Boolean;
pragma Inline (UI_Is_In_Int_Range);
- -- Determines if universal integer is in Int range
+ -- Determines if universal integer is in Int range.
+ -- Input should probably be of type Valid_Uint.
- function UI_Le (Left : Uint; Right : Uint) return Boolean;
- function UI_Le (Left : Int; Right : Uint) return Boolean;
- function UI_Le (Left : Uint; Right : Int) return Boolean;
+ function UI_Le (Left : Valid_Uint; Right : Valid_Uint) return Boolean;
+ function UI_Le (Left : Int; Right : Valid_Uint) return Boolean;
+ function UI_Le (Left : Valid_Uint; Right : Int) return Boolean;
pragma Inline (UI_Le);
-- Compares integer values for less than or equal
- function UI_Lt (Left : Uint; Right : Uint) return Boolean;
- function UI_Lt (Left : Int; Right : Uint) return Boolean;
- function UI_Lt (Left : Uint; Right : Int) return Boolean;
+ function UI_Lt (Left : Valid_Uint; Right : Valid_Uint) return Boolean;
+ function UI_Lt (Left : Int; Right : Valid_Uint) return Boolean;
+ function UI_Lt (Left : Valid_Uint; Right : Int) return Boolean;
-- Compares integer values for less than
- function UI_Max (Left : Uint; Right : Uint) return Uint;
- function UI_Max (Left : Int; Right : Uint) return Uint;
- function UI_Max (Left : Uint; Right : Int) return Uint;
+ function UI_Max (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint;
+ function UI_Max (Left : Int; Right : Valid_Uint) return Valid_Uint;
+ function UI_Max (Left : Valid_Uint; Right : Int) return Valid_Uint;
-- Returns maximum of two integer values
- function UI_Min (Left : Uint; Right : Uint) return Uint;
- function UI_Min (Left : Int; Right : Uint) return Uint;
- function UI_Min (Left : Uint; Right : Int) return Uint;
+ function UI_Min (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint;
+ function UI_Min (Left : Int; Right : Valid_Uint) return Valid_Uint;
+ function UI_Min (Left : Valid_Uint; Right : Int) return Valid_Uint;
-- Returns minimum of two integer values
- function UI_Mod (Left : Uint; Right : Uint) return Uint;
- function UI_Mod (Left : Int; Right : Uint) return Uint;
- function UI_Mod (Left : Uint; Right : Int) return Uint;
+ function UI_Mod (Left : Valid_Uint; Right : Nonzero_Uint) return Valid_Uint;
+ function UI_Mod (Left : Int; Right : Nonzero_Uint) return Valid_Uint;
+ function UI_Mod (Left : Valid_Uint; Right : Nonzero_Int) return Valid_Uint;
pragma Inline (UI_Mod);
-- Returns mod function of two integer values
- function UI_Mul (Left : Uint; Right : Uint) return Uint;
- function UI_Mul (Left : Int; Right : Uint) return Uint;
- function UI_Mul (Left : Uint; Right : Int) return Uint;
+ function UI_Mul (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint;
+ function UI_Mul (Left : Int; Right : Valid_Uint) return Valid_Uint;
+ function UI_Mul (Left : Valid_Uint; Right : Int) return Valid_Uint;
-- Returns product of two integer values
- function UI_Ne (Left : Uint; Right : Uint) return Boolean;
- function UI_Ne (Left : Int; Right : Uint) return Boolean;
- function UI_Ne (Left : Uint; Right : Int) return Boolean;
+ function UI_Ne (Left : Valid_Uint; Right : Valid_Uint) return Boolean;
+ function UI_Ne (Left : Int; Right : Valid_Uint) return Boolean;
+ function UI_Ne (Left : Valid_Uint; Right : Int) return Boolean;
pragma Inline (UI_Ne);
-- Compares integer values for inequality
- function UI_Negate (Right : Uint) return Uint;
+ function UI_Negate (Right : Valid_Uint) return Valid_Uint;
pragma Inline (UI_Negate);
-- Returns negative of universal integer
- function UI_Rem (Left : Uint; Right : Uint) return Uint;
- function UI_Rem (Left : Int; Right : Uint) return Uint;
- function UI_Rem (Left : Uint; Right : Int) return Uint;
+ function UI_Rem (Left : Valid_Uint; Right : Nonzero_Uint) return Valid_Uint;
+ function UI_Rem (Left : Int; Right : Nonzero_Uint) return Valid_Uint;
+ function UI_Rem (Left : Valid_Uint; Right : Nonzero_Int) return Valid_Uint;
-- Returns rem of two integer values
- function UI_Sub (Left : Uint; Right : Uint) return Uint;
- function UI_Sub (Left : Int; Right : Uint) return Uint;
- function UI_Sub (Left : Uint; Right : Int) return Uint;
+ function UI_Sub (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint;
+ function UI_Sub (Left : Int; Right : Valid_Uint) return Valid_Uint;
+ function UI_Sub (Left : Valid_Uint; Right : Int) return Valid_Uint;
pragma Inline (UI_Sub);
-- Returns difference of two integer values
- function UI_Modular_Exponentiation
- (B : Uint;
- E : Uint;
- Modulo : Uint) return Uint;
- -- Efficiently compute (B**E) rem Modulo
-
- function UI_Modular_Inverse (N : Uint; Modulo : Uint) return Uint;
- -- Compute the multiplicative inverse of N in modular arithmetics with the
- -- given Modulo (uses Euclid's algorithm). Note: the call is considered
- -- to be erroneous (and the behavior is undefined) if n is not invertible.
-
- function UI_From_Int (Input : Int) return Uint;
+ function UI_From_Int (Input : Int) return Valid_Uint;
-- Converts Int value to universal integer form
generic
type In_T is range <>;
- function UI_From_Integral (Input : In_T) return Uint;
+ function UI_From_Integral (Input : In_T) return Valid_Uint;
-- Likewise, but converts from any integer type. Must not be applied to
-- biased types (instantiation will provide a warning if actual is a biased
-- type).
- function UI_From_CC (Input : Char_Code) return Uint;
+ function UI_From_CC (Input : Char_Code) return Valid_Uint;
-- Converts Char_Code value to universal integer form
function UI_To_Int (Input : Valid_Uint) return Int;
@@ -253,11 +249,11 @@ package Uintp is
-- Converts universal integer value to Unsigned_64. Constraint_Error if
-- value is not in appropriate range.
- function UI_To_CC (Input : Uint) return Char_Code;
+ function UI_To_CC (Input : Valid_Uint) return Char_Code;
-- Converts universal integer value to Char_Code. Constraint_Error if value
-- is not in Char_Code range.
- function Num_Bits (Input : Uint) return Nat;
+ function Num_Bits (Input : Valid_Uint) return Nat;
-- Approximate number of binary bits in given universal integer. This
-- function is used for capacity checks, and it can be one bit off
-- without affecting its usage.
@@ -313,58 +309,97 @@ package Uintp is
-- Operator Renamings --
------------------------
- function "+" (Left : Uint; Right : Uint) return Uint renames UI_Add;
- function "+" (Left : Int; Right : Uint) return Uint renames UI_Add;
- function "+" (Left : Uint; Right : Int) return Uint renames UI_Add;
-
- function "/" (Left : Uint; Right : Uint) return Uint renames UI_Div;
- function "/" (Left : Int; Right : Uint) return Uint renames UI_Div;
- function "/" (Left : Uint; Right : Int) return Uint renames UI_Div;
-
- function "*" (Left : Uint; Right : Uint) return Uint renames UI_Mul;
- function "*" (Left : Int; Right : Uint) return Uint renames UI_Mul;
- function "*" (Left : Uint; Right : Int) return Uint renames UI_Mul;
-
- function "-" (Left : Uint; Right : Uint) return Uint renames UI_Sub;
- function "-" (Left : Int; Right : Uint) return Uint renames UI_Sub;
- function "-" (Left : Uint; Right : Int) return Uint renames UI_Sub;
-
- function "**" (Left : Uint; Right : Uint) return Uint renames UI_Expon;
- function "**" (Left : Uint; Right : Int) return Uint renames UI_Expon;
- function "**" (Left : Int; Right : Uint) return Uint renames UI_Expon;
- function "**" (Left : Int; Right : Int) return Uint renames UI_Expon;
-
- function "abs" (Real : Uint) return Uint renames UI_Abs;
-
- function "mod" (Left : Uint; Right : Uint) return Uint renames UI_Mod;
- function "mod" (Left : Int; Right : Uint) return Uint renames UI_Mod;
- function "mod" (Left : Uint; Right : Int) return Uint renames UI_Mod;
-
- function "rem" (Left : Uint; Right : Uint) return Uint renames UI_Rem;
- function "rem" (Left : Int; Right : Uint) return Uint renames UI_Rem;
- function "rem" (Left : Uint; Right : Int) return Uint renames UI_Rem;
-
- function "-" (Real : Uint) return Uint renames UI_Negate;
-
- function "=" (Left : Uint; Right : Uint) return Boolean renames UI_Eq;
- function "=" (Left : Int; Right : Uint) return Boolean renames UI_Eq;
- function "=" (Left : Uint; Right : Int) return Boolean renames UI_Eq;
-
- function ">=" (Left : Uint; Right : Uint) return Boolean renames UI_Ge;
- function ">=" (Left : Int; Right : Uint) return Boolean renames UI_Ge;
- function ">=" (Left : Uint; Right : Int) return Boolean renames UI_Ge;
-
- function ">" (Left : Uint; Right : Uint) return Boolean renames UI_Gt;
- function ">" (Left : Int; Right : Uint) return Boolean renames UI_Gt;
- function ">" (Left : Uint; Right : Int) return Boolean renames UI_Gt;
-
- function "<=" (Left : Uint; Right : Uint) return Boolean renames UI_Le;
- function "<=" (Left : Int; Right : Uint) return Boolean renames UI_Le;
- function "<=" (Left : Uint; Right : Int) return Boolean renames UI_Le;
-
- function "<" (Left : Uint; Right : Uint) return Boolean renames UI_Lt;
- function "<" (Left : Int; Right : Uint) return Boolean renames UI_Lt;
- function "<" (Left : Uint; Right : Int) return Boolean renames UI_Lt;
+ function "+" (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint
+ renames UI_Add;
+ function "+" (Left : Int; Right : Valid_Uint) return Valid_Uint
+ renames UI_Add;
+ function "+" (Left : Valid_Uint; Right : Int) return Valid_Uint
+ renames UI_Add;
+
+ function "/" (Left : Valid_Uint; Right : Nonzero_Uint) return Valid_Uint
+ renames UI_Div;
+ function "/" (Left : Int; Right : Nonzero_Uint) return Valid_Uint
+ renames UI_Div;
+ function "/" (Left : Valid_Uint; Right : Nonzero_Int) return Valid_Uint
+ renames UI_Div;
+
+ function "*" (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint
+ renames UI_Mul;
+ function "*" (Left : Int; Right : Valid_Uint) return Valid_Uint
+ renames UI_Mul;
+ function "*" (Left : Valid_Uint; Right : Int) return Valid_Uint
+ renames UI_Mul;
+
+ function "-" (Left : Valid_Uint; Right : Valid_Uint) return Valid_Uint
+ renames UI_Sub;
+ function "-" (Left : Int; Right : Valid_Uint) return Valid_Uint
+ renames UI_Sub;
+ function "-" (Left : Valid_Uint; Right : Int) return Valid_Uint
+ renames UI_Sub;
+
+ function "**" (Left : Valid_Uint; Right : Unat) return Valid_Uint
+ renames UI_Expon;
+ function "**" (Left : Valid_Uint; Right : Nat) return Valid_Uint
+ renames UI_Expon;
+ function "**" (Left : Int; Right : Unat) return Valid_Uint
+ renames UI_Expon;
+ function "**" (Left : Int; Right : Nat) return Valid_Uint
+ renames UI_Expon;
+
+ function "abs" (Real : Valid_Uint) return Unat
+ renames UI_Abs;
+
+ function "mod" (Left : Valid_Uint; Right : Nonzero_Uint) return Valid_Uint
+ renames UI_Mod;
+ function "mod" (Left : Int; Right : Nonzero_Uint) return Valid_Uint
+ renames UI_Mod;
+ function "mod" (Left : Valid_Uint; Right : Nonzero_Int) return Valid_Uint
+ renames UI_Mod;
+
+ function "rem" (Left : Valid_Uint; Right : Nonzero_Uint) return Valid_Uint
+ renames UI_Rem;
+ function "rem" (Left : Int; Right : Nonzero_Uint) return Valid_Uint
+ renames UI_Rem;
+ function "rem" (Left : Valid_Uint; Right : Nonzero_Int) return Valid_Uint
+ renames UI_Rem;
+
+ function "-" (Real : Valid_Uint) return Valid_Uint
+ renames UI_Negate;
+
+ function "=" (Left : Valid_Uint; Right : Valid_Uint) return Boolean
+ renames UI_Eq;
+ function "=" (Left : Int; Right : Valid_Uint) return Boolean
+ renames UI_Eq;
+ function "=" (Left : Valid_Uint; Right : Int) return Boolean
+ renames UI_Eq;
+
+ function ">=" (Left : Valid_Uint; Right : Valid_Uint) return Boolean
+ renames UI_Ge;
+ function ">=" (Left : Int; Right : Valid_Uint) return Boolean
+ renames UI_Ge;
+ function ">=" (Left : Valid_Uint; Right : Int) return Boolean
+ renames UI_Ge;
+
+ function ">" (Left : Valid_Uint; Right : Valid_Uint) return Boolean
+ renames UI_Gt;
+ function ">" (Left : Int; Right : Valid_Uint) return Boolean
+ renames UI_Gt;
+ function ">" (Left : Valid_Uint; Right : Int) return Boolean
+ renames UI_Gt;
+
+ function "<=" (Left : Valid_Uint; Right : Valid_Uint) return Boolean
+ renames UI_Le;
+ function "<=" (Left : Int; Right : Valid_Uint) return Boolean
+ renames UI_Le;
+ function "<=" (Left : Valid_Uint; Right : Int) return Boolean
+ renames UI_Le;
+
+ function "<" (Left : Valid_Uint; Right : Valid_Uint) return Boolean
+ renames UI_Lt;
+ function "<" (Left : Int; Right : Valid_Uint) return Boolean
+ renames UI_Lt;
+ function "<" (Left : Valid_Uint; Right : Int) return Boolean
+ renames UI_Lt;
-----------------------------
-- Mark/Release Processing --
@@ -384,12 +419,12 @@ package Uintp is
procedure Release (M : Save_Mark);
-- Release storage allocated since mark was noted
- procedure Release_And_Save (M : Save_Mark; UI : in out Uint);
+ procedure Release_And_Save (M : Save_Mark; UI : in out Valid_Uint);
-- Like Release, except that the given Uint value (which is typically among
-- the data being released) is recopied after the release, so that it is
-- the most recent item, and UI is updated to point to its copied location.
- procedure Release_And_Save (M : Save_Mark; UI1, UI2 : in out Uint);
+ procedure Release_And_Save (M : Save_Mark; UI1, UI2 : in out Valid_Uint);
-- Like Release, except that the given Uint values (which are typically
-- among the data being released) are recopied after the release, so that
-- they are the most recent items, and UI1 and UI2 are updated if necessary
@@ -493,7 +528,7 @@ private
-- UI_Mul to efficiently compute the product in this case.
type Save_Mark is record
- Save_Uint : Uint;
+ Save_Uint : Valid_Uint;
Save_Udigit : Int;
end record;