diff options
author | Arnaud Charlet <charlet@adacore.com> | 2020-01-31 15:53:42 -0500 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2020-06-05 08:17:42 -0400 |
commit | a9969d7feb35306ba82bc5d605d9c8c48f1c8271 (patch) | |
tree | 10412f3b16585fca325cd4a74d23895be05ea835 /gcc | |
parent | 632d4a43d7ab74554898509d7a99edccf09819cc (diff) | |
download | gcc-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.adb | 46 |
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 |