When an indexed reference to a packed array is expanded, it is rewritten as
a boolean operation on the prefix that denotes the packed array. If the prefix
is a function call it must not be reanalyzed, because it will have been expanded
already. and may carry extra actuals for accessibility checks.

No simple example available.

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

2011-08-31  Ed Schonberg  <schonb...@adacore.com>

        * exp_pakd.adb (Convert_To_PAT_Type): If prefix is a function call, do
        not reanalyze it.

Index: exp_pakd.adb
===================================================================
--- exp_pakd.adb        (revision 178358)
+++ exp_pakd.adb        (working copy)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2010, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -702,7 +702,9 @@
       --  see Reset_Packed_Prefix. On the other hand, if the prefix is a simple
       --  array reference, reanalysis can produce spurious type errors when the
       --  PAT type is replaced again with the original type of the array. Same
-      --  for the case of a dereference. The following is correct and minimal,
+      --  for the case of a dereference. Ditto for function calls: expansion
+      --  may introduce additional actuals which will trigger errors if call
+      --  is reanalyzed. The following is correct and minimal,
       --  but the handling of more complex packed expressions in actuals is
       --  confused. Probably the problem only remains for actuals in calls.
 
@@ -713,6 +715,7 @@
            (Nkind (Aexp) = N_Indexed_Component
              and then Is_Entity_Name (Prefix (Aexp)))
         or else Nkind (Aexp) = N_Explicit_Dereference
+        or else Nkind (Aexp) = N_Function_Call
       then
          Set_Analyzed (Aexp);
       end if;

Reply via email to