aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Duff <duff@adacore.com>2021-08-29 11:25:08 -0400
committerPierre-Marie de Rodat <derodat@adacore.com>2021-10-04 08:45:07 +0000
commitc36774bcc38ba51fc9091d92a079e5b2d4aab759 (patch)
treeba9ec3c09b1aa05ba21648c5e9edf42bfd43f9a0
parentf9974930bcb21fb436217972db38d04ab88eb8c4 (diff)
downloadgcc-c36774bcc38ba51fc9091d92a079e5b2d4aab759.zip
gcc-c36774bcc38ba51fc9091d92a079e5b2d4aab759.tar.gz
gcc-c36774bcc38ba51fc9091d92a079e5b2d4aab759.tar.bz2
[Ada] Declaration_Node for Itypes returns Empty or declaration
gcc/ada/ * einfo.ads (Declaration_Node): Document that Declaration_Node for Itypes. * einfo-utils.adb (Declaration_Node): Make it return Empty for Itypes, or a proper type or subtype declaration. * gen_il-gen.adb: Minor comment improvement.
-rw-r--r--gcc/ada/einfo-utils.adb21
-rw-r--r--gcc/ada/einfo.ads4
-rw-r--r--gcc/ada/gen_il-gen.adb2
3 files changed, 18 insertions, 9 deletions
diff --git a/gcc/ada/einfo-utils.adb b/gcc/ada/einfo-utils.adb
index 38cfe34..0274e6b 100644
--- a/gcc/ada/einfo-utils.adb
+++ b/gcc/ada/einfo-utils.adb
@@ -655,16 +655,21 @@ package body Einfo.Utils is
P := Parent (Id);
end if;
+ while Nkind (P) in N_Selected_Component | N_Expanded_Name
+ or else (Nkind (P) = N_Defining_Program_Unit_Name
+ and then Is_Child_Unit (Id))
loop
- if Nkind (P) in N_Selected_Component | N_Expanded_Name
- or else (Nkind (P) = N_Defining_Program_Unit_Name
- and then Is_Child_Unit (Id))
- then
- P := Parent (P);
- else
- return P;
- end if;
+ P := Parent (P);
end loop;
+
+ if Is_Itype (Id)
+ and then Nkind (P) not in
+ N_Full_Type_Declaration | N_Subtype_Declaration
+ then
+ P := Empty;
+ end if;
+
+ return P;
end Declaration_Node;
---------------------
diff --git a/gcc/ada/einfo.ads b/gcc/ada/einfo.ads
index f890fe5..2030841 100644
--- a/gcc/ada/einfo.ads
+++ b/gcc/ada/einfo.ads
@@ -829,7 +829,9 @@ package Einfo is
-- a private type, then we obtain the declaration node denoted by the
-- full type, i.e. the full type declaration node. Also note that for
-- subprograms, this returns the {function,procedure}_specification, not
--- the subprogram_declaration.
+-- the subprogram_declaration. If the parent of an Itype is a type or
+-- subtype declaration, we return the declaration node as for any other
+-- type. For other Itypes, we return Empty.
-- Default_Aspect_Component_Value [base type only]
-- Defined in array types. Holds the static value specified in a
diff --git a/gcc/ada/gen_il-gen.adb b/gcc/ada/gen_il-gen.adb
index 305a99a..9983e10 100644
--- a/gcc/ada/gen_il-gen.adb
+++ b/gcc/ada/gen_il-gen.adb
@@ -710,6 +710,8 @@ package body Gen_IL.Gen is
Type_Table (T).Last := T;
Add_Concrete_Descendant_To_Ancestors
(Type_Table (T).Parent, T);
+ -- Parent cannot be No_Type here, because T is a concrete
+ -- type, and therefore not a root type.
when Abstract_Type =>
declare