[Ada] Spurious warning on call with out parameter in expression function
authorEd Schonberg <schonberg@adacore.com>
Thu, 10 Oct 2019 15:25:13 +0000 (15:25 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 10 Oct 2019 15:25:13 +0000 (15:25 +0000)
2019-10-10  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_warn.adb (Warn_On_Useless_Assignment): Do not warn if the
second assignment is at the same source position as the first.

From-SVN: r276831

gcc/ada/ChangeLog
gcc/ada/sem_warn.adb

index 9cf5172802287fcf7bdfbea4a3921251466558ea..24c831e5b9075e6c747a6c1497c3eeab3c122784 100644 (file)
@@ -1,8 +1,4 @@
-2019-10-10  Gary Dismukes  <dismukes@adacore.com>
+2019-10-10  Ed Schonberg  <schonberg@adacore.com>
 
-       * sem_util.adb (Enclosing_Subprogram): Handle the case of
-       E_Entry_Family, returning the entry family's associated
-       Protected_Body_Subprogram (as was already done for E_Entry).
-       * exp_ch9.adb (Expand_N_Accept_Statement): Call Reset_Scopes_To
-       on the block created for an accept statement to reset the scopes
-       of any local entities to the block scope.
\ No newline at end of file
+       * sem_warn.adb (Warn_On_Useless_Assignment): Do not warn if the
+       second assignment is at the same source position as the first.
\ No newline at end of file
index f9a6062c0923ffffafc3cd5594dce20177a27193..04e7acfb65e2049cf9c37f8118ac3243a7e7ae83 100644 (file)
@@ -4546,9 +4546,15 @@ package body Sem_Warn is
       --  to capture the value. We are not going to capture any value, but
       --  the warning message depends on the same kind of conditions.
 
+      --  If the assignment appears as an out-parameter in a call within an
+      --  expression function it may be detected twice: once when expression
+      --  itself is analyzed, and once when the constructed body is analyzed.
+      --  We don't want to emit a spurious warning in this case.
+
       if Is_Assignable (Ent)
         and then not Is_Return_Object (Ent)
         and then Present (Last_Assignment (Ent))
+        and then Last_Assignment (Ent) /= N
         and then not Is_Imported (Ent)
         and then not Is_Exported (Ent)
         and then Safe_To_Capture_Value (N, Ent)