From 1d0b1439ae4db4b52cb2bfd6b786d68bb8b5bb15 Mon Sep 17 00:00:00 2001 From: Yannick Moy Date: Mon, 1 Jul 2019 13:35:38 +0000 Subject: [PATCH] [Ada] Improve error message on mult/div between fixed-point and integer 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 gcc/ada/ * sem_ch4.adb (Operator_Check): Refine error message. From-SVN: r272866 --- gcc/ada/ChangeLog | 4 ++++ gcc/ada/sem_ch4.adb | 22 +++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 68a682818bf..cf6dc8a2e74 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,7 @@ +2019-07-01 Yannick Moy + + * sem_ch4.adb (Operator_Check): Refine error message. + 2019-07-01 Piotr Trojanek * libgnat/a-calend.ads: Revert "Global => null" contracts on diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb index 2c40011781d..03a156a3f77 100644 --- a/gcc/ada/sem_ch4.adb +++ b/gcc/ada/sem_ch4.adb @@ -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 -- 2.30.2