]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Fix spurious warning emissions
authorRonan Desplanques <desplanques@adacore.com>
Mon, 21 Aug 2023 11:35:37 +0000 (13:35 +0200)
committerMarc Poulhiès <poulhies@adacore.com>
Tue, 5 Sep 2023 11:05:15 +0000 (13:05 +0200)
Before this patch, warnings handled by `Sem_Warn.Check_References` were
erroneously emitted in some cases. Here is an example of a program that,
when compiled with the `-gnatwu` switch, triggered the bug:

    procedure Main is
       package T is
          A : Integer;
       end T;
    begin
       T.A := 7;
    end Main;

The following message was emitted:

   main.adb:3:07: warning: variable "A" is never read and never assigned [-gnatwu]

This patch mitigates the issue by restricting the cases in which
`Sem_Warn.Check_References` is called for package specifications.

Note that the recursive calls in `Sem_Warn.Check_References` can be used
to convince oneself that this patch does not remove legitimate warnings
for non-library-level package specifications.

gcc/ada/

* sem_ch7.adb (Analyze_Package_Declaration): Restrict calls to
`Sem_Warn.Check_References` and adjust comment accordingly.

gcc/ada/sem_ch7.adb

index ecb4bbe3e569f921ba21eb4dc00580dcb65fa5aa..1a49a53ad63b7c0e217c3e593b6f67641c5cf649 100644 (file)
@@ -1267,12 +1267,17 @@ package body Sem_Ch7 is
                Is_Main_Unit => Parent (N) = Cunit (Main_Unit));
          end if;
 
-         --  Warn about references to unset objects, which is straightforward
-         --  for packages with no bodies. For packages with bodies this is more
-         --  complicated, because some of the objects might be set between spec
-         --  and body elaboration, in nested or child packages, etc.
-
-         Check_References (Id);
+         --  For package declarations at the library level, warn about
+         --  references to unset objects, which is straightforward for packages
+         --  with no bodies. For packages with bodies this is more complicated,
+         --  because some of the objects might be set between spec and body
+         --  elaboration, in nested or child packages, etc. Note that the
+         --  recursive calls in Check_References will handle nested package
+         --  specifications.
+
+         if Is_Library_Level_Entity (Id) then
+            Check_References (Id);
+         end if;
       end if;
 
       --  Set Body_Required indication on the compilation unit node