aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/sem_ch12.adb
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2018-07-16 14:11:58 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-07-16 14:11:58 +0000
commitdbe5b438d26161111824727534ef99f4d41e39c4 (patch)
tree9c8336eb45a417629b3177ac10df66381924929c /gcc/ada/sem_ch12.adb
parentccc2a6139062395fb5747d0846a1ed6de25293c2 (diff)
downloadgcc-dbe5b438d26161111824727534ef99f4d41e39c4.zip
gcc-dbe5b438d26161111824727534ef99f4d41e39c4.tar.gz
gcc-dbe5b438d26161111824727534ef99f4d41e39c4.tar.bz2
[Ada] Fix Default_Storage_Pool aspect handling in generic instantiations
2018-07-16 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * sem_ch12.adb (Analyze_Package_Instantiation): Handle properly an instance that carries an aspect Default_Storage_Pool that overrides a default storage pool that applies to the generic unit. The aspect in the generic unit was removed before copying it in the instance, rather than removing it from the copy of the aspects that are appended to the aspects in the instance. From-SVN: r262724
Diffstat (limited to 'gcc/ada/sem_ch12.adb')
-rw-r--r--gcc/ada/sem_ch12.adb41
1 files changed, 24 insertions, 17 deletions
diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index 246d9eb..a7f9fbd 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -4217,34 +4217,41 @@ package body Sem_Ch12 is
else
declare
ASN1, ASN2 : Node_Id;
+ Inherited_Aspects : constant List_Id :=
+ New_Copy_List_Tree (Aspect_Specifications (Gen_Spec));
+ Pool_Present : Boolean := False;
begin
ASN1 := First (Aspect_Specifications (N));
while Present (ASN1) loop
if Chars (Identifier (ASN1)) = Name_Default_Storage_Pool
then
- -- If generic carries a default storage pool, remove
- -- it in favor of the instance one.
-
- ASN2 := First (Aspect_Specifications (Gen_Spec));
- while Present (ASN2) loop
- if Chars (Identifier (ASN2)) =
- Name_Default_Storage_Pool
- then
- Remove (ASN2);
- exit;
- end if;
-
- Next (ASN2);
- end loop;
+ Pool_Present := True;
+ exit;
end if;
Next (ASN1);
end loop;
- Prepend_List_To (Aspect_Specifications (N),
- (New_Copy_List_Tree
- (Aspect_Specifications (Gen_Spec))));
+ if Pool_Present then
+ -- If generic carries a default storage pool, remove
+ -- it in favor of the instance one.
+
+ ASN2 := First (Inherited_Aspects);
+ while Present (ASN2) loop
+ if Chars (Identifier (ASN2)) =
+ Name_Default_Storage_Pool
+ then
+ Remove (ASN2);
+ exit;
+ end if;
+
+ Next (ASN2);
+ end loop;
+ end if;
+
+ Prepend_List_To
+ (Aspect_Specifications (N), Inherited_Aspects);
end;
end if;
end if;