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;