summaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2013-09-10 14:48:04 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2013-09-10 14:48:04 +0000
commitdf8b0dae5be5f5c304959789ad3b0c66068bcaeb (patch)
treef44b642b02a3180daac40203e5e2292b62b92bdd /gcc/ada
parent2944c2184762865c7f9eb77c989954b24d658665 (diff)
downloadgcc-df8b0dae5be5f5c304959789ad3b0c66068bcaeb.tar.gz
2013-09-10 Ed Schonberg <schonberg@adacore.com>
* sem_ch12.adb (Analyze_Package_Instantiation): If the instantiation is a compilation unit, analyze aspects before analyzing the package declaration for the instance. * sem_ch13.adb (Analyze_Aspect_Specifications): If the corresponding node is a package instantiation, insert generated pragmas at the head of visible declarations. * sem_prag.adb (Analyze_Pragma, case Preelaborate): In an instance do not ignore the pragma if it comes from an aspect specification in the instance, and not from the generic unit. * sprint.adb (Sprint_Node_Actual): For a package declaration that is an instantiation, print aspects after declaration. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@202453 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog14
-rw-r--r--gcc/ada/sem_ch12.adb12
-rw-r--r--gcc/ada/sem_ch13.adb15
-rw-r--r--gcc/ada/sem_prag.adb24
-rw-r--r--gcc/ada/sprint.adb31
5 files changed, 83 insertions, 13 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 45ee02230dd..86ca911efe9 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,17 @@
+2013-09-10 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch12.adb (Analyze_Package_Instantiation): If the
+ instantiation is a compilation unit, analyze aspects before
+ analyzing the package declaration for the instance.
+ * sem_ch13.adb (Analyze_Aspect_Specifications): If the
+ corresponding node is a package instantiation, insert generated
+ pragmas at the head of visible declarations.
+ * sem_prag.adb (Analyze_Pragma, case Preelaborate): In an instance
+ do not ignore the pragma if it comes from an aspect specification
+ in the instance, and not from the generic unit.
+ * sprint.adb (Sprint_Node_Actual): For a package declaration that
+ is an instantiation, print aspects after declaration.
+
2013-09-10 Robert Dewar <dewar@adacore.com>
* einfo.adb, sem_prag.adb, rtsfind.ads: Minor reformatting.
diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index b93d3858335..cd638756c91 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -3912,6 +3912,7 @@ package body Sem_Ch12 is
if Nkind (Parent (N)) /= N_Compilation_Unit then
Mark_Rewrite_Insertion (Act_Decl);
Insert_Before (N, Act_Decl);
+
Analyze (Act_Decl);
-- For an instantiation that is a compilation unit, place
@@ -3940,6 +3941,15 @@ package body Sem_Ch12 is
Set_Unit (Parent (N), Act_Decl);
Set_Parent_Spec (Act_Decl, Parent_Spec (N));
Set_Package_Instantiation (Act_Decl_Id, N);
+
+ -- Process aspect specifications of the instance node, if any, to
+ -- take into account categorization pragmas before analyzing the
+ -- instance.
+
+ if Has_Aspects (N) then
+ Analyze_Aspect_Specifications (N, Act_Decl_Id);
+ end if;
+
Analyze (Act_Decl);
Set_Unit (Parent (N), N);
Set_Body_Required (Parent (N), False);
@@ -4043,7 +4053,7 @@ package body Sem_Ch12 is
end if;
<<Leave>>
- if Has_Aspects (N) then
+ if Has_Aspects (N) and then Nkind (Parent (N)) /= N_Compilation_Unit then
Analyze_Aspect_Specifications (N, Act_Decl_Id);
end if;
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 37fd72253d6..5f3eb84ecaa 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -2112,7 +2112,8 @@ package body Sem_Ch13 is
-- node (no delay is required here) except for aspects on a
-- subprogram body (see below) and a generic package, for which
-- we need to introduce the pragma before building the generic
- -- copy (see sem_ch12).
+ -- copy (see sem_ch12), and for package instantiations, where
+ -- the library unit pragmas are better handled early.
elsif Nkind (Parent (N)) = N_Compilation_Unit
and then (Present (Aitem) or else Is_Boolean_Aspect (Aspect))
@@ -2161,6 +2162,18 @@ package body Sem_Ch13 is
Prepend (Aitem,
Visible_Declarations (Specification (N)));
+ elsif Nkind (N) = N_Package_Instantiation then
+ declare
+ Spec : constant Node_Id :=
+ Specification (Instance_Spec (N));
+ begin
+ if No (Visible_Declarations (Spec)) then
+ Set_Visible_Declarations (Spec, New_List);
+ end if;
+
+ Prepend (Aitem, Visible_Declarations (Spec));
+ end;
+
else
if No (Pragmas_After (Aux)) then
Set_Pragmas_After (Aux, New_List);
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index e17b6e80bcb..fd5b9a2da6d 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -15144,16 +15144,22 @@ package body Sem_Prag is
Ent := Find_Lib_Unit_Name;
Check_Duplicate_Pragma (Ent);
- -- This filters out pragmas inside generic parent then
- -- show up inside instantiation
+ -- This filters out pragmas inside generic parents that show up
+ -- inside instantiations. Pragmas that come from aspects in the
+ -- unit are not ignored.
- if Present (Ent)
- and then not (Pk = N_Package_Specification
- and then Present (Generic_Parent (Pa)))
- then
- if not Debug_Flag_U then
- Set_Is_Preelaborated (Ent);
- Set_Suppress_Elaboration_Warnings (Ent);
+ if Present (Ent) then
+ if Pk = N_Package_Specification
+ and then Present (Generic_Parent (Pa))
+ and then not From_Aspect_Specification (N)
+ then
+ null;
+
+ else
+ if not Debug_Flag_U then
+ Set_Is_Preelaborated (Ent);
+ Set_Suppress_Elaboration_Warnings (Ent);
+ end if;
end if;
end if;
end Preelaborate;
diff --git a/gcc/ada/sprint.adb b/gcc/ada/sprint.adb
index 8526716e08e..82d6ce59cca 100644
--- a/gcc/ada/sprint.adb
+++ b/gcc/ada/sprint.adb
@@ -2479,6 +2479,18 @@ package body Sprint is
Sprint_Node_Sloc (Specification (Node));
Write_Char (';');
+ -- If this is an instantiation, get the aspects from the original
+ -- instantiation node.
+
+ if Is_Generic_Instance (Defining_Entity (Node))
+ and then Has_Aspects (
+ Package_Instantiation (Defining_Entity (Node)))
+ then
+ Sprint_Aspect_Specifications
+ (Package_Instantiation (Defining_Entity (Node)),
+ Semicolon => True);
+ end if;
+
when N_Package_Instantiation =>
Extra_Blank_Line;
Write_Indent_Str_Sloc ("package ");
@@ -2499,12 +2511,27 @@ package body Sprint is
Write_Str_With_Col_Check_Sloc ("package ");
Sprint_Node (Defining_Unit_Name (Node));
- if Nkind_In (Parent (Node), N_Package_Declaration,
- N_Generic_Package_Declaration)
+ if Nkind (Parent (Node)) = N_Generic_Package_Declaration
and then Has_Aspects (Parent (Node))
then
Sprint_Aspect_Specifications
(Parent (Node), Semicolon => False);
+
+ -- An instantiation is rewritten as a package declaration, but
+ -- the aspects belong to the instantiation node.
+
+ elsif Nkind (Parent (Node)) = N_Package_Declaration then
+ declare
+ Pack : constant Entity_Id := Defining_Entity (Node);
+
+ begin
+ if not Is_Generic_Instance (Pack) then
+ if Has_Aspects (Parent (Node)) then
+ Sprint_Aspect_Specifications
+ (Parent (Node), Semicolon => False);
+ end if;
+ end if;
+ end;
end if;
Write_Str (" is");