From 7c7c3694d58d8a54028292b68e62363ff4f2aded Mon Sep 17 00:00:00 2001 From: charlet Date: Mon, 5 Sep 2005 08:03:00 +0000 Subject: [PATCH] 2005-09-01 Javier Miranda Ed Schonberg * sem_disp.adb (Check_Controlling_Formals): Anonymous access types used in controlling parameters exclude null because it is necessary to read the tag to dispatch, and null has no tag. (Override_Dispatching_Operation): If the previous operation is inherited from an interface, it becomes hidden and does not participate in later name resolution. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@103885 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/sem_disp.adb | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/gcc/ada/sem_disp.adb b/gcc/ada/sem_disp.adb index 11b3da7f9b5..96836a75915 100644 --- a/gcc/ada/sem_disp.adb +++ b/gcc/ada/sem_disp.adb @@ -115,6 +115,15 @@ package body Sem_Disp is if Ctrl_Type = Typ then Set_Is_Controlling_Formal (Formal); + -- Ada 2005 (AI-231):Anonymous access types used in controlling + -- parameters exclude null because it is necessary to read the + -- tag to dispatch, and null has no tag. + + if Ekind (Etype (Formal)) = E_Anonymous_Access_Type then + Set_Can_Never_Be_Null (Etype (Formal)); + Set_Is_Known_Non_Null (Etype (Formal)); + end if; + -- Check that the parameter's nominal subtype statically -- matches the first subtype. @@ -784,14 +793,7 @@ package body Sem_Disp is then Old_Spec := Corresponding_Spec (Old_Bod); Set_Has_Completion (Old_Spec, False); - - if Exception_Mechanism = Front_End_ZCX_Exceptions then - Set_Has_Subprogram_Descriptor (Old_Spec, False); - Set_Handler_Records (Old_Spec, No_List); - Set_Is_Eliminated (Old_Spec); - end if; end if; - end if; end loop; @@ -1212,10 +1214,12 @@ package body Sem_Disp is return; end if; - -- Ada 2005 (AI-251): Do not replace subprograms corresponding to + -- Ada 2005 (AI-251): Do not replace subprograms inherited from -- abstract interfaces. They will be used later to generate the -- corresponding thunks to initialize the Vtable (see subprogram - -- Freeze_Subprogram) + -- Freeze_Subprogram). The inherited operation itself must also + -- become hidden, to avoid spurious ambiguities; name resolution + -- must pick up only the operation that implements it, if Is_Interface_Subprogram (Prev_Op) then Set_DT_Position (Prev_Op, DT_Position (Alias (Prev_Op))); @@ -1224,6 +1228,7 @@ package body Sem_Disp is Set_Abstract_Interface_Alias (Prev_Op, Alias (Prev_Op)); Set_Alias (Prev_Op, New_Op); Set_Is_Internal (Prev_Op); + Set_Is_Hidden (Prev_Op); -- Override predefined primitive operations -- 2.11.0