[Ada] Spurious warning about a useless assignment
authorEd Schonberg <schonberg@adacore.com>
Mon, 22 Jul 2019 13:56:31 +0000 (13:56 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 22 Jul 2019 13:56:31 +0000 (13:56 +0000)
This patch removes a spurious warning about a useless assignment, when a
composite object is the target of an assignment and is an actual for an
out parameter in a subsewuent call, and there is an intervening use of
the object as the prefix of a selected component in an intervening
operation.

2019-07-22  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_res.adb (Resolve_Selected_Component): If the prefix has a
deferred reference, generate the correct reference now, to
indicate that the previous assignment is used.  This prevents
spurious warnings on useless assignments when compiling with all
warnings enabled. when there is a subsequent call in the same
stqtement list, in which the prefix of the selected component is
the actual for an out parameter.

gcc/testsuite/

* gnat.dg/warn22.adb: New testcase.

From-SVN: r273669

gcc/ada/ChangeLog
gcc/ada/sem_res.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/warn22.adb [new file with mode: 0644]

index 38cc4b833a07d8336c684460b778690570f8d011..c42164b0042cf2146f0c027e16652e19033d9a54 100644 (file)
@@ -1,3 +1,13 @@
+2019-07-22  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_res.adb (Resolve_Selected_Component): If the prefix has a
+       deferred reference, generate the correct reference now, to
+       indicate that the previous assignment is used.  This prevents
+       spurious warnings on useless assignments when compiling with all
+       warnings enabled. when there is a subsequent call in the same
+       stqtement list, in which the prefix of the selected component is
+       the actual for an out parameter.
+
 2019-07-22  Eric Botcazou  <ebotcazou@adacore.com>
 
        * exp_attr.adb (Expand_Loop_Entry_Attribute): Copy the condition
index 4ca74f8543c54d65596679f288e094e0c6d9cab3..fd4fedc303273cc949d9fd451ea5166454ffac3a 100644 (file)
@@ -10625,8 +10625,25 @@ package body Sem_Res is
       if Is_Access_Type (Etype (P)) then
          T := Designated_Type (Etype (P));
          Check_Fully_Declared_Prefix (T, P);
+
       else
          T := Etype (P);
+
+         --  If the prefix is an entity it may have a deferred reference set
+         --  during analysis of the selected component. After resolution we
+         --  can transform it into a proper reference. This prevents spurious
+         --  warnings on useless assignments when the same selected component
+         --  is the actual for an out parameter in a subsequent call.
+
+         if Is_Entity_Name (P)
+           and then Has_Deferred_Reference (Entity (P))
+         then
+            if May_Be_Lvalue (N) then
+               Generate_Reference (Entity (P), P, 'm');
+            else
+               Generate_Reference (Entity (P), P, 'r');
+            end if;
+         end if;
       end if;
 
       --  Set flag for expander if discriminant check required on a component
index e9c2b5e3b7dbf3a9b2b5cdfad2416d11ae243057..f8372bae4818f67250b4ca59cb38b04f4068be2b 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-22  Ed Schonberg  <schonberg@adacore.com>
+
+       * gnat.dg/warn22.adb: New testcase.
+
 2019-07-22  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/loop_invariant1.adb, gnat.dg/loop_invariant1.ads: New
diff --git a/gcc/testsuite/gnat.dg/warn22.adb b/gcc/testsuite/gnat.dg/warn22.adb
new file mode 100644 (file)
index 0000000..0a1692f
--- /dev/null
@@ -0,0 +1,34 @@
+--  { dg-do compile }
+--  { dg-options "-gnatwa" }
+
+with Ada.Text_IO;
+
+procedure Warn22
+is
+   type X is
+      record
+         Str : String (1 .. 3);
+      end record;
+
+   type T is
+      record
+         Value : X;
+      end record;
+
+   procedure Consume_Data (Item : out T) is
+   begin
+      Item := (Value => (Str => "Bar"));
+   end Consume_Data;
+
+   Baz : T;
+begin
+
+   Baz := (Value => (Str => "Foo"));
+
+   Ada.Text_IO.Put_Line (Baz.Value.Str);
+
+   Consume_Data (Baz);
+
+   Ada.Text_IO.Put_Line (Baz.Value.Str);
+
+end Warn22;