It's a rather curious malfunction of the 'Mod attribute applied to the
variable of a loop whose upper bound is dynamic.
Tested on x86-64/Linux, applied on all active branches.
2020-12-10 Ed Schonberg <schonb...@adacore.com>
PR ada/98230
* exp_attr.adb (Expand_N_Attribute_Reference, case Mod): Use base
type of argument to obtain static bound and required size.
2020-12-10 Eric Botcazou <ebotca...@adacore.com>
* gnat.dg/modular6.adb: New test.
--
Eric Botcazou
diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb
index 251fa1449c4..b21592c78b2 100644
--- a/gcc/ada/exp_attr.adb
+++ b/gcc/ada/exp_attr.adb
@@ -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
-- { 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;