The frontend was unconditionally generating a read reference for OUT parameters. After this patch the compiler generates the read reference only for those cases specified by RM 6.4.1(12).
package Pkg is procedure Write (I : out Integer); procedure Update (I : in out Integer); end Pkg; package body Pkg is procedure Write (I : out Integer) is pragma Unreferenced (I); begin null; end Write; procedure Update (I : in out Integer) is pragma Unreferenced (I); begin null; end Update; end Pkg; with Pkg; procedure TEST is J : Integer := 0; begin Pkg.Write(J); -- out Pkg.Update(J); -- in out end; Command: gcc -c test.adb grep -i ^3i2 test.ali Output: 3i2 J{integer} 5m13 6m14 6r14 Tested on x86_64-pc-linux-gnu, committed on trunk 2013-02-06 Javier Miranda <mira...@adacore.com> * sem_res.adb (Resolve_Actuals): Generate a read reference for out-mode parameters in the cases specified by RM 6.4.1(12).
Index: sem_res.adb =================================================================== --- sem_res.adb (revision 195784) +++ sem_res.adb (working copy) @@ -3409,7 +3409,46 @@ Generate_Reference (Orig_A, A, 'm'); elsif not Is_Overloaded (A) then - Generate_Reference (Orig_A, A); + if Ekind (F) /= E_Out_Parameter then + Generate_Reference (Orig_A, A); + + -- RM 6.4.1(12): For an out parameter that is passed by + -- copy, the formal parameter object is created, and: + + -- * For an access type, the formal parameter is initialized + -- from the value of the actual, without checking that the + -- value satisfies any constraint, any predicate, or any + -- exclusion of the null value. + + -- * For a scalar type that has the Default_Value aspect + -- specified, the formal parameter is initialized from the + -- value of the actual, without checking that the value + -- satisfies any constraint or any predicate; + + -- * For a composite type with discriminants or that has + -- implicit initial values for any subcomponents, the + -- behavior is as for an in out parameter passed by copy. + + -- Hence for these cases we generate the read reference now + -- (the write reference will be generated later by + -- Note_Possible_Modification). + + elsif Is_By_Copy_Type (Etype (F)) + and then + (Is_Access_Type (Etype (F)) + or else + (Is_Scalar_Type (Etype (F)) + and then + Present (Default_Aspect_Value (Etype (F)))) + or else + (Is_Composite_Type (Etype (F)) + and then + (Has_Discriminants (Etype (F)) + or else + Is_Partially_Initialized_Type (Etype (F))))) + then + Generate_Reference (Orig_A, A); + end if; end if; end if; end if;