]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
sem_disp.adb (Find_Controlling_Arg): Examine the call node before examining its origi...
authorEd Schonberg <schonberg@adacore.com>
Mon, 15 Oct 2007 13:57:17 +0000 (15:57 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 15 Oct 2007 13:57:17 +0000 (15:57 +0200)
2007-10-15  Ed Schonberg  <schonberg@adacore.com>

* sem_disp.adb (Find_Controlling_Arg): Examine the call node before
examining its original form, to handle properly operator calls that
have been rewritten.

From-SVN: r129337

gcc/ada/sem_disp.adb

index 5924039e6f9a0b9d580df995f7df56ce5907b3e6..37eb9ed4196dd81b416b66bd9d347988fdb99e9a 100644 (file)
@@ -1132,9 +1132,21 @@ package body Sem_Disp is
          return Find_Controlling_Arg (Expression (Orig_Node));
       end if;
 
-      --  Dispatching on result case
+      --  Dispatching on result case. If expansion is disabled, the node still
+      --  has the structure of a function call. However, if the function name
+      --  is an operator and the call was given in infix form, the original
+      --  node has no controlling result and we must examine the current node.
+
+      if Nkind (N) = N_Function_Call
+        and then Present (Controlling_Argument (N))
+        and then Has_Controlling_Result (Entity (Name (N)))
+      then
+         return Controlling_Argument (N);
 
-      if Nkind (Orig_Node) = N_Function_Call
+      --  If expansion is enabled, the call may have been transformed into
+      --  an indirect call, and we need to recover the original node.
+
+      elsif Nkind (Orig_Node) = N_Function_Call
         and then Present (Controlling_Argument (Orig_Node))
         and then Has_Controlling_Result (Entity (Name (Orig_Node)))
       then