[Ada] ACATS 4.1J - B854003 - Subtype conformance check missed
authorArnaud Charlet <charlet@adacore.com>
Thu, 23 Apr 2020 18:46:27 +0000 (14:46 -0400)
committerPierre-Marie de Rodat <derodat@adacore.com>
Thu, 18 Jun 2020 09:08:36 +0000 (05:08 -0400)
2020-06-18  Arnaud Charlet  <charlet@adacore.com>

gcc/ada/

* sem_ch6.ads, sem_ch6.adb (Check_Formal_Conformance): New
subprogram.
(Check_Conformance): Move code to Check_Formal_Conformance.
* sem_ch8.adb (Analyze_Subprogram_Renaming): Check for formal
conformance when needed.

gcc/ada/sem_ch6.adb
gcc/ada/sem_ch6.ads
gcc/ada/sem_ch8.adb

index fa9bb5db5cf8d4548fd10ce9d37c4c79cf5520e6..96099e77b430ead047140284c824decc6c5062c4 100644 (file)
@@ -5734,16 +5734,8 @@ package body Sem_Ch6 is
             end if;
 
             return;
-
-         elsif Is_Formal_Subprogram (Old_Id)
-           or else Is_Formal_Subprogram (New_Id)
-           or else (Is_Subprogram (New_Id)
-                     and then Present (Alias (New_Id))
-                     and then Is_Formal_Subprogram (Alias (New_Id)))
-         then
-            Conformance_Error
-              ("\formal subprograms are not subtype conformant "
-               & "(RM 6.3.1 (17/3))");
+         else
+            Check_Formal_Subprogram_Conformance (New_Id, Old_Id, Err_Loc);
          end if;
       end if;
 
@@ -6516,6 +6508,37 @@ package body Sem_Ch6 is
       end if;
    end Check_Discriminant_Conformance;
 
+   -----------------------------------------
+   -- Check_Formal_Subprogram_Conformance --
+   -----------------------------------------
+
+   procedure Check_Formal_Subprogram_Conformance
+     (New_Id  : Entity_Id;
+      Old_Id  : Entity_Id;
+      Err_Loc : Node_Id := Empty)
+   is
+      N : Node_Id;
+   begin
+      if Is_Formal_Subprogram (Old_Id)
+        or else Is_Formal_Subprogram (New_Id)
+        or else (Is_Subprogram (New_Id)
+                  and then Present (Alias (New_Id))
+                  and then Is_Formal_Subprogram (Alias (New_Id)))
+      then
+         if Present (Err_Loc) then
+            N := Err_Loc;
+         else
+            N := New_Id;
+         end if;
+
+         Error_Msg_Sloc := Sloc (Old_Id);
+         Error_Msg_N ("not subtype conformant with declaration#!", N);
+         Error_Msg_NE
+           ("\formal subprograms are not subtype conformant "
+            & "(RM 6.3.1 (17/3))", N, New_Id);
+      end if;
+   end Check_Formal_Subprogram_Conformance;
+
    ----------------------------
    -- Check_Fully_Conformant --
    ----------------------------
index 653bfcae61eecab9046a9ccab32b3c51f4a8b428..81b4821d5760e5662e397628583e49cd60a79759 100644 (file)
@@ -69,6 +69,16 @@ package Sem_Ch6 is
    --  the source location of the partial view, which may be different than
    --  Prev in the case of private types.
 
+   procedure Check_Formal_Subprogram_Conformance
+     (New_Id  : Entity_Id;
+      Old_Id  : Entity_Id;
+      Err_Loc : Node_Id := Empty);
+   --  Check RM 6.3.1(17/3): the profile of a generic formal subprogram is not
+   --  subtype conformant with any other profile and post an error message if
+   --  either New_Id or Old_Id denotes a formal subprogram, with the flag being
+   --  placed on the Err_Loc node if it is specified, and on New_Id if not. See
+   --  also spec of Check_Fully_Conformant below for New_Id and Old_Id usage.
+
    procedure Check_Fully_Conformant
      (New_Id  : Entity_Id;
       Old_Id  : Entity_Id;
index acb5b2167331b5dd0f182928b12a2453762c132b..4e85a1508d7360fa7ba3b40d524e0a4107615197 100644 (file)
@@ -3171,7 +3171,7 @@ package body Sem_Ch8 is
 
       Set_Kill_Elaboration_Checks (New_S, True);
 
-      --  If we had a previous error, indicate a completely is present to stop
+      --  If we had a previous error, indicate a completion is present to stop
       --  junk cascaded messages, but don't take any further action.
 
       if Etype (Nam) = Any_Type then
@@ -3409,6 +3409,8 @@ package body Sem_Ch8 is
 
                if Original_Subprogram (Old_S) = Rename_Spec then
                   Error_Msg_N ("unfrozen subprogram cannot rename itself ", N);
+               else
+                  Check_Formal_Subprogram_Conformance (New_S, Old_S, Spec);
                end if;
             else
                Check_Subtype_Conformant (New_S, Old_S, Spec);