From: Bob Duff <[email protected]>

In many cases, we warn if an abstract equality function
is called implicitly. In the case of record equality,
this patch adds a mention of the particular component_declaration
for which an abstract "=" is invoked; otherwise it is hard to
understand the warning for record types with many components.

gcc/ada/ChangeLog:

        * exp_ch4.adb (Warn_On_Abstract_Equality_For_Component):
        Add additional information in the record-component case.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/exp_ch4.adb | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index 5971db3952a..94944fcb032 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -8190,9 +8190,11 @@ package body Exp_Ch4 is
       --  Unchecked_Union subtype. Typ is a record type.
 
       procedure Warn_On_Abstract_Equality_For_Component
-        (Comp_Type : Entity_Id);
+        (Comp_Type : Entity_Id; Comp : Entity_Id);
       --  If Comp_Type is a record type with a user-defined abstract primitive
       --  equality, then issue a warning that Program_Error will be raised.
+      --  Comp is Empty in the array case. In the record case, it is the
+      --  component declaration, and is used in the message.
 
       -------------------------
       -- Build_Equality_Call --
@@ -8423,7 +8425,7 @@ package body Exp_Ch4 is
       ---------------------------------------------
 
       procedure Warn_On_Abstract_Equality_For_Component
-        (Comp_Type : Entity_Id)
+        (Comp_Type : Entity_Id; Comp : Entity_Id)
       is
          Eq : Entity_Id;
       begin
@@ -8435,6 +8437,12 @@ package body Exp_Ch4 is
                Error_Msg_NE ("call to abstract equality function of "
                              & "component type &<<", N, Comp_Type);
                Error_Msg_N ("\Program_Error [<<", N);
+
+               if Present (Comp) then
+                  Error_Msg_Sloc := Sloc (Comp);
+                  Error_Msg_NE
+                    ("\abstract ""="" called for component & #<<", N, Comp);
+               end if;
             end if;
          end if;
       end Warn_On_Abstract_Equality_For_Component;
@@ -8514,7 +8522,8 @@ package body Exp_Ch4 is
          --  predefined equality.
 
          if not Present (Get_User_Defined_Equality (Typl)) then
-            Warn_On_Abstract_Equality_For_Component (Component_Type (Typl));
+            Warn_On_Abstract_Equality_For_Component
+              (Component_Type (Typl), Comp => Empty);
          end if;
 
          --  If we are doing full validity checking, and it is possible for the
@@ -8608,7 +8617,8 @@ package body Exp_Ch4 is
             begin
                while Present (Comp) loop
                   if Chars (Comp) /= Name_uParent then
-                     Warn_On_Abstract_Equality_For_Component (Etype (Comp));
+                     Warn_On_Abstract_Equality_For_Component
+                       (Etype (Comp), Comp);
                   end if;
 
                   Next_Component (Comp);
-- 
2.51.0

Reply via email to