aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@adacore.com>2020-01-31 15:53:42 -0500
committerPierre-Marie de Rodat <derodat@adacore.com>2020-06-05 08:17:42 -0400
commita9969d7feb35306ba82bc5d605d9c8c48f1c8271 (patch)
tree10412f3b16585fca325cd4a74d23895be05ea835 /gcc
parent632d4a43d7ab74554898509d7a99edccf09819cc (diff)
downloadgcc-a9969d7feb35306ba82bc5d605d9c8c48f1c8271.zip
gcc-a9969d7feb35306ba82bc5d605d9c8c48f1c8271.tar.gz
gcc-a9969d7feb35306ba82bc5d605d9c8c48f1c8271.tar.bz2
[Ada] AI12-0207 Convention of anonymous access types
2020-06-05 Arnaud Charlet <charlet@adacore.com> gcc/ada/ * sem_prag.adb (Set_Convention_From_Pragma): Set the convention of anonymous access array components.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/sem_prag.adb46
1 files changed, 29 insertions, 17 deletions
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index 419538d..0848e1e 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -8020,26 +8020,38 @@ package body Sem_Prag is
-- For the case of a record base type, also set the convention of
-- any anonymous access types declared in the record which do not
-- currently have a specified convention.
+ -- Similarly for an array base type and anonymous access types
+ -- components.
- if Is_Record_Type (E) and then Is_Base_Type (E) then
- declare
- Comp : Node_Id;
+ if Is_Base_Type (E) then
+ if Is_Record_Type (E) then
+ declare
+ Comp : Node_Id;
- begin
- Comp := First_Component (E);
- while Present (Comp) loop
- if Present (Etype (Comp))
- and then Ekind_In (Etype (Comp),
- E_Anonymous_Access_Type,
- E_Anonymous_Access_Subprogram_Type)
- and then not Has_Convention_Pragma (Comp)
- then
- Set_Convention (Comp, C);
- end if;
+ begin
+ Comp := First_Component (E);
+ while Present (Comp) loop
+ if Present (Etype (Comp))
+ and then
+ Ekind_In (Etype (Comp),
+ E_Anonymous_Access_Type,
+ E_Anonymous_Access_Subprogram_Type)
+ and then not Has_Convention_Pragma (Comp)
+ then
+ Set_Convention (Comp, C);
+ end if;
- Next_Component (Comp);
- end loop;
- end;
+ Next_Component (Comp);
+ end loop;
+ end;
+
+ elsif Is_Array_Type (E)
+ and then Ekind_In (Component_Type (E),
+ E_Anonymous_Access_Type,
+ E_Anonymous_Access_Subprogram_Type)
+ then
+ Set_Convention (Designated_Type (Component_Type (E)), C);
+ end if;
end if;
-- Deal with incomplete/private type case, where underlying type