]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[Ada] Improve error message on mult/div between fixed-point and integer
authorYannick Moy <moy@adacore.com>
Mon, 1 Jul 2019 13:35:38 +0000 (13:35 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 1 Jul 2019 13:35:38 +0000 (13:35 +0000)
Multiplication and division of a fixed-point type by an integer type is
only defined by default for type Integer. Clarify the error message to
explain that a conversion is needed in other cases.

Also change an error message to start with lowercase as it should be.

2019-07-01  Yannick Moy  <moy@adacore.com>

gcc/ada/

* sem_ch4.adb (Operator_Check): Refine error message.

From-SVN: r272866

gcc/ada/ChangeLog
gcc/ada/sem_ch4.adb

index 68a682818bf3d6d03712e9b0b41f20eef5cf7e40..cf6dc8a2e74ba775f2b98652b7b4ec5e63231d4a 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-01  Yannick Moy  <moy@adacore.com>
+
+       * sem_ch4.adb (Operator_Check): Refine error message.
+
 2019-07-01  Piotr Trojanek  <trojanek@adacore.com>
 
        * libgnat/a-calend.ads: Revert "Global => null" contracts on
index 2c40011781decfd7b96358fef77625fc3d53d75b..03a156a3f77c0cba9f8adc386b3be825297896e2 100644 (file)
@@ -7375,7 +7375,7 @@ package body Sem_Ch4 is
                                   Etype (Next_Formal (First_Formal (Op_Id))))
                            then
                               Error_Msg_N
-                                ("No legal interpretation for operator&", N);
+                                ("no legal interpretation for operator&", N);
                               Error_Msg_NE
                                 ("\use clause on& would make operation legal",
                                  N, Scope (Op_Id));
@@ -7393,6 +7393,26 @@ package body Sem_Ch4 is
                            Error_Msg_NE ("\left operand has}!",  N, Etype (L));
                            Error_Msg_NE ("\right operand has}!", N, Etype (R));
 
+                           --  For multiplication and division operators with
+                           --  a fixed-point operand and an integer operand,
+                           --  indicate that the integer operand should be of
+                           --  type Integer.
+
+                           if Nkind_In (N, N_Op_Multiply, N_Op_Divide)
+                             and then Is_Fixed_Point_Type (Etype (L))
+                             and then Is_Integer_Type (Etype (R))
+                           then
+                              Error_Msg_N ("\convert right operand to "
+                                           & "`Integer`", N);
+
+                           elsif Nkind (N) = N_Op_Multiply
+                             and then Is_Fixed_Point_Type (Etype (R))
+                             and then Is_Integer_Type (Etype (L))
+                           then
+                              Error_Msg_N ("\convert left operand to "
+                                           & "`Integer`", N);
+                           end if;
+
                         --  For concatenation operators it is more difficult to
                         --  determine which is the wrong operand. It is worth
                         --  flagging explicitly an access type, for those who