[Ada] 2012 rule on aliasing
Arnaud Charlet
charlet@adacore.com
Thu Jan 3 11:05:00 GMT 2013
Ongoing work to implement AI05-0144. No test needed.
Tested on x86_64-pc-linux-gnu, committed on trunk
2013-01-03 Javier Miranda <miranda@adacore.com>
* sem_warn.adb (Warn_On_Overlapping_Actuals): Adding documentation
plus restricting the functionality of this routine to cover the
cases described in the Ada 2012 reference manual. The previous
extended support is now available under -gnatX.
* s-tassta.adb (Finalize_Global_Tasks): Addition of a dummy
variable to call Timed_Sleep. Required to avoid warning on
overlapping out-mode actuals.
* opt.ads (Extensions_Allowed): Update documentation.
-------------- next part --------------
Index: s-tassta.adb
===================================================================
--- s-tassta.adb (revision 194841)
+++ s-tassta.adb (working copy)
@@ -806,8 +806,9 @@
procedure Finalize_Global_Tasks is
Self_ID : constant Task_Id := STPO.Self;
- Ignore : Boolean;
- pragma Unreferenced (Ignore);
+ Ignore_1 : Boolean;
+ Ignore_2 : Boolean;
+ pragma Unreferenced (Ignore_1, Ignore_2);
function State
(Int : System.Interrupt_Management.Interrupt_ID) return Character;
@@ -877,7 +878,7 @@
Timed_Sleep
(Self_ID, 0.01, System.OS_Primitives.Relative,
- Self_ID.Common.State, Ignore, Ignore);
+ Self_ID.Common.State, Ignore_1, Ignore_2);
end loop;
end if;
@@ -886,7 +887,7 @@
Timed_Sleep
(Self_ID, 0.01, System.OS_Primitives.Relative,
- Self_ID.Common.State, Ignore, Ignore);
+ Self_ID.Common.State, Ignore_1, Ignore_2);
Unlock (Self_ID);
Index: sem_warn.adb
===================================================================
--- sem_warn.adb (revision 194841)
+++ sem_warn.adb (working copy)
@@ -3292,41 +3292,89 @@
Act1, Act2 : Node_Id;
Form1, Form2 : Entity_Id;
+ function Is_Covered_Formal (Formal : Node_Id) return Boolean;
+ -- Return True if Formal is covered by the Ada 2012 rule. Under -gnatX
+ -- the rule is extended to cover record and array types.
+
+ function Refer_Same_Object (Act1, Act2 : Node_Id) return Boolean;
+ -- Two names are known to refer to the same object if the two names
+ -- are known to denote the same object; or one of the names is a
+ -- selected_component, indexed_component, or slice and its prefix is
+ -- known to refer to the same object as the other name; or one of the
+ -- two names statically denotes a renaming declaration whose renamed
+ -- object_name is known to refer to the same object as the other name
+ -- (RM 6.4.1(6.11/3))
+
+ -----------------------
+ -- Refer_Same_Object --
+ -----------------------
+
+ function Refer_Same_Object (Act1, Act2 : Node_Id) return Boolean is
+ begin
+ return Denotes_Same_Object (Act1, Act2)
+ or else Denotes_Same_Prefix (Act1, Act2);
+ end Refer_Same_Object;
+
+ -----------------------
+ -- Is_Covered_Formal --
+ -----------------------
+
+ function Is_Covered_Formal (Formal : Node_Id) return Boolean is
+ begin
+ -- Ada 2012 rule
+
+ if not Extensions_Allowed then
+ return
+ Ekind_In (Formal, E_Out_Parameter,
+ E_In_Out_Parameter)
+ and then Is_Elementary_Type (Etype (Formal));
+
+ -- Under -gnatX the rule is extended to cover array and record types
+
+ else
+ return
+ Ekind_In (Formal, E_Out_Parameter,
+ E_In_Out_Parameter)
+ and then (Is_Elementary_Type (Etype (Formal))
+ or else Is_Record_Type (Etype (Formal))
+ or else Is_Array_Type (Etype (Formal)));
+ end if;
+ end Is_Covered_Formal;
+
begin
- if not Warn_On_Overlap then
+ if Ada_Version < Ada_2012 and then not Warn_On_Overlap then
return;
end if;
-- Exclude calls rewritten as enumeration literals
- if Nkind (N) not in N_Subprogram_Call then
+ if Nkind (N) not in N_Subprogram_Call
+ and then Nkind (N) /= N_Entry_Call_Statement
+ then
return;
end if;
- -- Exclude calls to library subprograms. Container operations specify
- -- safe behavior when source and target coincide.
+ -- If a call C has two or more parameters of mode in out or out that are
+ -- of an elementary type, then the call is legal only if for each name
+ -- N that is passed as a parameter of mode in out or out to the call C,
+ -- there is no other name among the other parameters of mode in out or
+ -- out to C that is known to denote the same object (RM 6.4.1(6.15/3))
- if Is_Predefined_File_Name
- (Unit_File_Name (Get_Source_Unit (Sloc (Subp))))
- then
- return;
- end if;
+ -- Under -gnatX the rule is extended to cover array and record types.
Form1 := First_Formal (Subp);
Act1 := First_Actual (N);
while Present (Form1) and then Present (Act1) loop
- if Ekind (Form1) /= E_In_Parameter then
+
+ if Is_Covered_Formal (Form1) then
Form2 := First_Formal (Subp);
Act2 := First_Actual (N);
while Present (Form2) and then Present (Act2) loop
if Form1 /= Form2
- and then Ekind (Form2) /= E_Out_Parameter
- and then
- (Denotes_Same_Object (Act1, Act2)
- or else
- Denotes_Same_Prefix (Act1, Act2))
+ and then Is_Covered_Formal (Form2)
+ and then Refer_Same_Object (Act1, Act2)
then
- -- Exclude generic types and guard against previous errors
+ -- Guard against previous errors
if Error_Posted (N)
or else No (Etype (Act1))
@@ -3334,15 +3382,9 @@
then
null;
- elsif Is_Generic_Type (Etype (Act1))
- or else
- Is_Generic_Type (Etype (Act2))
- then
- null;
+ -- If the actual is a function call in prefix notation,
+ -- there is no real overlap.
- -- If the actual is a function call in prefix notation,
- -- there is no real overlap.
-
elsif Nkind (Act2) = N_Function_Call then
null;
@@ -3350,11 +3392,20 @@
-- intended.
elsif
- Is_By_Reference_Type (Underlying_Type (Etype (Form1)))
+ Present (Underlying_Type (Etype (Form1)))
+ and then
+ (Is_By_Reference_Type (Underlying_Type (Etype (Form1)))
+ or else
+ Convention (Underlying_Type (Etype (Form1)))
+ = Convention_Ada_Pass_By_Reference)
then
null;
+ -- Here we may need to issue message
+
else
+ Error_Msg_Warn := Ada_Version < Ada_2012;
+
declare
Act : Node_Id;
Form : Entity_Id;
Index: opt.ads
===================================================================
--- opt.ads (revision 194841)
+++ opt.ads (working copy)
@@ -563,7 +563,7 @@
Extensions_Allowed : Boolean := False;
-- GNAT
-- Set to True by switch -gnatX if GNAT specific language extensions
- -- are allowed. Currently there are no such defined extensions.
+ -- are allowed.
type External_Casing_Type is (
As_Is, -- External names cased as they appear in the Ada source
More information about the Gcc-patches
mailing list