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]

[Ada] improve warnings


Tested on i686-linux, committed on trunk.

This patch implements a test to see whether a variable is
referenced in an exception handler, and then the useless
assignment warning is suppressed if so.

Compile following with gcc -c h.adb -gnatld7 -gnatwa -gnatj60
Note the lack of warnings for Phase

Compiling: h.adb

     1. procedure H is
     2.    type Phase_T is (Phase_1, Phase_2, Phase_3);
     3.    Phase : Phase_T;
     4.    PhaseX : Phase_T;
     5. begin
     6.    Phase := Phase_1;
     7.    PhaseX := Phase_2;
     8.    Phase := PhaseX;
     9.    PhaseX := Phase_3;
           |
        >>> warning: useless assignment to "PhaseX", value
            overwritten at line 11

    10.    Phase := Phase_3;
    11.    PhaseX := Phase_3;
           |
        >>> warning: useless assignment to "PhaseX", value
            never referenced

    12. exception
    13.    when others =>
    14.       if Phase = Phase_3 then
    15.          raise Program_Error;
    16.       end if;
    17. end;

This patch also implements three improvements to handling of pragma
Obsolescent, as shown by these examples:

   procedure Gtk_New;
   pragma Obsolescent;

   package op is
      pragma Obsolescent;
      procedure ff;
   end op;

   with Initialize;
   with op;
   procedure Gtk_New is
   begin
      Initialize;
      op.ff;
   end Gtk_New;

   procedure Initialize;
   pragma Obsolescent;

For the above program, compiling gtk_new.ads with -gnatwa used to
give error messages, but no longer does so, since we decide that
obsolescent units can now call other obsolescent stuff without
any complaints.

The second example shows that we no longer generate redundant messages
when withing an obsolescent package, we now get one message on the
with (we used to get two additional messages on the use and on the
call).

     1. with op; use op;
             |
        >>> warning: with of obsolescent package "op" declared at op.ads:1

     2. procedure m is
     3. begin
     4.    op.ff;
     5. end;

Finally, this patch adds some new warnings to code statements. In particular
if Volatile is not specified then a warning is given if two or more
code statements appear in sequence, or if either Input or Output
operands are not present.

Here are examples (these are x86 specific) (compiled with -gnatlj60)

     1. with System.Machine_Code; use System.Machine_Code;
     2. function Exp1 (X : Long_Long_Float) return Long_Long_Float is
     3.    Result : Long_Long_Float := 0.0;
     4.    NL     : constant Character := ASCII.LF;
     5. begin
     6.    Asm (Template =>
           |
        >>> warning: code statement with no inputs should
            usually be Volatile

     7.           "fldl2e               " & NL
     8.         & "fscale               ",
     9.         Inputs   => No_Input_Operands,
    10.         Outputs  => No_Output_Operands);
    11.    return Result;
    12. end;

     1. with System.Machine_Code; use System.Machine_Code;
     2. function Exp3 (X : Long_Long_Float) return Long_Long_Float is
     3.    Result : Long_Long_Float;
     4.    NL     : constant Character := ASCII.LF;
     5. begin
     6.    Asm (Template =>

2006-10-31  Robert Dewar  <dewar@adacore.com>
	    Ed Schonberg  <schonberg@adacore.com>

	* freeze.adb: Add handling of Last_Assignment field
	(Warn_Overlay): Supply missing continuation marks in error msgs
	(Freeze_Entity): Add check for Preelaborable_Initialization

	* g-comlin.adb: Add Warnings (Off) to prevent new warning

	* g-expect.adb: Add Warnings (Off) to prevent new warning

	* lib-xref.adb: Add handling of Last_Assignment field
	(Generate_Reference): Centralize handling of pragma Obsolescent here
	(Generate_Reference): Accept an implicit reference generated for a
	default in an instance.
	(Generate_Reference): Accept a reference for a node that is not in the
	main unit, if it is the generic body corresponding to an subprogram
	instantiation.

	* xref_lib.adb: Add pragma Warnings (Off) to avoid new warnings

        * sem_warn.ads, sem_warn.adb (Set_Warning_Switch): Add processing for
	-gnatwq/Q.
	(Warn_On_Useless_Assignment): Suppress warning if enclosing inner
	exception handler.
	(Output_Obsolescent_Entity_Warnings): Rewrite to avoid any messages on
	use clauses, to avoid messages on packages used to qualify, and also
	to avoid messages from obsolescent units.
	(Warn_On_Useless_Assignments): Don't generate messages for imported
	and exported variables.
	(Warn_On_Useless_Assignments): New procedure
	(Output_Obsolescent_Entity_Warnings): New procedure
	(Check_Code_Statement): New procedure

        * einfo.ads, einfo.adb (Has_Static_Discriminants): New flag
	Change name Is_Ada_2005 to Is_Ada_2005_Only
	(Last_Assignment): New field for useless assignment warning

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]