diff options
-rw-r--r-- | gcc/ada/exp_attr.adb | 6 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/modular6.adb | 15 |
2 files changed, 19 insertions, 2 deletions
diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb index 251fa14..b21592c 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 0000000..f0f1c80 --- /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; |