[Ada] ACATS C452005/C452006 memberships use wrong equality operation
authorArnaud Charlet <charlet@adacore.com>
Tue, 7 Apr 2020 15:05:59 +0000 (11:05 -0400)
committerPierre-Marie de Rodat <derodat@adacore.com>
Tue, 16 Jun 2020 13:07:15 +0000 (09:07 -0400)
2020-06-16  Arnaud Charlet  <charlet@adacore.com>

gcc/ada/

* sem_aux.ads, sem_aux.adb (Is_Record_Or_Limited_Type): New
function.
* exp_ch4.adb, sem_ch4.adb (Analyze_Membership_Op,
Expand_Set_Membership.Make_Cond): Choose between primitive and
predefined equality for membership tests.

gcc/ada/exp_ch4.adb
gcc/ada/sem_aux.adb
gcc/ada/sem_aux.ads
gcc/ada/sem_ch4.adb

index f5ad90a4111858d56893aa8e580752ec645471de..3d706bf9507f09bab2d9fb97a775bc85f978bfe1 100644 (file)
@@ -12717,10 +12717,13 @@ package body Exp_Ch4 is
                 Left_Opnd  => L,
                 Right_Opnd => R);
 
-            --  We reset the Entity since we do not want to bypass the operator
-            --  resolution.
+            if Is_Record_Or_Limited_Type (Etype (Alt)) then
 
-            Set_Entity (Cond, Empty);
+               --  We reset the Entity in order to use the primitive equality
+               --  of the type, as per RM 4.5.2 (28.1/4).
+
+               Set_Entity (Cond, Empty);
+            end if;
          end if;
 
          return Cond;
index 0cd538ae9d528fb61e0b55af66a493c1317310f7..dbff7d8e20cc2549acb044c07b6bc7bb710d29d0 100644 (file)
@@ -1330,6 +1330,15 @@ package body Sem_Aux is
                                N_Protected_Definition);
    end Is_Protected_Operation;
 
+   -------------------------------
+   -- Is_Record_Or_Limited_Type --
+   -------------------------------
+
+   function Is_Record_Or_Limited_Type (Typ : Entity_Id) return Boolean is
+   begin
+      return Is_Record_Type (Typ) or else Is_Limited_Type (Typ);
+   end Is_Record_Or_Limited_Type;
+
    ----------------------
    -- Nearest_Ancestor --
    ----------------------
index 41ce3f0aad42c9fd63f41af7e6ca0ec2f31e6143..c15c2712e2adfd1404eb20049d16a9b48975964b 100644 (file)
@@ -362,6 +362,9 @@ package Sem_Aux is
    --  Given a subprogram or entry, determines whether E is a protected entry
    --  or subprogram.
 
+   function Is_Record_Or_Limited_Type (Typ : Entity_Id) return Boolean;
+   --  Return True if Typ requires is a record or limited type.
+
    function Nearest_Ancestor (Typ : Entity_Id) return Entity_Id;
    --  Given a subtype Typ, this function finds out the nearest ancestor from
    --  which constraints and predicates are inherited. There is no simple link
index 445122fd91eb35c7d6deddd67d317b9af2d8ca3c..fe8aed59768727bf5fb790d168ac4a41965a6f7f 100644 (file)
@@ -3018,10 +3018,14 @@ package body Sem_Ch4 is
                Op := Make_Op_Ne (Loc, Left_Opnd  => L, Right_Opnd => R);
             end if;
 
-            --  We reset the Entity since we do not want to bypass the operator
-            --  resolution.
+            if Is_Record_Or_Limited_Type (Etype (L)) then
+
+               --  We reset the Entity in order to use the primitive equality
+               --  of the type, as per RM 4.5.2 (28.1/4).
+
+               Set_Entity (Op, Empty);
+            end if;
 
-            Set_Entity (Op, Empty);
             Rewrite (N, Op);
             Analyze (N);
             return;