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] Spurious warning about a useless assignment


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.

Tested on x86_64-pc-linux-gnu, committed on trunk

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.
--- gcc/ada/sem_res.adb
+++ gcc/ada/sem_res.adb
@@ -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

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/warn22.adb
@@ -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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]