summaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2012-06-14 12:49:59 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2012-06-14 12:49:59 +0200
commit2a290fec3d61859b69f865d1769f4e11ac1c3dc8 (patch)
treefaeb8bf3d0b97c831e30b175c8171f08f0d0f8a7 /gcc/ada
parent758ad97333838b7e5e839100a927b6cadbd030d3 (diff)
downloadgcc-2a290fec3d61859b69f865d1769f4e11ac1c3dc8.tar.gz
[multiple changes]
2012-06-14 Robert Dewar <dewar@adacore.com> * exp_ch7.adb, exp_util.adb, sem_aux.ads, exp_ch9.adb, sem_ch10.adb, freeze.adb, sem_util.adb, exp_ch4.adb, s-taprop-dummy.adb: Minor reformatting. 2012-06-14 Vincent Pucci <pucci@adacore.com> * exp_attr.adb (Expand_N_Attribute_Reference): Lock_Free attribute case added. * par-prag.adb (Prag): Lock_Free pragma case added. * sem_attr.adb (Analyze_Attribute_Reference): Lock_Free attribute case added. * sem_ch13.adb (Analyze_Aspect_Specifications): Record_Rep_Item call added for Aspect_Lock_Free. * sem_ch9.adb (Allows_Lock_Free_Implementation): New Lock_Free error messages for subprogram bodies. (Lock_Free_Disabled): New routine. (Analyze_Protected_Body): Call to Lock_Free_Disabled added. * sem_prag.adb (Analyze_Pragma): Lock_Free pragma case added. * snames.adb-tmpl (Get_Pragma_Id): Name_Lock_Free case added. (Is_Pragma_Name): Name_Lock_Free case added. * snames.ads-tmpl: Attribute_Lock_Free and Pragma_Lock_Free added. 2012-06-14 Ed Schonberg <schonberg@adacore.com> * a-coorma.adb, a-cborma.adb, a-cbhama.adb, a-ciorma.adb: Add missing aliased keyword. 2012-06-14 Bob Duff <duff@adacore.com> * lib.ads, lib.adb, sem.adb (Write_Unit_Info): Move this procedure from Sem body to Lib spec, so it can be used for debugging elsewhere. 2012-06-14 Ed Schonberg <schonberg@adacore.com> * sem_ch6.adb (Check_Conformance): Add Ada 2012 check on mode conformance: "aliased" must apply to both or neither formal parameters. From-SVN: r188609
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog41
-rw-r--r--gcc/ada/a-cbhama.adb4
-rw-r--r--gcc/ada/a-cborma.adb4
-rw-r--r--gcc/ada/a-ciorma.adb2
-rw-r--r--gcc/ada/a-coorma.adb2
-rw-r--r--gcc/ada/exp_attr.adb23
-rw-r--r--gcc/ada/exp_ch4.adb6
-rw-r--r--gcc/ada/exp_ch7.adb16
-rw-r--r--gcc/ada/exp_ch9.adb2
-rw-r--r--gcc/ada/exp_util.adb2
-rw-r--r--gcc/ada/freeze.adb5
-rw-r--r--gcc/ada/lib.adb81
-rw-r--r--gcc/ada/lib.ads11
-rw-r--r--gcc/ada/par-prag.adb1
-rw-r--r--gcc/ada/s-taprop-dummy.adb17
-rw-r--r--gcc/ada/sem.adb87
-rw-r--r--gcc/ada/sem_attr.adb22
-rw-r--r--gcc/ada/sem_aux.ads22
-rw-r--r--gcc/ada/sem_ch10.adb1
-rw-r--r--gcc/ada/sem_ch13.adb2
-rw-r--r--gcc/ada/sem_ch6.adb12
-rw-r--r--gcc/ada/sem_ch9.adb137
-rw-r--r--gcc/ada/sem_prag.adb49
-rw-r--r--gcc/ada/sem_util.adb7
-rw-r--r--gcc/ada/snames.adb-tmpl3
-rw-r--r--gcc/ada/snames.ads-tmpl19
26 files changed, 408 insertions, 170 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 3efe1d536d2..816d90158bf 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,44 @@
+2012-06-14 Robert Dewar <dewar@adacore.com>
+
+ * exp_ch7.adb, exp_util.adb, sem_aux.ads, exp_ch9.adb,
+ sem_ch10.adb, freeze.adb, sem_util.adb, exp_ch4.adb,
+ s-taprop-dummy.adb: Minor reformatting.
+
+2012-06-14 Vincent Pucci <pucci@adacore.com>
+
+ * exp_attr.adb (Expand_N_Attribute_Reference): Lock_Free
+ attribute case added.
+ * par-prag.adb (Prag): Lock_Free pragma case added.
+ * sem_attr.adb (Analyze_Attribute_Reference): Lock_Free attribute
+ case added.
+ * sem_ch13.adb (Analyze_Aspect_Specifications): Record_Rep_Item
+ call added for Aspect_Lock_Free.
+ * sem_ch9.adb (Allows_Lock_Free_Implementation): New Lock_Free
+ error messages for subprogram bodies.
+ (Lock_Free_Disabled): New routine.
+ (Analyze_Protected_Body): Call to Lock_Free_Disabled added.
+ * sem_prag.adb (Analyze_Pragma): Lock_Free pragma case added.
+ * snames.adb-tmpl (Get_Pragma_Id): Name_Lock_Free case added.
+ (Is_Pragma_Name): Name_Lock_Free case added.
+ * snames.ads-tmpl: Attribute_Lock_Free and Pragma_Lock_Free added.
+
+2012-06-14 Ed Schonberg <schonberg@adacore.com>
+
+ * a-coorma.adb, a-cborma.adb, a-cbhama.adb, a-ciorma.adb: Add missing
+ aliased keyword.
+
+2012-06-14 Bob Duff <duff@adacore.com>
+
+ * lib.ads, lib.adb, sem.adb (Write_Unit_Info): Move this
+ procedure from Sem body to Lib spec, so it can be used for
+ debugging elsewhere.
+
+2012-06-14 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch6.adb (Check_Conformance): Add Ada 2012 check on mode
+ conformance: "aliased" must apply to both or neither formal
+ parameters.
+
2012-06-14 Gary Dismukes <dismukes@adacore.com>
* exp_ch9.adb: Minor reformatting.
diff --git a/gcc/ada/a-cbhama.adb b/gcc/ada/a-cbhama.adb
index b14383e321c..8eeaca2e22f 100644
--- a/gcc/ada/a-cbhama.adb
+++ b/gcc/ada/a-cbhama.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2004-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 2004-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -220,7 +220,7 @@ package body Ada.Containers.Bounded_Hashed_Maps is
end Constant_Reference;
function Constant_Reference
- (Container : Map;
+ (Container : aliased Map;
Key : Key_Type) return Constant_Reference_Type
is
Node : constant Count_Type := Key_Ops.Find (Container, Key);
diff --git a/gcc/ada/a-cborma.adb b/gcc/ada/a-cborma.adb
index 9dec108219b..a782d39af71 100644
--- a/gcc/ada/a-cborma.adb
+++ b/gcc/ada/a-cborma.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2004-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 2004-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -432,7 +432,7 @@ package body Ada.Containers.Bounded_Ordered_Maps is
end Constant_Reference;
function Constant_Reference
- (Container : Map;
+ (Container : aliased Map;
Key : Key_Type) return Constant_Reference_Type
is
Node : constant Count_Type := Key_Ops.Find (Container, Key);
diff --git a/gcc/ada/a-ciorma.adb b/gcc/ada/a-ciorma.adb
index b62b87b3a39..e955dec8915 100644
--- a/gcc/ada/a-ciorma.adb
+++ b/gcc/ada/a-ciorma.adb
@@ -410,7 +410,7 @@ package body Ada.Containers.Indefinite_Ordered_Maps is
end Constant_Reference;
function Constant_Reference
- (Container : Map;
+ (Container : aliased Map;
Key : Key_Type) return Constant_Reference_Type
is
Node : constant Node_Access := Key_Ops.Find (Container.Tree, Key);
diff --git a/gcc/ada/a-coorma.adb b/gcc/ada/a-coorma.adb
index 0e72d69e315..5aef3636fb0 100644
--- a/gcc/ada/a-coorma.adb
+++ b/gcc/ada/a-coorma.adb
@@ -370,7 +370,7 @@ package body Ada.Containers.Ordered_Maps is
end Constant_Reference;
function Constant_Reference
- (Container : Map;
+ (Container : aliased Map;
Key : Key_Type) return Constant_Reference_Type
is
Node : constant Node_Access := Key_Ops.Find (Container.Tree, Key);
diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb
index d63d4dee1ea..54ce3ee0baa 100644
--- a/gcc/ada/exp_attr.adb
+++ b/gcc/ada/exp_attr.adb
@@ -3065,6 +3065,29 @@ package body Exp_Attr is
end if;
end;
+ ---------------
+ -- Lock_Free --
+ ---------------
+
+ -- Rewrite the attribute reference with the value of Uses_Lock_Free
+
+ when Attribute_Lock_Free => Lock_Free : declare
+ Val : Entity_Id;
+
+ begin
+ if Uses_Lock_Free (Ptyp) then
+ Val := Standard_True;
+
+ else
+ Val := Standard_False;
+ end if;
+
+ Rewrite (N,
+ New_Occurrence_Of (Val, Loc));
+
+ Analyze_And_Resolve (N, Standard_Boolean);
+ end Lock_Free;
+
-------------
-- Machine --
-------------
diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index fefd6389897..5ed4e8afaca 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -4277,8 +4277,7 @@ package body Exp_Ch4 is
-- is a finalization flag created to service expression Expr.
function Is_Controlled_Function_Call (Expr : Node_Id) return Boolean;
- -- Determine whether an expression is a rewritten controlled function
- -- call.
+ -- Determine if expression Expr is a rewritten controlled function call
------------------------
-- Create_Alternative --
@@ -4431,7 +4430,8 @@ package body Exp_Ch4 is
-- handling.
if Is_Controlled_Function_Call (Thenx)
- or else Is_Controlled_Function_Call (Elsex)
+ or else
+ Is_Controlled_Function_Call (Elsex)
then
Flag_Id := Make_Temporary (Loc, 'F');
diff --git a/gcc/ada/exp_ch7.adb b/gcc/ada/exp_ch7.adb
index 4c2af31e7a9..a1d5634bb47 100644
--- a/gcc/ada/exp_ch7.adb
+++ b/gcc/ada/exp_ch7.adb
@@ -1892,14 +1892,13 @@ package body Exp_Ch7 is
then
Processing_Actions (Has_No_Init => True);
- -- Processing for intermediate results of conditional
- -- expressions where one of the alternatives uses a controlled
- -- function call.
+ -- Process intermediate results of conditional expression with
+ -- one of the alternatives using a controlled function call.
elsif Is_Access_Type (Obj_Typ)
and then Present (Status_Flag_Or_Transient_Decl (Obj_Id))
and then Nkind (Status_Flag_Or_Transient_Decl (Obj_Id)) =
- N_Defining_Identifier
+ N_Defining_Identifier
and then Present (Expr)
and then Nkind (Expr) = N_Null
then
@@ -2728,7 +2727,7 @@ package body Exp_Ch7 is
-- end if;
if Nkind (Status_Flag_Or_Transient_Decl (Obj_Id)) =
- N_Object_Declaration
+ N_Object_Declaration
then
Fin_Stmts := New_List (
Make_If_Statement (Loc,
@@ -2736,12 +2735,11 @@ package body Exp_Ch7 is
Make_Op_Ne (Loc,
Left_Opnd => New_Reference_To (Obj_Id, Loc),
Right_Opnd => Make_Null (Loc)),
-
Then_Statements => Fin_Stmts));
- -- Return objects use a flag to aid their potential
- -- finalization when the enclosing function fails to return
- -- properly. Generate:
+ -- Return objects use a flag to aid in processing their
+ -- potential finalization when the enclosing function fails
+ -- to return properly. Generate:
-- if not Flag then
-- <object finalization statements>
diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb
index c340baf85d8..dd5a5d59a53 100644
--- a/gcc/ada/exp_ch9.adb
+++ b/gcc/ada/exp_ch9.adb
@@ -13342,7 +13342,7 @@ package body Exp_Ch9 is
-- or attribute definition clause, or there is an Interrupt_Priority
-- rep item and no Priority rep item, and we set the ceiling to
-- Interrupt_Priority'Last, an implementation-defined value, see
- -- D.3(10).
+ -- (RM D.3(10)).
if Has_Rep_Item (Ptyp, Name_Priority) then
declare
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index 3ebec4f97d0..a732da215c4 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -7181,7 +7181,7 @@ package body Exp_Util is
elsif Is_Access_Type (Obj_Typ)
and then Present (Status_Flag_Or_Transient_Decl (Obj_Id))
and then Nkind (Status_Flag_Or_Transient_Decl (Obj_Id)) =
- N_Object_Declaration
+ N_Object_Declaration
and then Is_Finalizable_Transient
(Status_Flag_Or_Transient_Decl (Obj_Id), Decl)
then
diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb
index e58dac5a589..f0e643d05fe 100644
--- a/gcc/ada/freeze.adb
+++ b/gcc/ada/freeze.adb
@@ -2168,8 +2168,7 @@ package body Freeze is
-- Deal with Bit_Order aspect specifying a non-default bit order
- ADC :=
- Get_Attribute_Definition_Clause (Rec, Attribute_Bit_Order);
+ ADC := Get_Attribute_Definition_Clause (Rec, Attribute_Bit_Order);
if Present (ADC) and then Base_Type (Rec) = Rec then
if not Placed_Component then
@@ -2180,7 +2179,7 @@ package body Freeze is
-- Here is where we do the processing for reversed bit order
elsif Reverse_Bit_Order (Rec)
- and then not Reverse_Storage_Order (Rec)
+ and then not Reverse_Storage_Order (Rec)
then
Adjust_Record_For_Reverse_Bit_Order (Rec);
diff --git a/gcc/ada/lib.adb b/gcc/ada/lib.adb
index 2c5aa4c507f..fc62239b29e 100644
--- a/gcc/ada/lib.adb
+++ b/gcc/ada/lib.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -37,6 +37,7 @@ with Atree; use Atree;
with Csets; use Csets;
with Einfo; use Einfo;
with Fname; use Fname;
+with Nlists; use Nlists;
with Output; use Output;
with Sinfo; use Sinfo;
with Sinput; use Sinput;
@@ -1155,4 +1156,82 @@ package body Lib is
Version_Ref.Append (S);
end Version_Referenced;
+ ---------------------
+ -- Write_Unit_Info --
+ ---------------------
+
+ procedure Write_Unit_Info
+ (Unit_Num : Unit_Number_Type;
+ Item : Node_Id;
+ Prefix : String := "";
+ Withs : Boolean := False)
+ is
+ begin
+ Write_Str (Prefix);
+ Write_Unit_Name (Unit_Name (Unit_Num));
+ Write_Str (", unit ");
+ Write_Int (Int (Unit_Num));
+ Write_Str (", ");
+ Write_Int (Int (Item));
+ Write_Str ("=");
+ Write_Str (Node_Kind'Image (Nkind (Item)));
+
+ if Item /= Original_Node (Item) then
+ Write_Str (", orig = ");
+ Write_Int (Int (Original_Node (Item)));
+ Write_Str ("=");
+ Write_Str (Node_Kind'Image (Nkind (Original_Node (Item))));
+ end if;
+
+ Write_Eol;
+
+ -- Skip the rest if we're not supposed to print the withs
+
+ if not Withs then
+ return;
+ end if;
+
+ declare
+ Context_Item : Node_Id;
+
+ begin
+ Context_Item := First (Context_Items (Cunit (Unit_Num)));
+ while Present (Context_Item)
+ and then (Nkind (Context_Item) /= N_With_Clause
+ or else Limited_Present (Context_Item))
+ loop
+ Context_Item := Next (Context_Item);
+ end loop;
+
+ if Present (Context_Item) then
+ Indent;
+ Write_Line ("withs:");
+ Indent;
+
+ while Present (Context_Item) loop
+ if Nkind (Context_Item) = N_With_Clause
+ and then not Limited_Present (Context_Item)
+ then
+ pragma Assert (Present (Library_Unit (Context_Item)));
+ Write_Unit_Name
+ (Unit_Name
+ (Get_Cunit_Unit_Number (Library_Unit (Context_Item))));
+
+ if Implicit_With (Context_Item) then
+ Write_Str (" -- implicit");
+ end if;
+
+ Write_Eol;
+ end if;
+
+ Context_Item := Next (Context_Item);
+ end loop;
+
+ Outdent;
+ Write_Line ("end withs");
+ Outdent;
+ end if;
+ end;
+ end Write_Unit_Info;
+
end Lib;
diff --git a/gcc/ada/lib.ads b/gcc/ada/lib.ads
index 2b3f90650cd..d7607ee097b 100644
--- a/gcc/ada/lib.ads
+++ b/gcc/ada/lib.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -673,6 +673,15 @@ package Lib is
-- that file not being compiled. The predicate Generic_May_Lack_ALI is
-- True for those generic units for which missing ALI files are allowed.
+ procedure Write_Unit_Info
+ (Unit_Num : Unit_Number_Type;
+ Item : Node_Id;
+ Prefix : String := "";
+ Withs : Boolean := False);
+ -- Print out debugging information about the unit. Prefix precedes the rest
+ -- of the printout. If Withs is True, we print out units with'ed by this
+ -- unit (not counting limited withs).
+
private
pragma Inline (Cunit);
pragma Inline (Cunit_Entity);
diff --git a/gcc/ada/par-prag.adb b/gcc/ada/par-prag.adb
index 5a1f469e078..e0834764865 100644
--- a/gcc/ada/par-prag.adb
+++ b/gcc/ada/par-prag.adb
@@ -1183,6 +1183,7 @@ begin
Pragma_Linker_Destructor |
Pragma_Linker_Options |
Pragma_Linker_Section |
+ Pragma_Lock_Free |
Pragma_Locking_Policy |
Pragma_Long_Float |
Pragma_Machine_Attribute |
diff --git a/gcc/ada/s-taprop-dummy.adb b/gcc/ada/s-taprop-dummy.adb
index 96bcc3c3bbc..61cb2940c68 100644
--- a/gcc/ada/s-taprop-dummy.adb
+++ b/gcc/ada/s-taprop-dummy.adb
@@ -46,27 +46,30 @@ package body System.Task_Primitives.Operations is
pragma Warnings (Off);
-- Turn off warnings since so many unreferenced parameters
- --------------------
- -- Local Packages --
- --------------------
+ --------------
+ -- Specific --
+ --------------
- package Specific is
+ -- Package Specific contains target specific routines, and the body of
+ -- this package is target specific.
+ package Specific is
procedure Set (Self_Id : Task_Id);
pragma Inline (Set);
-- Set the self id for the current task
-
end Specific;
package body Specific is
+ ---------
+ -- Set --
+ ---------
+
procedure Set (Self_Id : Task_Id) is
begin
null;
end Set;
-
end Specific;
- -- The body of this package is target specific
----------------------------------
-- ATCB allocation/deallocation --
diff --git a/gcc/ada/sem.adb b/gcc/ada/sem.adb
index 503d1f40d43..352665af23f 100644
--- a/gcc/ada/sem.adb
+++ b/gcc/ada/sem.adb
@@ -91,15 +91,6 @@ package body Sem is
-- of this unit, since they count as dependences on their parent library
-- item. CU must be an N_Compilation_Unit whose Unit is not an N_Subunit.
- procedure Write_Unit_Info
- (Unit_Num : Unit_Number_Type;
- Item : Node_Id;
- Prefix : String := "";
- Withs : Boolean := False);
- -- Print out debugging information about the unit. Prefix precedes the rest
- -- of the printout. If Withs is True, we print out units with'ed by this
- -- unit (not counting limited withs).
-
-------------
-- Analyze --
-------------
@@ -2290,82 +2281,4 @@ package body Sem is
end loop;
end Walk_Withs_Immediate;
- ---------------------
- -- Write_Unit_Info --
- ---------------------
-
- procedure Write_Unit_Info
- (Unit_Num : Unit_Number_Type;
- Item : Node_Id;
- Prefix : String := "";
- Withs : Boolean := False)
- is
- begin
- Write_Str (Prefix);
- Write_Unit_Name (Unit_Name (Unit_Num));
- Write_Str (", unit ");
- Write_Int (Int (Unit_Num));
- Write_Str (", ");
- Write_Int (Int (Item));
- Write_Str ("=");
- Write_Str (Node_Kind'Image (Nkind (Item)));
-
- if Item /= Original_Node (Item) then
- Write_Str (", orig = ");
- Write_Int (Int (Original_Node (Item)));
- Write_Str ("=");
- Write_Str (Node_Kind'Image (Nkind (Original_Node (Item))));
- end if;
-
- Write_Eol;
-
- -- Skip the rest if we're not supposed to print the withs
-
- if not Withs then
- return;
- end if;
-
- declare
- Context_Item : Node_Id;
-
- begin
- Context_Item := First (Context_Items (Cunit (Unit_Num)));
- while Present (Context_Item)
- and then (Nkind (Context_Item) /= N_With_Clause
- or else Limited_Present (Context_Item))
- loop
- Context_Item := Next (Context_Item);
- end loop;
-
- if Present (Context_Item) then
- Indent;
- Write_Line ("withs:");
- Indent;
-
- while Present (Context_Item) loop
- if Nkind (Context_Item) = N_With_Clause
- and then not Limited_Present (Context_Item)
- then
- pragma Assert (Present (Library_Unit (Context_Item)));
- Write_Unit_Name
- (Unit_Name
- (Get_Cunit_Unit_Number (Library_Unit (Context_Item))));
-
- if Implicit_With (Context_Item) then
- Write_Str (" -- implicit");
- end if;
-
- Write_Eol;
- end if;
-
- Context_Item := Next (Context_Item);
- end loop;
-
- Outdent;
- Write_Line ("end withs");
- Outdent;
- end if;
- end;
- end Write_Unit_Info;
-
end Sem;
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb
index bf700803086..1e95a6d76ef 100644
--- a/gcc/ada/sem_attr.adb
+++ b/gcc/ada/sem_attr.adb
@@ -3569,6 +3569,19 @@ package body Sem_Attr is
Check_Array_Type;
Set_Etype (N, Universal_Integer);
+ ---------------
+ -- Lock_Free --
+ ---------------
+
+ when Attribute_Lock_Free =>
+ Check_E0;
+ Set_Etype (N, Standard_Boolean);
+
+ if not Is_Protected_Type (P_Type) then
+ Error_Attr_P
+ ("prefix of % attribute must be a protected object");
+ end if;
+
-------------
-- Machine --
-------------
@@ -6767,6 +6780,15 @@ package body Sem_Attr is
True);
end if;
+ ---------------
+ -- Lock_Free --
+ ---------------
+
+ -- Lock_Free attribute is a Boolean, thus no need to fold here.
+
+ when Attribute_Lock_Free =>
+ null;
+
----------
-- Last --
----------
diff --git a/gcc/ada/sem_aux.ads b/gcc/ada/sem_aux.ads
index 85c70f91374..bf09e99ba5a 100644
--- a/gcc/ada/sem_aux.ads
+++ b/gcc/ada/sem_aux.ads
@@ -163,7 +163,7 @@ package Sem_Aux is
-- Searches the Rep_Item chain for a given entity E, for an instance of a
-- rep item (pragma, attribute definition clause, or aspect specification)
-- whose name matches the given name Nam. If Check_Parents is False then it
- -- only returns rep item that has been directly specified to E (and not
+ -- only returns rep item that has been directly specified for E (and not
-- inherited from its parents, if any). If one is found, it is returned,
-- otherwise Empty is returned. A special case is that when Nam is
-- Name_Priority, the call will also find Interrupt_Priority.
@@ -172,11 +172,11 @@ package Sem_Aux is
(E : Entity_Id;
Nam : Name_Id;
Check_Parents : Boolean := True) return Node_Id;
- -- Searches the Rep_Item chain for a given entity E, for an instance of a
- -- representation pragma whose name matches the given name Nam. If
+ -- Searches the Rep_Item chain for a given entity E, for an instance
+ -- of a representation pragma whose name matches the given name Nam. If
-- Check_Parents is False then it only returns representation pragma that
- -- has been directly specified to E (and not inherited from its parents, if
- -- any). If one is found, it is returned, otherwise Empty is returned. A
+ -- has been directly specified for E (and not inherited from its parents,
+ -- if any). If one is found, it is returned, otherwise Empty is returned. A
-- special case is that when Nam is Name_Priority, the call will also find
-- Interrupt_Priority.
@@ -186,10 +186,10 @@ package Sem_Aux is
Check_Parents : Boolean := True) return Boolean;
-- Searches the Rep_Item chain for the given entity E, for an instance of a
-- rep item (pragma, attribute definition clause, or aspect specification)
- -- with the given name Nam. If Check_Parents is False then it only returns
- -- rep item that has been directly specified to E (and not inherited from
- -- its parents, if any). If found then True is returned, otherwise False
- -- indicates that no matching entry was found.
+ -- with the given name Nam. If Check_Parents is False then it only checks
+ -- for a rep item that has been directly specified for E (and not inherited
+ -- from its parents, if any). If found then True is returned, otherwise
+ -- False indicates that no matching entry was found.
function Has_Rep_Pragma
(E : Entity_Id;
@@ -197,8 +197,8 @@ package Sem_Aux is
Check_Parents : Boolean := True) return Boolean;
-- Searches the Rep_Item chain for the given entity E, for an instance of a
-- representation pragma with the given name Nam. If Check_Parents is False
- -- then it only returns representation pragma that has been directly
- -- specified to E (and not inherited from its parents, if any). If found
+ -- then it only checks for a representation pragma that has been directly
+ -- specified for E (and not inherited from its parents, if any). If found
-- then True is returned, otherwise False indicates that no matching entry
-- was found.
diff --git a/gcc/ada/sem_ch10.adb b/gcc/ada/sem_ch10.adb
index 82fde3f7191..6ed11b87766 100644
--- a/gcc/ada/sem_ch10.adb
+++ b/gcc/ada/sem_ch10.adb
@@ -1261,7 +1261,6 @@ package body Sem_Ch10 is
and then Warn_On_Obsolescent_Feature
and then Nkind (Unit_Node) not in N_Generic_Instantiation
then
-
-- Push current compilation unit as scope, so that the test for
-- being within an obsolescent unit will work correctly. The check
-- is not performed within an instantiation, because the warning
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 63b29c10c7d..ddfa7e75b0c 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -1445,6 +1445,8 @@ package body Sem_Ch13 is
then
Set_Uses_Lock_Free (E);
end if;
+
+ Record_Rep_Item (E, Aspect);
end if;
goto Continue;
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb
index c69bf918e5d..d0f918df397 100644
--- a/gcc/ada/sem_ch6.adb
+++ b/gcc/ada/sem_ch6.adb
@@ -5503,6 +5503,18 @@ package body Sem_Ch6 is
end if;
end if;
+ -- Ada 2012: mode conformance also requires that formal parameters
+ -- be both aliased, or neither.
+
+ if Ctype >= Mode_Conformant
+ and then Ada_Version >= Ada_2012
+ then
+ if Is_Aliased (Old_Formal) /= Is_Aliased (New_Formal) then
+ Conformance_Error
+ ("\aliased parameter mismatch!", New_Formal);
+ end if;
+ end if;
+
if Ctype = Fully_Conformant then
-- Names must match. Error message is more accurate if we do
diff --git a/gcc/ada/sem_ch9.adb b/gcc/ada/sem_ch9.adb
index ced4d51640d..58a27c93256 100644
--- a/gcc/ada/sem_ch9.adb
+++ b/gcc/ada/sem_ch9.adb
@@ -23,7 +23,6 @@
-- --
------------------------------------------------------------------------------
-with Aspects; use Aspects;
with Atree; use Atree;
with Checks; use Checks;
with Debug; use Debug;
@@ -263,16 +262,41 @@ package body Sem_Ch9 is
begin
-- Function calls and attribute references must be static
- if Nkind_In (N, N_Attribute_Reference, N_Function_Call)
+ if Nkind (N) = N_Attribute_Reference
and then not Is_Static_Expression (N)
then
+ if Complain then
+ Error_Msg_N
+ ("non-static attribute reference not allowed",
+ N);
+ end if;
+
+ return Abandon;
+
+ elsif Nkind (N) = N_Function_Call
+ and then not Is_Static_Expression (N)
+ then
+ if Complain then
+ Error_Msg_N ("non-static function call not allowed",
+ N);
+ end if;
+
return Abandon;
-- Loop statements and procedure calls are prohibited
- elsif Nkind_In (N, N_Loop_Statement,
- N_Procedure_Call_Statement)
- then
+ elsif Nkind (N) = N_Loop_Statement then
+ if Complain then
+ Error_Msg_N ("loop not allowed", N);
+ end if;
+
+ return Abandon;
+
+ elsif Nkind (N) = N_Procedure_Call_Statement then
+ if Complain then
+ Error_Msg_N ("procedure call not allowed", N);
+ end if;
+
return Abandon;
-- References
@@ -295,6 +319,12 @@ package body Sem_Ch9 is
and then not Scope_Within_Or_Same (Scope (Id),
Protected_Body_Subprogram (Sub_Id))
then
+ if Complain then
+ Error_Msg_NE
+ ("reference to global variable& not allowed",
+ N, Id);
+ end if;
+
return Abandon;
-- Prohibit non-scalar out parameters (scalar
@@ -305,6 +335,12 @@ package body Sem_Ch9 is
and then not Is_Elementary_Type (Etype (Id))
and then Scope_Within_Or_Same (Scope (Id), Sub_Id)
then
+ if Complain then
+ Error_Msg_NE
+ ("non-elementary out parameter& not allowed",
+ N, Id);
+ end if;
+
return Abandon;
-- A protected subprogram may reference only one
@@ -327,6 +363,13 @@ package body Sem_Ch9 is
-- body.
elsif Comp /= Id then
+ if Complain then
+ Error_Msg_N
+ ("only one protected component " &
+ "allowed",
+ N);
+ end if;
+
return Abandon;
end if;
end if;
@@ -352,6 +395,13 @@ package body Sem_Ch9 is
-- body.
elsif Comp /= Prival_Link (Id) then
+ if Complain then
+ Error_Msg_N
+ ("only one protected component " &
+ "allowed",
+ N);
+ end if;
+
return Abandon;
end if;
end if;
@@ -1375,7 +1425,6 @@ package body Sem_Ch9 is
procedure Analyze_Protected_Body (N : Node_Id) is
Body_Id : constant Entity_Id := Defining_Identifier (N);
- Aspect : Node_Id;
Last_E : Entity_Id;
Spec_Id : Entity_Id;
@@ -1390,6 +1439,50 @@ package body Sem_Ch9 is
-- differs from Spec_Id in the case of a single protected object, since
-- Spec_Id is set to the protected type in this case).
+ function Lock_Free_Disabled return Boolean;
+ -- This routine returns False if the protected object has a Lock_Free
+ -- aspect specification or a Lock_Free pragma that turns off the
+ -- lock-free implementation (e.g. whose expression is False).
+
+ ------------------------
+ -- Lock_Free_Disabled --
+ ------------------------
+
+ function Lock_Free_Disabled return Boolean is
+ Ritem : constant Node_Id :=
+ Get_Rep_Item
+ (Spec_Id, Name_Lock_Free, Check_Parents => False);
+
+ begin
+ if Present (Ritem) then
+ -- Pragma with one argument
+
+ if Nkind (Ritem) = N_Pragma
+ and then Present (Pragma_Argument_Associations (Ritem))
+ then
+ return
+ Is_False (Static_Boolean
+ (Expression (First (Pragma_Argument_Associations (Ritem)))));
+
+ -- Aspect Specification with expression present
+
+ elsif Nkind (Ritem) = N_Aspect_Specification
+ and then Present (Expression (Ritem))
+ then
+ return Is_False (Static_Boolean (Expression (Ritem)));
+
+ -- Otherwise, return False
+
+ else
+ return False;
+ end if;
+ end if;
+
+ return False;
+ end Lock_Free_Disabled;
+
+ -- Start of processing for Analyze_Protected_Body
+
begin
Tasking_Used := True;
Set_Ekind (Body_Id, E_Protected_Body);
@@ -1450,37 +1543,21 @@ package body Sem_Ch9 is
Process_End_Label (N, 't', Ref_Id);
End_Scope;
- -- Turn on/off the lock-free implementation for the protected object
-
- -- Look for a Lock_Free aspect with a False expression that disables the
- -- lock-free implementation.
-
- Aspect := First (Aspect_Specifications (Parent (Spec_Id)));
-
- while Present (Aspect) loop
- if Get_Aspect_Id (Chars (Identifier (Aspect))) = Aspect_Lock_Free
- and then Present (Expression (Aspect))
- and then Entity (Expression (Aspect)) = Standard_False
- then
- return;
- end if;
-
- Next (Aspect);
- end loop;
-
- -- When a Lock_Free aspect forces the lock-free implementation, verify
- -- the protected body meets all the restrictions, otherwise
- -- Allows_Lock_Free_Implementation issues an error message.
+ -- When a Lock_Free aspect specification/pragma forces the lock-free
+ -- implementation, verify the protected body meets all the restrictions,
+ -- otherwise Allows_Lock_Free_Implementation issues an error message.
if Uses_Lock_Free (Spec_Id) then
if not Allows_Lock_Free_Implementation (N, Complain => True) then
return;
end if;
- -- In other cases, check both the protected declaration and body satisfy
- -- the lock-free restrictions.
+ -- In other cases, if there is no aspect specification/pragma that
+ -- disables the lock-free implementation, check both the protected
+ -- declaration and body satisfy the lock-free restrictions.
- elsif Allows_Lock_Free_Implementation (Parent (Spec_Id))
+ elsif not Lock_Free_Disabled
+ and then Allows_Lock_Free_Implementation (Parent (Spec_Id))
and then Allows_Lock_Free_Implementation (N)
then
Set_Uses_Lock_Free (Spec_Id);
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index 35e1f6404ee..8b2eb1c908c 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -11118,6 +11118,54 @@ package body Sem_Prag is
when Pragma_List =>
null;
+ ---------------
+ -- Lock_Free --
+ ---------------
+
+ -- pragma Lock_Free [(Boolean_EXPRESSION)];
+
+ when Pragma_Lock_Free => Lock_Free : declare
+ P : constant Node_Id := Parent (N);
+ Arg : Node_Id;
+ Ent : Entity_Id;
+ Val : Boolean;
+
+ begin
+ Check_No_Identifiers;
+ Check_At_Most_N_Arguments (1);
+
+ -- Protected definition case
+
+ if Nkind (P) = N_Protected_Definition then
+ Ent := Defining_Identifier (Parent (P));
+
+ -- One argument
+
+ if Arg_Count = 1 then
+ Arg := Get_Pragma_Arg (Arg1);
+ Val := Is_True (Static_Boolean (Arg));
+
+ -- Zero argument. In this case the expression is considered to
+ -- be True.
+
+ else
+ Val := True;
+ end if;
+
+ -- Check duplicate pragma before we chain the pragma in the Rep
+ -- Item chain of Ent.
+
+ Check_Duplicate_Pragma (Ent);
+ Record_Rep_Item (Ent, N);
+ Set_Uses_Lock_Free (Ent, Val);
+
+ -- Anything else is incorrect
+
+ else
+ Pragma_Misplaced;
+ end if;
+ end Lock_Free;
+
--------------------
-- Locking_Policy --
--------------------
@@ -15212,6 +15260,7 @@ package body Sem_Prag is
Pragma_Linker_Options => -1,
Pragma_Linker_Section => -1,
Pragma_List => -1,
+ Pragma_Lock_Free => -1,
Pragma_Locking_Policy => -1,
Pragma_Long_Float => -1,
Pragma_Machine_Attribute => -1,
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 017be8368dc..f42c7547816 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -7745,14 +7745,13 @@ package body Sem_Util is
when N_String_Literal =>
return Is_Internally_Generated_Renaming (Parent (N));
- -- AI05-0003: in Ada 2012, a qualified expression is a name.
- -- This allows disambiguation of function calls and the use of
- -- aggregates in more contexts.
+ -- AI05-0003: In Ada 2012 a qualified expression is a name.
+ -- This allows disambiguation of function calls and the use
+ -- of aggregates in more contexts.
when N_Qualified_Expression =>
if Ada_Version < Ada_2012 then
return False;
-
else
return Is_Object_Reference (Expression (N))
or else Nkind (Expression (N)) = N_Aggregate;
diff --git a/gcc/ada/snames.adb-tmpl b/gcc/ada/snames.adb-tmpl
index 0beb51fd1e9..4ac3c220549 100644
--- a/gcc/ada/snames.adb-tmpl
+++ b/gcc/ada/snames.adb-tmpl
@@ -219,6 +219,8 @@ package body Snames is
return Pragma_Interface;
elsif N = Name_Interrupt_Priority then
return Pragma_Interrupt_Priority;
+ elsif N = Name_Lock_Free then
+ return Pragma_Lock_Free;
elsif N = Name_Priority then
return Pragma_Priority;
elsif N = Name_Relative_Deadline then
@@ -421,6 +423,7 @@ package body Snames is
or else N = Name_Fast_Math
or else N = Name_Interface
or else N = Name_Interrupt_Priority
+ or else N = Name_Lock_Free
or else N = Name_Relative_Deadline
or else N = Name_Priority
or else N = Name_Storage_Size
diff --git a/gcc/ada/snames.ads-tmpl b/gcc/ada/snames.ads-tmpl
index 4b1b337d036..38bab59120b 100644
--- a/gcc/ada/snames.ads-tmpl
+++ b/gcc/ada/snames.ads-tmpl
@@ -142,7 +142,6 @@ package Snames is
Name_Dimension : constant Name_Id := N + $;
Name_Dimension_System : constant Name_Id := N + $;
Name_Dynamic_Predicate : constant Name_Id := N + $;
- Name_Lock_Free : constant Name_Id := N + $;
Name_Post : constant Name_Id := N + $;
Name_Pre : constant Name_Id := N + $;
Name_Static_Predicate : constant Name_Id := N + $;
@@ -522,6 +521,12 @@ package Snames is
Name_Linker_Options : constant Name_Id := N + $;
Name_Linker_Section : constant Name_Id := N + $; -- GNAT
Name_List : constant Name_Id := N + $;
+
+ -- Note: Lock_Free is not in this list because its name matches the name of
+ -- the corresponding attribute. However, it is included in the definition
+ -- of the type Pragma_Id, and the functions Get_Pragma_Id and Is_Pragma_Id
+ -- correctly recognize and process Lock_Free. Lock_Free is a GNAT pragma.
+
Name_Machine_Attribute : constant Name_Id := N + $; -- GNAT
Name_Main : constant Name_Id := N + $; -- GNAT
Name_Main_Storage : constant Name_Id := N + $; -- GNAT
@@ -810,6 +815,7 @@ package Snames is
Name_Last_Valid : constant Name_Id := N + $; -- Ada 12
Name_Leading_Part : constant Name_Id := N + $;
Name_Length : constant Name_Id := N + $;
+ Name_Lock_Free : constant Name_Id := N + $; -- GNAT
Name_Machine_Emax : constant Name_Id := N + $;
Name_Machine_Emin : constant Name_Id := N + $;
Name_Machine_Mantissa : constant Name_Id := N + $;
@@ -1388,6 +1394,7 @@ package Snames is
Attribute_Last_Valid,
Attribute_Leading_Part,
Attribute_Length,
+ Attribute_Lock_Free,
Attribute_Machine_Emax,
Attribute_Machine_Emin,
Attribute_Machine_Mantissa,
@@ -1774,6 +1781,7 @@ package Snames is
Pragma_Fast_Math,
Pragma_Interface,
Pragma_Interrupt_Priority,
+ Pragma_Lock_Free,
Pragma_Priority,
Pragma_Storage_Size,
Pragma_Storage_Unit,
@@ -1853,8 +1861,8 @@ package Snames is
function Is_Pragma_Name (N : Name_Id) return Boolean;
-- Test to see if the name N is the name of a recognized pragma. Note that
-- pragmas AST_Entry, CPU, Dispatching_Domain, Fast_Math,
- -- Interrupt_Priority, Priority, Storage_Size, and Storage_Unit are
- -- recognized as pragmas by this function even though their names are
+ -- Interrupt_Priority, Lock_Free, Priority, Storage_Size, and Storage_Unit
+ -- are recognized as pragmas by this function even though their names are
-- separate from the other pragma names. For this reason, clients should
-- always use this function, rather than do range tests on Name_Id values.
@@ -1895,8 +1903,9 @@ package Snames is
-- if N is not a name of a known (Ada defined or GNAT-specific) pragma.
-- Note that the function also works correctly for names of pragmas that
-- are not included in the main list of pragma Names (AST_Entry, CPU,
- -- Dispatching_Domain, Interrupt_Priority, Priority, Storage_Size, and
- -- Storage_Unit (e.g. Name_Storage_Size returns Pragma_Storage_Size).
+ -- Dispatching_Domain, Interrupt_Priority, Lock_Free, Priority,
+ -- Storage_Size, and Storage_Unit (e.g. Name_Storage_Size returns
+ -- Pragma_Storage_Size).
function Get_Queuing_Policy_Id (N : Name_Id) return Queuing_Policy_Id;
-- Returns Id of queuing policy corresponding to given name. It is an error