OSDN Git Service

2009-08-17 Robert Dewar <dewar@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / expander.adb
index 1c732ce..674137d 100644 (file)
@@ -6,18 +6,17 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2006, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2008, 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- --
--- ware  Foundation;  either version 2,  or (at your option) any later ver- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
 -- for  more details.  You should have  received  a copy of the GNU General --
--- Public License  distributed with GNAT;  see file COPYING.  If not, write --
--- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
--- Boston, MA 02110-1301, USA.                                              --
+-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
+-- http://www.gnu.org/licenses for a complete copy of the license.          --
 --                                                                          --
 -- GNAT was originally developed  by the GNAT team at  New York University. --
 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
@@ -55,10 +54,10 @@ package body Expander is
    -- Local Data --
    ----------------
 
-   --  The following table is used to save values of the Expander_Active
-   --  flag when they are saved by Expander_Mode_Save_And_Set. We use an
-   --  extendible table (which is a bit of overkill) because it is easier
-   --  than figuring out a maximum value or bothering with range checks!
+   --  The following table is used to save values of the Expander_Active flag
+   --  when they are saved by Expander_Mode_Save_And_Set. We use an extendible
+   --  table (which is a bit of overkill) because it is easier than figuring
+   --  out a maximum value or bothering with range checks!
 
    package Expander_Flags is new Table.Table (
      Table_Component_Type => Boolean,
@@ -74,17 +73,17 @@ package body Expander is
 
    procedure Expand (N : Node_Id) is
    begin
-      --  If we were analyzing a default expression the Full_Analysis flag
-      --  must be off. If we are in expansion mode then we must be
-      --  performing a full analysis. If we are analyzing a generic then
-      --  Expansion must be off.
+      --  If we were analyzing a default expression (or other spec expression)
+      --  the Full_Analysis flag must be off. If we are in expansion mode then
+      --  we must be performing a full analysis. If we are analyzing a generic
+      --  then Expansion must be off.
 
       pragma Assert
-        (not (Full_Analysis and then In_Default_Expression)
-         and then (Full_Analysis or else not Expander_Active)
-         and then not (Inside_A_Generic and then Expander_Active));
+        (not (Full_Analysis and then In_Spec_Expression)
+          and then (Full_Analysis or else not Expander_Active)
+          and then not (Inside_A_Generic and then Expander_Active));
 
-      --  There are three reasons for the Expander_Active flag to be false.
+      --  There are three reasons for the Expander_Active flag to be false
       --
       --  The first is when are not generating code. In this mode the
       --  Full_Analysis flag indicates whether we are performing a complete
@@ -93,19 +92,18 @@ package body Expander is
       --  info on this.
       --
       --  The second reason for the Expander_Active flag to be False is that
-      --  we are performing a pre-analysis. During pre-analysis all
-      --  expansion activity is turned off to make sure nodes are
-      --  semantically decorated but no extra nodes are generated.  This is
-      --  for instance needed for the first pass of aggregate semantic
-      --  processing. Note that in this case the Full_Analysis flag is set
-      --  to False because the node will subsequently be re-analyzed with
-      --  expansion on (see the spec of sem).
+      --  we are performing a pre-analysis. During pre-analysis all expansion
+      --  activity is turned off to make sure nodes are semantically decorated
+      --  but no extra nodes are generated. This is for instance needed for
+      --  the first pass of aggregate semantic processing. Note that in this
+      --  case the Full_Analysis flag is set to False because the node will
+      --  subsequently be re-analyzed with expansion on (see the spec of sem).
 
       --  Finally, expansion is turned off in a regular compilation if there
       --  are serious errors. In that case there will be no further expansion,
       --  but one cleanup action may be required: if a transient scope was
-      --  created (e.g. for a function that returns an unconstrained type)
-      --  the scope may still be on the stack, and must be removed explicitly,
+      --  created (e.g. for a function that returns an unconstrained type) the
+      --  scope may still be on the stack, and must be removed explicitly,
       --  given that the expansion actions that would normally process it will
       --  not take place. This prevents cascaded errors due to stack mismatch.
 
@@ -129,8 +127,8 @@ package body Expander is
          Debug_A_Entry ("expanding  ", N);
 
          --  Processing depends on node kind. For full details on the expansion
-         --  activity required in each case, see bodies of corresponding
-         --  expand routines
+         --  activity required in each case, see bodies of corresponding expand
+         --  routines.
 
          begin
             case Nkind (N) is
@@ -204,6 +202,9 @@ package body Expander is
                when N_Explicit_Dereference =>
                   Expand_N_Explicit_Dereference (N);
 
+               when N_Extended_Return_Statement =>
+                  Expand_N_Extended_Return_Statement (N);
+
                when N_Extension_Aggregate =>
                   Expand_N_Extension_Aggregate (N);
 
@@ -342,6 +343,9 @@ package body Expander is
                when N_Package_Renaming_Declaration =>
                   Expand_N_Package_Renaming_Declaration (N);
 
+               when N_Subprogram_Renaming_Declaration =>
+                  Expand_N_Subprogram_Renaming_Declaration (N);
+
                when N_Pragma =>
                   Expand_N_Pragma (N);
 
@@ -378,8 +382,8 @@ package body Expander is
                when N_Requeue_Statement =>
                   Expand_N_Requeue_Statement (N);
 
-               when N_Return_Statement =>
-                  Expand_N_Return_Statement (N);
+               when N_Simple_Return_Statement =>
+                  Expand_N_Simple_Return_Statement (N);
 
                when N_Selected_Component =>
                   Expand_N_Selected_Component (N);
@@ -487,9 +491,9 @@ package body Expander is
       Expander_Active := Expander_Flags.Table (Expander_Flags.Last);
       Expander_Flags.Decrement_Last;
 
-      --  Keep expander off if serious errors detected. In this case we do
-      --  not need expansion, and continued expansion may cause cascaded
-      --  errors or compiler bombs.
+      --  Keep expander off if serious errors detected. In this case we do not
+      --  need expansion, and continued expansion may cause cascaded errors or
+      --  compiler bombs.
 
       if Serious_Errors_Detected /= 0 then
          Expander_Active := False;