diff options
author | Piotr Trojanek <trojanek@adacore.com> | 2021-03-22 15:38:34 +0100 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-06-18 04:36:53 -0400 |
commit | f86c2f9c8e5d7d02cc6b79fc80a647a9a27e23f2 (patch) | |
tree | 9ec4741e9dbe9d1917cd7a0faca55b8906cf4b06 | |
parent | a34ce7c5dff5281eb06e82d0b2fb8e3fe6a36ac7 (diff) | |
download | gcc-f86c2f9c8e5d7d02cc6b79fc80a647a9a27e23f2.zip gcc-f86c2f9c8e5d7d02cc6b79fc80a647a9a27e23f2.tar.gz gcc-f86c2f9c8e5d7d02cc6b79fc80a647a9a27e23f2.tar.bz2 |
[Ada] Reuse Package_Specification in Is_Incomplete_Or_Private_Type
gcc/ada/
* sem_aux.adb (Package_Specification): Add assertions to confirm
the kind of the of parameter and returned node.
* sem_ch12.adb (Remove_Parent): Reorder conditions; this change
appears to be semantically neutral, but is enough to avoid the
problematic call to Package_Specification.
* sem_util.adb (Is_Incomplete_Or_Private_Type): Replace loop
with a call to Package_Specification.
-rw-r--r-- | gcc/ada/sem_aux.adb | 4 | ||||
-rw-r--r-- | gcc/ada/sem_ch12.adb | 5 | ||||
-rw-r--r-- | gcc/ada/sem_util.adb | 18 |
3 files changed, 13 insertions, 14 deletions
diff --git a/gcc/ada/sem_aux.adb b/gcc/ada/sem_aux.adb index 9f3ca2f..ea3b59c 100644 --- a/gcc/ada/sem_aux.adb +++ b/gcc/ada/sem_aux.adb @@ -1421,12 +1421,16 @@ package body Sem_Aux is N : Node_Id; begin + pragma Assert (Is_Package_Or_Generic_Package (E)); + N := Parent (E); if Nkind (N) = N_Defining_Program_Unit_Name then N := Parent (N); end if; + pragma Assert (Nkind (N) = N_Package_Specification); + return N; end Package_Specification; diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb index 06947e2..efdc449 100644 --- a/gcc/ada/sem_ch12.adb +++ b/gcc/ada/sem_ch12.adb @@ -15222,14 +15222,15 @@ package body Sem_Ch12 is -- subunit of a generic contains an instance of a child unit of -- its generic parent unit. - elsif S = Current_Scope and then Is_Generic_Instance (S) then + elsif S = Current_Scope and then Is_Generic_Instance (S) + and then (In_Package_Body (S) or else In_Private_Part (S)) + then declare Par : constant Entity_Id := Generic_Parent (Package_Specification (S)); begin if Present (Par) and then P = Scope (Par) - and then (In_Package_Body (S) or else In_Private_Part (S)) then Set_In_Private_Part (P); Install_Private_Declarations (P); diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index cfbbae0..eb2caa7 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -14751,17 +14751,11 @@ package body Sem_Util is -- Private or Taft amendment type case - declare - Pkg_Decl : Node_Id; - - begin - if Present (S) and then Is_Package_Or_Generic_Package (S) then - Pkg_Decl := S; - - while Nkind (Pkg_Decl) /= N_Package_Specification loop - Pkg_Decl := Parent (Pkg_Decl); - end loop; + if Present (S) and then Is_Package_Or_Generic_Package (S) then + declare + Pkg_Decl : constant Node_Id := Package_Specification (S); + begin -- It is knows that Typ has a private view, look for it in the -- visible declarations of the enclosing scope. A special case -- of this is when the two views have been exchanged - the full @@ -14785,8 +14779,8 @@ package body Sem_Util is elsif In_Package_Body (S) then return Inspect_Decls (Private_Declarations (Pkg_Decl), True); end if; - end if; - end; + end; + end if; -- The type has no incomplete or private view |