aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorJavier Miranda <miranda@adacore.com>2024-05-30 11:24:54 +0000
committerMarc Poulhiès <poulhies@adacore.com>2024-06-21 10:34:20 +0200
commitdf0637007e08eb11ead3ba4ac76de2b69a115327 (patch)
tree3d4caef59eb19260da4f65be638986b3ac59b0bb /gcc/ada
parent2b55cc520cf51089d961414a78e6e5371f3c3e20 (diff)
downloadgcc-df0637007e08eb11ead3ba4ac76de2b69a115327.zip
gcc-df0637007e08eb11ead3ba4ac76de2b69a115327.tar.gz
gcc-df0637007e08eb11ead3ba4ac76de2b69a115327.tar.bz2
ada: Cannot override inherited function with controlling result
When a package has the declaration of a derived tagged type T with private null extension that inherits a public function F with controlling result, and a derivation of T is declared in the public part of another package, overriding function F may be rejected by the compiler. gcc/ada/ * sem_disp.adb (Find_Hidden_Overridden_Primitive): Check public dispatching primitives of ancestors; previously, only immediately-visible primitives were checked.
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/sem_disp.adb6
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/ada/sem_disp.adb b/gcc/ada/sem_disp.adb
index 9c498ee..fe82229 100644
--- a/gcc/ada/sem_disp.adb
+++ b/gcc/ada/sem_disp.adb
@@ -89,7 +89,9 @@ package body Sem_Disp is
-- to the found entity; otherwise return Empty.
--
-- This routine does not search for non-hidden primitives since they are
- -- covered by the normal Ada 2005 rules.
+ -- covered by the normal Ada 2005 rules. Its name was motivated by an
+ -- intermediate version of AI05-0125 where this term was proposed to
+ -- name these entities in the RM.
function Is_Inherited_Public_Operation (Op : Entity_Id) return Boolean;
-- Check whether a primitive operation is inherited from an operation
@@ -2403,7 +2405,7 @@ package body Sem_Disp is
Orig_Prim := Original_Corresponding_Operation (Prim);
if Orig_Prim /= Prim
- and then Is_Immediately_Visible (Orig_Prim)
+ and then not Is_Hidden (Orig_Prim)
then
Vis_Ancestor := First_Elmt (Vis_List);
while Present (Vis_Ancestor) loop