diff options
author | Bob Duff <duff@adacore.com> | 2021-08-29 11:25:08 -0400 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-10-04 08:45:07 +0000 |
commit | c36774bcc38ba51fc9091d92a079e5b2d4aab759 (patch) | |
tree | ba9ec3c09b1aa05ba21648c5e9edf42bfd43f9a0 | |
parent | f9974930bcb21fb436217972db38d04ab88eb8c4 (diff) | |
download | gcc-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.adb | 21 | ||||
-rw-r--r-- | gcc/ada/einfo.ads | 4 | ||||
-rw-r--r-- | gcc/ada/gen_il-gen.adb | 2 |
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 |