aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPiotr Trojanek <trojanek@adacore.com>2021-03-22 15:38:34 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2021-06-18 04:36:53 -0400
commitf86c2f9c8e5d7d02cc6b79fc80a647a9a27e23f2 (patch)
tree9ec4741e9dbe9d1917cd7a0faca55b8906cf4b06 /gcc
parenta34ce7c5dff5281eb06e82d0b2fb8e3fe6a36ac7 (diff)
downloadgcc-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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/sem_aux.adb4
-rw-r--r--gcc/ada/sem_ch12.adb5
-rw-r--r--gcc/ada/sem_util.adb18
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