From: Ed Schonberg Date: Thu, 10 Dec 2020 21:26:57 +0000 (+0100) Subject: Fix PR ada/98230 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=779bf1823ced0814803d2be7f7ded0317e70140c;p=gcc.git 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. --- 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 diff --git a/gcc/testsuite/gnat.dg/modular6.adb b/gcc/testsuite/gnat.dg/modular6.adb new file mode 100644 index 00000000000..f0f1c80c62f --- /dev/null +++ b/gcc/testsuite/gnat.dg/modular6.adb @@ -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;