Commit 0af66bdc by Ed Schonberg Committed by Pierre-Marie de Rodat

[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.

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
parent c961d820
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> 2019-07-22 Eric Botcazou <ebotcazou@adacore.com>
* exp_attr.adb (Expand_Loop_Entry_Attribute): Copy the condition * exp_attr.adb (Expand_Loop_Entry_Attribute): Copy the condition
......
...@@ -10625,8 +10625,25 @@ package body Sem_Res is ...@@ -10625,8 +10625,25 @@ package body Sem_Res is
if Is_Access_Type (Etype (P)) then if Is_Access_Type (Etype (P)) then
T := Designated_Type (Etype (P)); T := Designated_Type (Etype (P));
Check_Fully_Declared_Prefix (T, P); Check_Fully_Declared_Prefix (T, P);
else else
T := Etype (P); 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; end if;
-- Set flag for expander if discriminant check required on a component -- Set flag for expander if discriminant check required on a component
......
2019-07-22 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/warn22.adb: New testcase.
2019-07-22 Eric Botcazou <ebotcazou@adacore.com> 2019-07-22 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/loop_invariant1.adb, gnat.dg/loop_invariant1.ads: New * gnat.dg/loop_invariant1.adb, gnat.dg/loop_invariant1.ads: New
......
-- { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment