[Ada] Wrong error on hidden must-override primitive
authorBob Duff <duff@adacore.com>
Wed, 18 Dec 2019 07:14:13 +0000 (07:14 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 18 Dec 2019 07:14:13 +0000 (07:14 +0000)
2019-12-18  Bob Duff  <duff@adacore.com>

gcc/ada/

* sem_ch3.adb (Derive_Subprogram): Do not set the
Requires_Overriding flag in the above-mentioned case.

From-SVN: r279505

gcc/ada/ChangeLog
gcc/ada/sem_ch3.adb

index 36e5d00b2e83f1caced41a1336fc5b4d67f3befa..6f6caf45642f50d230923ee7402ccfa92f756dbe 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-18  Bob Duff  <duff@adacore.com>
+
+       * sem_ch3.adb (Derive_Subprogram): Do not set the
+       Requires_Overriding flag in the above-mentioned case.
+
 2019-12-18  Bob Duff  <duff@adacore.com>
 
        * sem_ch8.adb (Note_Redundant_Use): It was already checking for
index ca2247671e11870e40264bfaa7f63ac8cb85404f..956c92ddfe206584127b2df3ce902b9e3b1f4167 100644 (file)
@@ -15606,7 +15606,8 @@ package body Sem_Ch3 is
          Set_Derived_Name;
 
       --  Otherwise, the type is inheriting a private operation, so enter it
-      --  with a special name so it can't be overridden.
+      --  with a special name so it can't be overridden. See also below, where
+      --  we check for this case, and if so avoid setting Requires_Overriding.
 
       else
          Set_Chars (New_Subp, New_External_Name (Chars (Parent_Subp), 'P'));
@@ -15786,7 +15787,15 @@ package body Sem_Ch3 is
            or else Is_Abstract_Subprogram (Alias (New_Subp))
          then
             Set_Is_Abstract_Subprogram (New_Subp);
-         else
+
+         --  If the Chars of the new subprogram is different from that of the
+         --  parent's one, it means that we entered it with a special name so
+         --  it can't be overridden (see above). In that case we had better not
+         --  *require* it to be overridden. This is the case where the parent
+         --  type inherited the operation privately, so there's no danger of
+         --  dangling dispatching.
+
+         elsif Chars (New_Subp) = Chars (Alias (New_Subp)) then
             Set_Requires_Overriding (New_Subp);
          end if;