home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / freeze.adb < prev    next >
Text File  |  1996-09-28  |  34KB  |  963 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                               F R E E Z E                                --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.30 $                             --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. with Atree;    use Atree;
  26. with Einfo;    use Einfo;
  27. with Elists;   use Elists;
  28. with Errout;   use Errout;
  29. with Exp_Util; use Exp_Util;
  30. with Itypes;   use Itypes;
  31. with Nlists;   use Nlists;
  32. with Nmake;    use Nmake;
  33. with Output;   use Output;
  34. with Sem;      use Sem;
  35. with Sem_Ch7;  use Sem_Ch7;
  36. with Sem_Ch8;  use Sem_Ch8;
  37. with Sem_Res;  use Sem_Res;
  38. with Sem_Util; use Sem_Util;
  39. with Sinfo;    use Sinfo;
  40. with Snames;   use Snames;
  41. with Uintp;    use Uintp;
  42.  
  43. package body Freeze is
  44.  
  45.    ----------------
  46.    -- Freeze_All --
  47.    ----------------
  48.  
  49.    --  Note: the easy coding for this procedure would be to just build a
  50.    --  single list of freeze nodes and then insert them and analyze them
  51.    --  all at once. This won't work, because the analysis of earlier freeze
  52.    --  nodes may recursively freeze types which would otherwise appear later
  53.    --  on in the freeze list. So we must analyze and expand the freeze nodes
  54.    --  as they are generated.
  55.  
  56.    procedure Freeze_All (From : Entity_Id; After : in out Node_Id) is
  57.       Loc   : constant Source_Ptr := Sloc (Last_Entity (Current_Scope));
  58.       E     : Entity_Id;
  59.       F     : Entity_Id;
  60.       Dexpr : Node_Id;
  61.  
  62.       procedure Freeze_All_Ent (From : Entity_Id; After : in out Node_Id);
  63.       --  This is the internal recursive routine that does freezing of
  64.       --  entities (but NOT the analysis of default expressions, which
  65.       --  should not be recursive, we don't want to analyze those till
  66.       --  we are sure that ALL the types are frozen).
  67.  
  68.       procedure Freeze_All_Ent
  69.         (From  : Entity_Id;
  70.          After : in out Node_Id)
  71.       is
  72.          E     : Entity_Id;
  73.          Flist : List_Id;
  74.          Lastn : Node_Id;
  75.  
  76.       begin
  77.          E := From;
  78.          while Present (E) loop
  79.             if not Is_Frozen (E) then
  80.                Flist := Freeze_Entity (E, Loc);
  81.  
  82.                if Is_Non_Empty_List (Flist) then
  83.                   Lastn := Last (Flist);
  84.                   Insert_List_After_And_Analyze (After, Flist);
  85.                   After := Lastn;
  86.                end if;
  87.  
  88.                --  If the entity is an inner package which is not a package
  89.                --  renaming, then its entities must be frozen at this point.
  90.                --  Note that such entities do NOT get frozen at the end of
  91.                --  the nested package itself (only library packages freeze).
  92.  
  93.                --  Same is true for task declarations, where anonymous records
  94.                --  created for entry parameters must be frozen.
  95.  
  96.                if Ekind (E) = E_Package
  97.                  and then No (Renamed_Object (E))
  98.                  and then not Is_Child_Unit (E)
  99.                then
  100.                   New_Scope (E);
  101.                   Install_Visible_Declarations (E);
  102.                   Install_Private_Declarations (E);
  103.  
  104.                   Freeze_All (First_Entity (E), After);
  105.  
  106.                   End_Package_Scope (E);
  107.  
  108.                elsif Ekind (E) in Task_Kind
  109.                  and then
  110.                    (Nkind (Parent (E)) = N_Task_Type_Declaration
  111.                      or else
  112.                     Nkind (Parent (E)) = N_Single_Task_Declaration)
  113.                then
  114.                   New_Scope (E);
  115.                   Freeze_All (First_Entity (E), After);
  116.                   End_Scope;
  117.                end if;
  118.             end if;
  119.  
  120.             E := Next_Entity (E);
  121.          end loop;
  122.       end Freeze_All_Ent;
  123.  
  124.    --  Start of processing for Freeze_All
  125.  
  126.    begin
  127.       Freeze_All_Ent (From, After);
  128.  
  129.       --  Now that all types are frozen, we can analyze and resolve any
  130.       --  default expressions in subprogram specifications (we can't do
  131.       --  this earlier, because we have to wait till the types are sure
  132.       --  to be frozen).
  133.  
  134.       --  Loop through entities
  135.  
  136.       E := From;
  137.       while Present (E) loop
  138.  
  139.          if Is_Subprogram (E)
  140.            or else Ekind (E) = E_Entry
  141.            or else Ekind (E) = E_Entry_Family
  142.          then
  143.  
  144.             --  Loop through formals of one subprogram specification
  145.             --  and look for in parameters with default expressions.
  146.             --  They have been analyzed, but not frozen yet, and are
  147.             --  resolved with their own type if the context is generic,
  148.             --  to avoid anomalies with private types.
  149.  
  150.             F := First_Formal (E);
  151.             while Present (F) loop
  152.                if Ekind (F) = E_In_Parameter then
  153.                   Dexpr := Default_Value (F);
  154.  
  155.                   if Present (Dexpr) then
  156.                      Analyze (Dexpr);
  157.  
  158.                      if Ekind (Scope (E)) = E_Generic_Package then
  159.                         Resolve (Dexpr, Etype (Dexpr));
  160.                      else
  161.                         Resolve (Dexpr, Etype (F));
  162.                      end if;
  163.                   end if;
  164.                end if;
  165.  
  166.                F := Next_Formal (F);
  167.             end loop;
  168.          end if;
  169.  
  170.          E := Next_Entity (E);
  171.       end loop;
  172.  
  173.    end Freeze_All;
  174.  
  175.    -------------------
  176.    -- Freeze_Before --
  177.    -------------------
  178.  
  179.    procedure Freeze_Before (N : Node_Id; T : Entity_Id) is
  180.       Freeze_Nodes : constant List_Id := Freeze_Entity (T, Sloc (N));
  181.       F            : Node_Id;
  182.  
  183.    begin
  184.       F := First (Freeze_Nodes);
  185.  
  186.       if Present (F) then
  187.  
  188.          if Nkind (N) = N_Object_Declaration then
  189.  
  190.             --  Implicit types are transfered into the Freeze Node because
  191.             --  they may be frozen here!
  192.  
  193.             Transfer_Itypes (From => N, To => F);
  194.          end if;
  195.  
  196.          Insert_Actions (N, Freeze_Nodes);
  197.       end if;
  198.    end Freeze_Before;
  199.  
  200.    -------------------
  201.    -- Freeze_Entity --
  202.    -------------------
  203.  
  204.    function Freeze_Entity (E : Entity_Id; Loc : Source_Ptr) return List_Id is
  205.       Comp    : Entity_Id;
  206.       Elmt    : Elmt_Id;
  207.       F_Node  : Node_Id;
  208.       Op_List : Elist_Id;
  209.       Result  : List_Id;
  210.       Subp    : Entity_Id;
  211.       Indx    : Node_Id;
  212.       Formal  : Entity_Id;
  213.  
  214.       procedure Freeze_Aux (Frst : Entity_Id);
  215.       --  Freeze the given entity when it must be frozen before or after the
  216.       --  current entity (makes a recursive call to Freeze_Entity and then
  217.       --  appends the result to the current freeze list).
  218.  
  219.       procedure Freeze_Aux (Frst : Entity_Id) is
  220.       begin
  221.          Append_List (Freeze_Entity (Frst, Loc), Result);
  222.       end Freeze_Aux;
  223.  
  224.    --  Start of processing for Freeze_Entity
  225.  
  226.    begin
  227.       --  Do not freeze if already frozen since we only need one freeze node.
  228.  
  229.       if Is_Frozen (E) then
  230.          return Empty_List;
  231.       end if;
  232.  
  233.       --  Here to freeze the entity
  234.  
  235.       Result := New_List;
  236.       Set_Is_Frozen (E);
  237.  
  238.       --  Case of entity being frozen is other than a type
  239.  
  240.       if not Is_Type (E) then
  241.  
  242.          --  For a subprogram, freeze all parameter types and also the return
  243.          --  type (RM 13.14(13)). However skip this for internal subprograms.
  244.  
  245.          if Is_Subprogram (E) then
  246.             if not Is_Internal (E) then
  247.                Formal := First_Formal (E);
  248.                while Present (Formal) loop
  249.                   Freeze_Aux (Etype (Formal));
  250.                   Formal := Next_Formal (Formal);
  251.                end loop;
  252.  
  253.                Freeze_Aux (Etype (E));
  254.             end if;
  255.  
  256.          --  If entity has a type, freeze it first (RM 13.14(10))
  257.  
  258.          elsif Present (Etype (E)) then
  259.             Freeze_Aux (Etype (E));
  260.          end if;
  261.  
  262.       --  Case of a type or subtype being frozen
  263.  
  264.       else
  265.          Check_Compile_Time_Size (E);
  266.  
  267.          --  For a subtype, freeze the base type of the entity before freezing
  268.          --  the entity itself, (RM 13.14(14)).
  269.  
  270.          if E /= Base_Type (E) then
  271.             Freeze_Aux (Base_Type (E));
  272.  
  273.          --  For a derived type, freeze its parent type first (RM 13.14(14))
  274.  
  275.          elsif Is_Derived_Type (E) then
  276.             Freeze_Aux (Etype (E));
  277.          end if;
  278.  
  279.          --  For array type, freeze index types and component type first
  280.          --  before freezing the array (RM 13.14(14)).
  281.  
  282.          if Is_Array_Type (E) then
  283.             Freeze_Aux (Component_Type (E));
  284.  
  285.             Indx := First_Index (E);
  286.             while Present (Indx) loop
  287.                Freeze_Aux (Etype (Indx));
  288.                Indx := Next_Index (Indx);
  289.             end loop;
  290.  
  291.          --  For a class wide type, the corresponding specific type is
  292.          --  frozen as well (RM 13.14(14))
  293.  
  294.          elsif Is_Class_Wide_Type (E) then
  295.             Freeze_Aux (Root_Type (E));
  296.  
  297.          --  For record type, freeze the all component types (RM 13.14(14).
  298.          --  We test for E_Record_Type here, rather than using Is_Record_Type,
  299.          --  because we don't want to attempt the freeze for the case of a
  300.          --  private type with record extension (we will do that later when
  301.          --  the full type is frozen).
  302.  
  303.          elsif Ekind (E) = E_Record_Type then
  304.             Comp := First_Entity (E);
  305.  
  306.             while Present (Comp) loop
  307.                Freeze_Aux (Etype (Comp));
  308.                Comp := Next_Entity (Comp);
  309.             end loop;
  310.  
  311.             --  Tagged records
  312.  
  313.             if Is_Tagged_Type (E)
  314.               and then Ekind (E) = E_Record_Type
  315.             then
  316.  
  317.                --  This is also an opportunity for some semantic checks on
  318.                --  primitive subprograms of the type. In particular this is
  319.                --  where we check that all abstract subprograms have been
  320.                --  overridden as required, and that we have not overridden
  321.                --  a non-abstract subprogram with an abstract one incorrectly.
  322.  
  323.                Op_List := Primitive_Operations (E);
  324.  
  325.                --  Loop to check primitive operations
  326.  
  327.                Elmt := First_Elmt (Op_List);
  328.                while Present (Elmt) loop
  329.                   Subp := Node (Elmt);
  330.  
  331.                   if Is_Abstract (Subp) and then not Is_Abstract (E) then
  332.                      if Present (Alias (Subp)) then
  333.                         Error_Msg_NE
  334.                           ("type must be declared abstract or & overriden",
  335.                            E, Subp);
  336.                      else
  337.                         Error_Msg_NE
  338.                           ("non-abstract type has abstract subprogram&",
  339.                            E, Subp);
  340.                      end if;
  341.                   end if;
  342.  
  343.                   --  Usually inherited primitives are not delayed but the
  344.                   --  first Ada extension of a CPP_Class is an exception
  345.                   --  since the address of the inherited subprogram has to
  346.                   --  be inserted in the new Ada Dispatch Table and this is
  347.                   --  a freezing action (usually the inherited primitive
  348.                   --  address is inserted in the DT by Inherit_DT)
  349.  
  350.                   if  Is_CPP_Class (Etype (E))
  351.                     and then not Is_CPP_Class (E)
  352.                     and then Present (Alias (Subp))
  353.                   then
  354.                      Set_Has_Delayed_Freeze (Subp);
  355.                   end if;
  356.  
  357.                   Elmt := Next_Elmt (Elmt);
  358.                end loop;
  359.             end if;
  360.  
  361.          --  For a concurrent type, freeze corresponding record type. This
  362.          --  does not correpond to any specific rule in the RM, but the
  363.          --  record type is essentially part of the concurrent type.
  364.          --  Freeze as well all local entities. This includes record types
  365.          --  created for entry parameter blocks, and whatever local entities
  366.          --  may appear in the private part.
  367.  
  368.          elsif Is_Concurrent_Type (E) then
  369.             if Present (Corresponding_Record_Type (E)) then
  370.                Freeze_Aux (Corresponding_Record_Type (E));
  371.             end if;
  372.  
  373.             Comp := First_Entity (E);
  374.  
  375.             while Present (Comp) loop
  376.                Freeze_Aux (Etype (Comp));
  377.                Comp := Next_Entity (Comp);
  378.             end loop;
  379.  
  380.          --  For enumeration type, freeze type of literal table and table
  381.          --  itself before we freeze the enumeration type if one exists.
  382.          --  Again, this does not correspond to any specific rule in the RM,
  383.          --  but the table is an essentially part of the enumeration type.
  384.  
  385.          elsif Is_Enumeration_Type (E) then
  386.             if Present (Lit_Name_Table (E)) then
  387.                Freeze_Aux (Lit_Name_Table (E));
  388.             end if;
  389.  
  390.          --  Private types are required to point to the same freeze node
  391.          --  as their corresponding full views. The freeze node itself
  392.          --  has to point to the partial view of the entity (because
  393.          --  from the partial view, we can retrieve the full view, but
  394.          --  not the reverse). However, in order to freeze correctly,
  395.          --  we need to freeze the full view. If we are freezing at the
  396.          --  end of a scope (or within the scope of the private type),
  397.          --  the partial and full views will have been swapped, the
  398.          --  full view appears first in the entity chain and the swapping
  399.          --  mechanism enusres that the pointers are properly set (on
  400.          --  scope exit.
  401.  
  402.          --  If we encounter the full view before the private view
  403.          --  (e.g. when freezing from another scope), we freeze the
  404.          --  full view, and then set the pointers appropriately since
  405.          --  we cannot rely swapping to fix things up (subtypes in an
  406.          --  outer scope might not get swapped).
  407.  
  408.          elsif Is_Incomplete_Or_Private_Type (E) then
  409.  
  410.             --  Case of full view present
  411.  
  412.             if Present (Full_View (E)) then
  413.  
  414.                --  If full view has already been frozen, then no
  415.                --  further processing is required
  416.  
  417.                if Is_Frozen (Full_View (E)) then
  418.                   return Result;
  419.  
  420.                --  Otherwise freeze full view and patch the pointers
  421.  
  422.                else
  423.                   Freeze_Aux (Full_View (E));
  424.  
  425.                   if Has_Delayed_Freeze (E) then
  426.                      F_Node := Freeze_Node (Full_View (E));
  427.                      Set_Freeze_Node (E, F_Node);
  428.                      Set_Entity (F_Node, E);
  429.                   end if;
  430.  
  431.                   return Result;
  432.                end if;
  433.  
  434.             --  Case of no full view present, freeze the partial view!
  435.  
  436.             else
  437.                null;
  438.             end if;
  439.  
  440.          elsif Ekind (E) = E_Subprogram_Type then
  441.             Formal := First_Formal (E);
  442.             while Present (Formal) loop
  443.                Freeze_Aux (Etype (Formal));
  444.                Formal := Next_Formal (Formal);
  445.             end loop;
  446.          end if;
  447.  
  448.          --  Generic types are never seen by the back-end, and are also not
  449.          --  processed by the expander (since the expander is turned off for
  450.          --  generic processing), so we never need freeze nodes for them.
  451.  
  452.          if Is_Generic_Type (E) then
  453.             return Result;
  454.          end if;
  455.       end if;
  456.  
  457.       --  Here is where we logically freeze the current entity. If it has a
  458.       --  freeze node, then this is the point at which the freeze node is
  459.       --  linked into the result list.
  460.  
  461.       if Has_Delayed_Freeze (E) then
  462.  
  463.          --  If a freeze node is already allocated, use it, otherwise allocate
  464.          --  a new one. The preallocation happens in the case of anonymous base
  465.          --  types, where we preallocate so that we can set First_Subtype_Link.
  466.          --  Note that we reset the Sloc to the current freeze location.
  467.  
  468.          if Present (Freeze_Node (E)) then
  469.             F_Node := Freeze_Node (E);
  470.             Set_Sloc (F_Node, Loc);
  471.  
  472.          else
  473.             F_Node := New_Node (N_Freeze_Entity, Loc);
  474.             Set_Freeze_Node (E, F_Node);
  475.             Set_TSS_Elist (F_Node, No_Elist);
  476.             Set_Actions (F_Node, No_List);
  477.          end if;
  478.  
  479.          Set_Entity (F_Node, E);
  480.          Append (F_Node, Result);
  481.  
  482.       end if;
  483.  
  484.       --  Freeze the first subtype of a type after the type. This has to be
  485.       --  done after freezing the type, since obviously the first subtype
  486.       --  depends on its own base type.
  487.  
  488.       if Is_Type (E) then
  489.          Freeze_Aux (First_Subtype (E));
  490.  
  491.          --  If we just froze a tagged non-class wide record, then freeze the
  492.          --  corresponding class-wide type. This must be done after the tagged
  493.          --  type itself is frozen, because the class-wide type refers to the
  494.          --  tagged type which generates the class.
  495.  
  496.          if Is_Tagged_Type (E)
  497.            and then not Is_Class_Wide_Type (E)
  498.            and then Present (Class_Wide_Type (E))
  499.          then
  500.             Freeze_Aux (Class_Wide_Type (E));
  501.          end if;
  502.       end if;
  503.  
  504.       return Result;
  505.  
  506.    end Freeze_Entity;
  507.  
  508.    -----------------------
  509.    -- Freeze_Expression --
  510.    -----------------------
  511.  
  512.    procedure Freeze_Expression (N : Node_Id) is
  513.       Typ       : Entity_Id;
  514.       Nam       : Entity_Id;
  515.       Desig_Typ : Entity_Id;
  516.       P         : Node_Id;
  517.       Parent_P  : Node_Id;
  518.       Null_Stmt : Node_Id;
  519.       In_Init   : Boolean := False;
  520.  
  521.       function In_Init_Proc (N : Node_Id) return Boolean;
  522.       --  Given an N_Handled_Sequence_Of_Statemens node N, determines whether
  523.       --  it is the handled statement sequence of an expander generated
  524.       --  initialization procedure, and if so returns True and also sets
  525.       --  In_Init to True. Otherwise returns False and In_Init is unchanged.
  526.  
  527.       function In_Init_Proc (N : Node_Id) return Boolean is
  528.          P : Node_Id;
  529.  
  530.       begin
  531.          if Nkind (N) = N_Subprogram_Body then
  532.             P := N;
  533.          else
  534.             P := Parent (N);
  535.          end if;
  536.  
  537.          if Nkind (P) /= N_Subprogram_Body then
  538.             return False;
  539.  
  540.          else
  541.             P := Defining_Unit_Name (Specification (P));
  542.  
  543.             if Nkind (P) = N_Defining_Identifier
  544.               and then Chars (P) = Name_uInit_Proc
  545.             then
  546.                --  Make a note of it.
  547.  
  548.                In_Init := True;
  549.                return True;
  550.             else
  551.                return False;
  552.             end if;
  553.          end if;
  554.  
  555.       end In_Init_Proc;
  556.  
  557.    --  Start of processing for Freeze_Expression
  558.  
  559.    begin
  560.       --  If expression is non-static, then it does not freeze in a default
  561.       --  expression, see section "Handling of Default Expressions" in the
  562.       --  spec of package Sem for further details. Note that we have to
  563.       --  make sure that we actually have a real expression (if we have
  564.       --  a subtype indication, we can't test Is_Static_Expression!)
  565.  
  566.       if In_Default_Expression
  567.         and then Nkind (N) in N_Subexpr
  568.         and then not Is_Static_Expression (N)
  569.       then
  570.          return;
  571.       end if;
  572.  
  573.       --  Freeze type of expression if not frozen already
  574.  
  575.       if Nkind (N) in N_Has_Etype
  576.         and then not Is_Frozen (Etype (N))
  577.       then
  578.          Typ := Etype (N);
  579.       else
  580.          Typ := Empty;
  581.       end if;
  582.  
  583.       --  For entity name, freeze entity if not frozen already. A special
  584.       --  exception occurs for an identifier that did not come from source.
  585.       --  We don't let such identifiers freeze a non-internal entity, i.e.
  586.       --  an entity that did come from source, since such an identifier was
  587.       --  generated by the expander, and cannot have any semantic effect on
  588.       --  the freezing semantics. For example, this stops the parameter of
  589.       --  an initialization procedure from freezing the variable.
  590.  
  591.       if Is_Entity_Name (N)
  592.         and then not Is_Frozen (Entity (N))
  593.         and then (Nkind (N) /= N_Identifier
  594.                    or else Comes_From_Source (N)
  595.                    or else not Comes_From_Source (Entity (N)))
  596.       then
  597.          Nam := Entity (N);
  598.  
  599.          --  A special adjustment. If the expression is an identifier that
  600.          --  did not come from the source program, then don't let it
  601.          --  internal entity
  602.          --  non-internal
  603.  
  604.  
  605.       else
  606.          Nam := Empty;
  607.       end if;
  608.  
  609.       --  For an allocator, freeze designated type if not frozen already
  610.  
  611.       if Nkind (N) = N_Allocator
  612.         and then not Is_Frozen (Designated_Type (Etype (N)))
  613.       then
  614.          Desig_Typ := Designated_Type (Etype (N));
  615.       else
  616.          Desig_Typ := Empty;
  617.       end if;
  618.  
  619.       --  All done if nothing needs freezing
  620.  
  621.       if No (Typ)
  622.         and then No (Nam)
  623.         and then No (Desig_Typ)
  624.       then
  625.          return;
  626.       end if;
  627.  
  628.       --  Loop for looking at the right place to insert the freeze nodes
  629.       --  exiting from the loop when it is appropriate to insert the freeze
  630.       --  node before the current node P.
  631.  
  632.       --  Also checks some special exceptions to the freezing rules. These
  633.       --  cases result in a direct return, bypassing the freeze action.
  634.  
  635.       P := N;
  636.       loop
  637.          Parent_P := Parent (P);
  638.  
  639.          --  If we don't have a parent, then we are not in a well-formed
  640.          --  tree. This is an unusual case, but there are some legitimate
  641.          --  situations in which this occurs, notably when the expressions
  642.          --  in the range of a type declaration are resolved. We simply
  643.          --  ignore the freeze request in this case. Is this right ???
  644.  
  645.          if No (Parent_P) then
  646.             return;
  647.          end if;
  648.  
  649.          --  See if we have got to an appropriate point in the tree
  650.  
  651.          case Nkind (Parent_P) is
  652.  
  653.             --  A special test for the exception of (RM 13.14(8)) for the
  654.             --  case of per-object expressions (RM 3.8(18)) occurring in a
  655.             --  component definition or a discrete subtype definition. Note
  656.             --  that we test for a component declaration which includes both
  657.             --  cases we are interested in, and furthermore the tree does not
  658.             --  have explicit nodes for either of these two constructs.
  659.  
  660.             when N_Component_Declaration =>
  661.  
  662.                --  The case we want to test for here is an identifier that is
  663.                --  a per-object expression, this is either a discriminant that
  664.                --  appears in a context other than the component declaration
  665.                --  or it is a reference to the type of the enclosing construct.
  666.  
  667.                --  For either of these cases, we skip the freezing
  668.  
  669.                if not In_Default_Expression
  670.                  and then Nkind (N) = N_Identifier
  671.                  and then (Present (Entity (N)))
  672.                then
  673.                   --  We recognize the discriminant case by just looking for
  674.                   --  a reference to a discriminant. It can only be one for
  675.                   --  the enclosing construct. Skip freezing in this case.
  676.  
  677.                   if Ekind (Entity (N)) = E_Discriminant then
  678.                      return;
  679.  
  680.                   --  For the case of a reference to the enclosing record,
  681.                   --  (or task or protected type), we look for a type that
  682.                   --  matches the current scope.
  683.  
  684.                   elsif Entity (N) = Current_Scope then
  685.                      return;
  686.                   end if;
  687.                end if;
  688.  
  689.             --  If we have an enumeration literal that appears as the
  690.             --  choice in the aggregate of an enumeration representation
  691.             --  clause, then freezing does not occur (RM 13.14(9)).
  692.  
  693.             when N_Enumeration_Representation_Clause =>
  694.  
  695.                --  The case we are looking for is an enumeration literal
  696.  
  697.                if Nkind (N) = N_Identifier
  698.                  and then Is_Enumeration_Type (Etype (N))
  699.                then
  700.                   --  If enumeration literal appears directly as the choice,
  701.                   --  do not freeze (this is the normal non-overloade case)
  702.  
  703.                   if Nkind (Parent (N)) = N_Component_Association
  704.                     and then First (Choices (Parent (N))) = N
  705.                   then
  706.                      return;
  707.  
  708.                   --  If enumeration literal appears as the name of a
  709.                   --  function which is the choice, then also do not freeze.
  710.                   --  This happens in the overloaded literal case, where the
  711.                   --  enumeration literal is temporarily changed to a function
  712.                   --  call for overloading analysis purposes.
  713.  
  714.                   elsif Nkind (Parent (N)) = N_Function_Call
  715.                      and then Nkind (Parent (Parent (N))) =
  716.                                         N_Component_Association
  717.                      and then First (Choices (Parent (Parent (N)))) =
  718.                                         Parent (N)
  719.                   then
  720.                      return;
  721.                   end if;
  722.                end if;
  723.  
  724.             --  Normally if the parent is a handled sequence of statements,
  725.             --  or a subprogram body ???
  726.             --  then the current node must be a statement, and that is an
  727.             --  appropriate place to insert a freeze node.
  728.  
  729.             when N_Subprogram_Body                |
  730.                  N_Handled_Sequence_Of_Statements =>
  731.  
  732.                --  The exception occurs when the sequence of statements is
  733.                --  for an initialization procedure, in this case we want to
  734.                --  freeze outside this body, not inside it.
  735.  
  736.                exit when not In_Init_Proc (Parent_P);
  737.  
  738.             --  If parent is a body or a spec or a block, the the current
  739.             --  node is a statement or declaration and we can insert the
  740.             --  freeze node before it.
  741.  
  742.             when N_Package_Specification |
  743.                  N_Package_Body          |
  744.                  N_Task_Body             |
  745.                  N_Protected_Body        |
  746.                  N_Entry_Body            |
  747.                  N_Block_Statement       => exit;
  748.  
  749.             --  The expander is allowed to define types in any statements list,
  750.             --  so any of the following parent nodes also mark a freezing point
  751.             --  if the actual node is in a list of statements or declarations.
  752.  
  753.             when N_Exception_Handler          |
  754.                  N_If_Statement               |
  755.                  N_Elsif_Part                 |
  756.                  N_Case_Statement_Alternative |
  757.                  N_Loop_Statement             |
  758.                  N_Selective_Accept           |
  759.                  N_Accept_Alternative         |
  760.                  N_Delay_Alternative          |
  761.                  N_Conditional_Entry_Call     |
  762.                  N_Entry_Call_Alternative     |
  763.                  N_Triggering_Alternative     |
  764.                  N_Abortable_Part             =>
  765.  
  766.                exit when Is_List_Member (P);
  767.  
  768.             --  If the type is defined inside an expression-action and the
  769.             --  expression uses this type, freeze it at the end of the action
  770.             --  part. To simplify processing, just create a Null_Statement at
  771.             --  the end and freeze before this dummy node.
  772.  
  773.             when N_Expression_Actions =>
  774.                if Present (Typ)
  775.                  and then Present (Parent (Typ))
  776.                  and then Parent (Parent (Typ)) = Parent_P
  777.                then
  778.                   Null_Stmt :=
  779.                     Make_Null_Statement (Sloc (Parent_P));
  780.                   Append_To (Actions (Parent_P), Null_Stmt);
  781.                   P := Null_Stmt;
  782.                   exit;
  783.                end if;
  784.  
  785.             --  For all other cases, keep looking at parents
  786.  
  787.             when others =>
  788.                null;
  789.          end case;
  790.  
  791.          --  We fall through the case if we did not yet find the proper
  792.          --  place in the free for inserting the freeze node, so climb!
  793.  
  794.          P := Parent_P;
  795.       end loop;
  796.  
  797.       --  If the expression appears in a record or an initialization
  798.       --  procedure, the freeze nodes are collected and attached to
  799.       --  the current scope, to be inserted an analyzed on exit from
  800.       --  the scope, to insure that generated entities appear in  the
  801.       --  correct scope. If the expression is a default for a discriminant
  802.       --  specification, the scope is still void. The expression can also
  803.       --  appear in the discriminant part of a private or concurrent type.
  804.  
  805.       if (Is_Type (Current_Scope)
  806.             and then (not Is_Concurrent_Type (Current_Scope)
  807.                         or else not Has_Completion (Current_Scope)))
  808.         or else Ekind (Current_Scope) = E_Void
  809.         or else In_Init
  810.       then
  811.          declare
  812.             Loc          : constant Source_Ptr := Sloc (Current_Scope);
  813.             Freeze_Nodes : List_Id := New_List;
  814.  
  815.          begin
  816.             if Present (Desig_Typ) then
  817.                Append_List (Freeze_Entity (Desig_Typ, Loc), Freeze_Nodes);
  818.             end if;
  819.  
  820.             if Present (Typ) then
  821.                Append_List (Freeze_Entity (Typ, Loc), Freeze_Nodes);
  822.             end if;
  823.  
  824.             if Present (Nam) then
  825.                Append_List (Freeze_Entity (Nam, Loc), Freeze_Nodes);
  826.             end if;
  827.  
  828.             if not Is_Empty_List (Freeze_Nodes) then
  829.  
  830.                if No (Scope_Stack.Table
  831.                  (Scope_Stack.Last).Pending_Freeze_Nodes)
  832.                then
  833.                   Scope_Stack.Table (Scope_Stack.Last).Pending_Freeze_Nodes :=
  834.                      Freeze_Nodes;
  835.                else
  836.                   Append_List (Freeze_Nodes, Scope_Stack.Table
  837.                                    (Scope_Stack.Last).Pending_Freeze_Nodes);
  838.                end if;
  839.             end if;
  840.          end;
  841.  
  842.          return;
  843.       end if;
  844.  
  845.       --  Freeze the designated type of an allocator (RM 13.14(12))
  846.  
  847.       if Present (Desig_Typ) then
  848.          Freeze_Before (P, Desig_Typ);
  849.       end if;
  850.  
  851.       --  Freeze type of expression (RM 13.14(9)). Note that we took care of
  852.       --  the enumeration representation clause exception in the loop above.
  853.  
  854.       if Present (Typ) then
  855.          Freeze_Before (P, Typ);
  856.       end if;
  857.  
  858.       --  Freeze name if one is present (RM 13.14(10))
  859.  
  860.       if Present (Nam) then
  861.          Freeze_Before (P, Nam);
  862.       end if;
  863.  
  864.    end Freeze_Expression;
  865.  
  866.    -----------------------------
  867.    -- Check_Compile_Time_Size --
  868.    -----------------------------
  869.  
  870.    procedure Check_Compile_Time_Size (T : Entity_Id) is
  871.  
  872.       function Size_Known (T : Entity_Id) return Boolean;
  873.       --  Recursive function that does all the work.
  874.  
  875.       function Size_Known (T : Entity_Id) return Boolean is
  876.          Index : Entity_Id;
  877.          Comp  : Entity_Id;
  878.          Low   : Node_Id;
  879.          High  : Node_Id;
  880.  
  881.       begin
  882.          if Is_Scalar_Type (T) then
  883.             return not Is_Generic_Type (T);
  884.  
  885.          elsif Esize (T) /= 0 then
  886.             return True;
  887.  
  888.          elsif Is_Array_Type (T) then
  889.             if not Size_Known (Component_Type (T)) then
  890.                return False;
  891.             end if;
  892.  
  893.             Index := First_Index (T);
  894.  
  895.             while Present (Index) loop
  896.                if Nkind (Index) = N_Range then
  897.                   Get_Index_Bounds (Index, Low, High);
  898.                else
  899.                   Low  := Type_Low_Bound (Etype (Index));
  900.                   High := Type_High_Bound (Etype (Index));
  901.                end if;
  902.  
  903.                if not Is_Static_Expression (Low)
  904.                  or else not Is_Static_Expression (High)
  905.                then
  906.                   return False;
  907.                end if;
  908.  
  909.                Index := Next_Index (Index);
  910.             end loop;
  911.  
  912.             return True;
  913.  
  914.          elsif Is_Access_Type (T) then
  915.             return True;
  916.  
  917.          elsif Is_Private_Type (T)
  918.            and then not Is_Generic_Type (T)
  919.            and then Present (Underlying_Type (T))
  920.          then
  921.             return Size_Known (Underlying_Type (T));
  922.  
  923.          elsif Is_Record_Type (T) then
  924.             if Is_Class_Wide_Type (T) then
  925.                return False;
  926.  
  927.             elsif Has_Discriminants (T)
  928.               and then Present (Parent (T))
  929.               and then Nkind (Parent (T)) = N_Full_Type_Declaration
  930.               and then Nkind (Type_Definition (Parent (T)))
  931.                 = N_Record_Definition
  932.               and then not Null_Present (Type_Definition (Parent (T)))
  933.               and then Present (Variant_Part
  934.                  (Component_List (Type_Definition (Parent (T)))))
  935.             then
  936.                return False;
  937.  
  938.             else
  939.                Comp := First_Component (T);
  940.  
  941.                while Present (Comp) loop
  942.                   if not Is_Type (Comp)
  943.                     and then not Size_Known (Etype (Comp))
  944.                   then
  945.                      return False;
  946.                   end if;
  947.  
  948.                   Comp := Next_Component (Comp);
  949.                end loop;
  950.  
  951.                return True;
  952.             end if;
  953.  
  954.          else
  955.             return False;
  956.          end if;
  957.       end Size_Known;
  958.  
  959.    begin
  960.       Set_Size_Known_At_Compile_Time (T, Size_Known (T));
  961.    end Check_Compile_Time_Size;
  962. end Freeze;
  963.