Fix PR ada/98230
It's a rather curious malfunction of the 'Mod attribute applied to the variable of a loop whose upper bound is dynamic. gcc/ada/ChangeLog: PR ada/98230 * exp_attr.adb (Expand_N_Attribute_Reference, case Mod): Use base type of argument to obtain static bound and required size. gcc/testsuite/ChangeLog: * gnat.dg/modular6.adb: New test.
This commit is contained in:
parent
3cf63c94df
commit
779bf1823c
@ -4702,13 +4702,15 @@ package body Exp_Attr is
|
||||
|
||||
when Attribute_Mod => Mod_Case : declare
|
||||
Arg : constant Node_Id := Relocate_Node (First (Exprs));
|
||||
Hi : constant Node_Id := Type_High_Bound (Etype (Arg));
|
||||
Hi : constant Node_Id := Type_High_Bound (Base_Type (Etype (Arg)));
|
||||
Modv : constant Uint := Modulus (Btyp);
|
||||
|
||||
begin
|
||||
|
||||
-- This is not so simple. The issue is what type to use for the
|
||||
-- computation of the modular value.
|
||||
-- computation of the modular value. In addition we need to use
|
||||
-- the base type as above to retrieve a static bound for the
|
||||
-- comparisons that follow.
|
||||
|
||||
-- The easy case is when the modulus value is within the bounds
|
||||
-- of the signed integer type of the argument. In this case we can
|
||||
|
15
gcc/testsuite/gnat.dg/modular6.adb
Normal file
15
gcc/testsuite/gnat.dg/modular6.adb
Normal file
@ -0,0 +1,15 @@
|
||||
-- { dg-do compile }
|
||||
|
||||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
|
||||
procedure Modular6 is
|
||||
Max : Integer := 0;
|
||||
|
||||
type Modulus is mod 3;
|
||||
begin
|
||||
Max := 30;
|
||||
|
||||
for N in 1 .. Max loop
|
||||
Put_Line("N: " & Integer'Image(N) & " Modulus: " & Integer'Image(Modulus'Modulus) & " Mod:" & Modulus'Image(Modulus'Mod(N)));
|
||||
end loop;
|
||||
end;
|
Loading…
Reference in New Issue
Block a user