This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Tested on i686-linux, committed on trunk This patch was designed to address the specific issue of not giving the warning that "X is not modified, could be declared as constant" for the case of unbounded strings, as shown by the example below which did give the second warning when compiled with -gnatwa. 1. with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; 2. procedure Cst is 3. C : Integer := 12; | >>> warning: "C" is not modified, could be declared constant >>> warning: variable "C" is not referenced 4. V : Unbounded_String := To_Unbounded_String ("toto"); | >>> warning: "V" is not modified, could be declared constant 5. W : Unbounded_String; | >>> warning: variable "W" is assigned but never read 6. begin 7. W := V; 8. end Cst; However the patch grew to be an overhaul of the mechanism for warnings about unused, unreferenced etc variables, and the changes, which involve setting the flags more accurately, and testing them more accurately in Sem_Warn eliminate both false negatives and false positives, generally improving this warning mechanism This patch also improves generation of warnings for in out parameters. The flag Never_Set_In_Source is now properly set for in out parameters and under control of -gnatwu, more cases of unreferenced in out parameters now generate warnings. In addition, if an in out parameter is read but never assigned, then under control of -gnatwk, a warning is given that the mode could be in, as shown by the following, compiled with -gnatwk -gnatj60 -gnatl: 1. procedure k 2. (b : in out integer; | >>> warning: formal parameter "b" is not modified, mode could be "in" instead of "in out" 3. c : in out integer; 4. l : in out integer) is 5. begin 6. c := b; 7. end; if we also set -gnatwu, we get: 1. procedure k 2. (b : in out integer; | >>> warning: formal parameter "b" is not modified, mode could be "in" instead of "in out" 3. c : in out integer; 4. l : in out integer) is | >>> warning: formal parameter "l" is not referenced 5. begin 6. c := b; 7. end; Finally, this patch enables a new warning for a return in a procedure where one or more out parameters have not been set. The warning is limited to scalar types, and a special exception is made if there is a boolean out parameter that has been set (since this is a common idiom for the case where other out parameters are not to be accessed if the out boolean is set). Also, we don't give the warning if the out parameter is never referenced, since the never read, never assigned warning is quite sufficient in this case. The following example shows the various cases: 1. procedure wtest is 2. procedure b1 3. (Flag : Boolean; 4. I1, I2, I3 : out Integer; | >>> warning: variable "I3" is never read and never assigned 5. S : out String) 6. is 7. begin 8. if Flag then 9. I1 := 0; 10. return; | >>> warning: "out" parameter "I2" not set before return 11. end if; 12. I2 := 0; 13. S := "Hello"; 14. end; 15. 16. procedure b2 17. (Flag : Boolean; 18. I1, I2, I3 : out Integer; | >>> warning: variable "I3" is never read and never assigned 19. x : out boolean) 20. is 21. begin 22. if Flag then 23. x := False; 24. I1 := 0; 25. return; 26. end if; 27. I2 := 0; 28. end; 29. 30. begin 31. null; 32. end; 2007-08-14 Ed Schonberg <schonberg@adacore.com> Robert Dewar <dewar@adacore.com> Javier Miranda <miranda@adacore.com> Gary Dismukes <dismukes@adacore.com> * einfo.ads, einfo.adb: Create a limited view of an incomplete type, to make treatment of limited views uniform for all visible declarations in a limited_withed package. Improve warnings for in out parameters (Set_Related_Interaface/Related_Interface): Allow the use of this attribute with constants. (Write_Field26_Name): Handle attribute Related_Interface in constants. Warn on duplicate pragma Preelaborable_Initialialization * sem_ch6.ads, sem_ch6.adb (Analyze_Subprogram_Body): Force the generation of a freezing node to ensure proper management of null excluding access types in the backend. (Create_Extra_Formals): Test base type of the formal when checking for the need to add an extra accessibility-level formal. Pass the entity E on all calls to Add_Extra_Formal (rather than Scope (Formal) as was originally being done in a couple of cases), to ensure that the Extra_Formals list gets set on the entity E when the first entity is added. (Conforming_Types): Add missing calls to Base_Type to the code that handles anonymous access types. This is required to handle the general case because Process_Formals builds internal subtype entities to handle null-excluding access types. (Make_Controlling_Function_Wrappers): Create wrappers for constructor functions that need it, even when not marked Requires_Overriding. Improve warnings for in out parameters (Analyze_Function_Return): Warn for disallowed null return Warn on return from procedure with unset out parameter Ensure consistent use of # in error messages (Check_Overriding_Indicator): Add in parameter Is_Primitive. (Analyze_Function_Return): Move call to Apply_Constraint_Check before the implicit conversion of the expression done for anonymous access types. This is required to generate the code of the null excluding check (if required). * sem_warn.ads, sem_warn.adb (Check_References.Publicly_Referenceable): A formal parameter is never publicly referenceable outside of its body. (Check_References): For an unreferenced formal parameter in an accept statement, use the same warning circuitry as for subprogram formal parameters. (Warn_On_Unreferenced_Entity): New subprogram, taken from Output_Unreferenced_Messages, containing the part of that routine that is now reused for entry formals as described above. (Goto_Spec_Entity): New function (Check_References): Do not give IN OUT warning for dispatching operation Improve warnings for in out parameters (Test_Ref): Check that the entity is not undefinite before calling Scope_Within, in order to avoid infinite loops. Warn on return from procedure with unset out parameter Improved warnings for unused variables
Attachment:
difs
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |