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 / sem_attr.adb < prev    next >
Text File  |  1996-09-28  |  136KB  |  4,572 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             S E M _ A T T R                              --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.259 $                            --
  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 Ada.Characters.Latin_1; use Ada.Characters.Latin_1;
  26.  
  27. with Atree;    use Atree;
  28. with Checks;   use Checks;
  29. with Einfo;    use Einfo;
  30. with Errout;   use Errout;
  31. with Eval_Fat;
  32. with Exp_TSS;  use Exp_TSS;
  33. with Exp_Util; use Exp_Util;
  34. with Features; use Features;
  35. with Fname;    use Fname;
  36. with Freeze;   use Freeze;
  37. with Lib;      use Lib;
  38. with Lib.Load; use Lib.Load;
  39. with Namet;    use Namet;
  40. with Nlists;   use Nlists;
  41. with Nmake;    use Nmake;
  42. with Opt;      use Opt;
  43. with Output;   use Output;
  44. with Rtsfind;  use Rtsfind;
  45. with Sem;      use Sem;
  46. with Sem_Ch6;  use Sem_Ch6;
  47. with Sem_Ch8;  use Sem_Ch8;
  48. with Sem_Dist; use Sem_Dist;
  49. with Sem_Eval; use Sem_Eval;
  50. with Sem_Res;  use Sem_Res;
  51. with Sem_Type; use Sem_Type;
  52. with Sem_Util; use Sem_Util;
  53. with Stand;    use Stand;
  54. with Sinfo;    use Sinfo;
  55. with Sinput;   use Sinput;
  56. with Stand;
  57. with Stringt;  use Stringt;
  58. with Table;
  59. with Ttypes;   use Ttypes;
  60. with Ttypef;   use Ttypef;
  61. with Tbuild;   use Tbuild;
  62. with Uintp;    use Uintp;
  63. with Uname;    use Uname;
  64. with Urealp;   use Urealp;
  65. with Widechar; use Widechar;
  66.  
  67. package body Sem_Attr is
  68.  
  69.    Bad_Attribute : exception;
  70.    --  Exception raised if an error is detected during attribute processing,
  71.    --  used so that we can abandon the processing so we don't run into
  72.    --  trouble with cascaded errors.
  73.  
  74.    --  The following array is the list of attributes defined in the Ada 83 RM
  75.  
  76.    Attribute_83 : Attribute_Class_Array := Attribute_Class_Array'(
  77.       Attribute_Address           |
  78.       Attribute_Aft               |
  79.       Attribute_Alignment         |
  80.       Attribute_Base              |
  81.       Attribute_Callable          |
  82.       Attribute_Constrained       |
  83.       Attribute_Count             |
  84.       Attribute_Delta             |
  85.       Attribute_Digits            |
  86.       Attribute_Emax              |
  87.       Attribute_Epsilon           |
  88.       Attribute_First             |
  89.       Attribute_First_Bit         |
  90.       Attribute_Fore              |
  91.       Attribute_Image             |
  92.       Attribute_Large             |
  93.       Attribute_Last              |
  94.       Attribute_Last_Bit          |
  95.       Attribute_Leading_Part      |
  96.       Attribute_Length            |
  97.       Attribute_Machine_Emax      |
  98.       Attribute_Machine_Emin      |
  99.       Attribute_Machine_Mantissa  |
  100.       Attribute_Machine_Overflows |
  101.       Attribute_Machine_Radix     |
  102.       Attribute_Machine_Rounds    |
  103.       Attribute_Mantissa          |
  104.       Attribute_Pos               |
  105.       Attribute_Position          |
  106.       Attribute_Pred              |
  107.       Attribute_Range             |
  108.       Attribute_Safe_Emax         |
  109.       Attribute_Safe_Large        |
  110.       Attribute_Safe_Small        |
  111.       Attribute_Size              |
  112.       Attribute_Small             |
  113.       Attribute_Storage_Size      |
  114.       Attribute_Succ              |
  115.       Attribute_Terminated        |
  116.       Attribute_Val               |
  117.       Attribute_Value             |
  118.       Attribute_Width             => True,
  119.       others                      => False);
  120.  
  121.    function In_Generic_Unit return Boolean;
  122.    --  Utility do determine whether we are within a generic unit. Used to
  123.    --  validate and evaluate 'Definite.
  124.  
  125.    -----------------------
  126.    -- Analyze_Attribute --
  127.    -----------------------
  128.  
  129.    procedure Analyze_Attribute (N : Node_Id) is
  130.       Loc     : constant Source_Ptr   := Sloc (N);
  131.       Aname   : constant Name_Id      := Attribute_Name (N);
  132.       P       : constant Node_Id      := Prefix (N);
  133.       Exprs   : constant List_Id      := Expressions (N);
  134.       Attr_Id : constant Attribute_Id := Get_Attribute_Id (Aname);
  135.       E1      : Node_Id;
  136.       E2      : Node_Id;
  137.  
  138.       P_Type : Entity_Id;
  139.       --  Type of prefix after analysis
  140.  
  141.       P_Base_Type : Entity_Id;
  142.       --  Base type of prefix after analysis
  143.  
  144.       P_Root_Type : Entity_Id;
  145.       --  Root type of prefix after analysis
  146.  
  147.       Unanalyzed  : Node_Id;
  148.  
  149.       -----------------------
  150.       -- Local Subprograms --
  151.       -----------------------
  152.  
  153.       procedure Access_Attribute;
  154.       --  Used for Access, Unchecked_Access, Unrestricted_Access attributes.
  155.       --  Internally, Id distinguishes which of the three cases is involved.
  156.  
  157.       procedure Check_Array_Or_Scalar_Type;
  158.       --  Common procedure used by First, Last, Range attribute to check
  159.       --  that the prefix is a constrained array or scalar type, or a name
  160.       --  of an array object, and that an argument appears only if appropriate
  161.       --  (i.e. only in the array case).
  162.  
  163.       procedure Check_Array_Type;
  164.       --  Common semantic checks for all array attributes. Checks that the
  165.       --  prefix is a constrained array type or the name of an array object.
  166.  
  167.       procedure Check_Component;
  168.       --  Common processing for First_Bit, Last_Bit and Position. Checks that
  169.       --  the prefix is an appropriate selected component.
  170.  
  171.       procedure Check_Decimal_Fixed_Point_Type;
  172.       --  Check that prefix of attribute N is a decimal fixed-point type
  173.  
  174.       procedure Check_Discrete_Attribute;
  175.       --  Common processing for attributes operating on discrete types
  176.  
  177.       procedure Check_Discrete_Type;
  178.       --  Verify that prefix of attribute N is a discrete type
  179.  
  180.       procedure Check_E0;
  181.       --  Check that no attribute arguments are present
  182.  
  183.       procedure Check_E0_Or_E1;
  184.       --  Check that at most one attribute argument is present
  185.  
  186.       procedure Check_E1;
  187.       --  Check that exactly one attribute argument is present
  188.  
  189.       procedure Check_E2;
  190.       --  Check that two attribute arguments are present
  191.  
  192.       procedure Check_Enumeration_Type;
  193.       --  Verify that prefix of attribute N is an enumeration type
  194.  
  195.       procedure Check_Fixed_Point_Type;
  196.       --  Verify that prefix of attribute N is a fixed type
  197.  
  198.       procedure Check_Fixed_Point_Type_0;
  199.       --  Verify that prefix of attribute N is a fixed type and that
  200.       --  no attribute expressions are present
  201.  
  202.       procedure Check_Floating_Point_Type;
  203.       --  Verify that prefix of attribute N is a float type
  204.  
  205.       procedure Check_Floating_Point_Type_0;
  206.       --  Verify that prefix of attribute N is a float type and that
  207.       --  no attribute expressions are present
  208.  
  209.       procedure Check_Floating_Point_Type_1;
  210.       --  Verify that prefix of attribute N is a float type and that
  211.       --  exactly one attribute expression is present
  212.  
  213.       procedure Check_Floating_Point_Type_2;
  214.       --  Verify that prefix of attribute N is a float type and that
  215.       --  two attribute expressions are present
  216.  
  217.       procedure Check_Integer_Type;
  218.       --  Verify that prefix of attribute N is an integer type
  219.  
  220.       procedure Check_Library_Unit;
  221.       --  Verify that prefix of attribute N is a library unit
  222.  
  223.       procedure Check_Object_Reference;
  224.       --  Verify that prefix of attribute N is an object reference
  225.  
  226.       procedure Check_Real_Type;
  227.       --  Verify that prefix of attribute N is fixed or float type
  228.  
  229.       procedure Check_Scalar_Type;
  230.       --  Verify that prefix of attribute N is a scalar type
  231.  
  232.       procedure Check_Standard_Prefix;
  233.       --  Verify that prefix of attribute N is package Standard
  234.  
  235.       procedure Check_Task_Prefix;
  236.       --  Verify that prefix of attribute N is a task or task type
  237.  
  238.       procedure Check_Type;
  239.       --  Verify that the prefix of attribute N is a type
  240.  
  241.       procedure Error_Attr (Msg : String; Error_Node : Node_Id);
  242.       --  Posts error using Error_Msg_N at given node, sets type of attribute
  243.       --  node to Any_Type, and then raises Bad_Attribute to avoid any further
  244.       --  semantic processing. The message typically contains a % insertion
  245.       --  character which is replaced by the attribute name.
  246.  
  247.       procedure Standard_Attribute (Val : Int);
  248.       --  Used to process attributes whose prefix is package Standard which
  249.       --  yield values of type Universal_Integer. The attribute reference
  250.       --  node is rewritten with an integer literal of the given value.
  251.  
  252.       procedure Unexpected_Argument (En : Node_Id);
  253.       --  Signal unexpected attribute argument (En is the argument)
  254.  
  255.       procedure Unimplemented_Attribute;
  256.       --  Give error message for unimplemented attribute
  257.  
  258.       procedure Validate_Non_Static_Attribute_Function_Call;
  259.       --  Called when processing an attribute that is a function call to a
  260.       --  non-static function, i.e. an attribute function that either takes
  261.       --  non-scalar arguments or returns a non-scalar result. Verifies that
  262.       --  such a call does not appear in a preelaborable context.
  263.  
  264.       ----------------------
  265.       -- Access_Attribute --
  266.       ----------------------
  267.  
  268.       procedure Access_Attribute is
  269.          Index    : Interp_Index;
  270.          It       : Interp;
  271.          Acc_Type : Entity_Id;
  272.  
  273.          function Valid_Aliased_View (Obj : Node_Id) return Boolean;
  274.          --  Determine if Obj is a valid aliased view, i.e. an appropriate
  275.          --  object to which 'Access or 'Unchecked_Access can apply.
  276.  
  277.          function Valid_Aliased_View (Obj : Node_Id) return Boolean is
  278.             E : Entity_Id;
  279.  
  280.          begin
  281.             if Is_Entity_Name (Obj) then
  282.                E := Entity (Obj);
  283.  
  284.                return Is_Aliased (E)
  285.                  or else (Present (Renamed_Object (E))
  286.                            and then Valid_Aliased_View (Renamed_Object (E)))
  287.  
  288.                  or else ((Ekind (E) = E_In_Out_Parameter
  289.                              or else Ekind (E) = E_Out_Parameter
  290.                              or else Ekind (E) = E_Generic_In_Out_Parameter)
  291.                            and then Is_Tagged_Type (Etype (E)))
  292.  
  293.                   --  Note: The above should really be as follows, but
  294.                   --  mode in parameters are disallowed until constant
  295.                   --  access rules are properly checked???:
  296.                   --
  297.                   --  or else ((Ekind (E) in Formal_Kind
  298.                   --            or else Ekind (E) = E_Generic_In_Out_Parameter
  299.                   --            or else Ekind (E) = E_Generic_In_Parameter)
  300.                   --          and then Is_Tagged_Type (Etype (E)))
  301.  
  302.                  or else ((Ekind (E) = E_Task_Type
  303.                              or else Ekind (E) = E_Protected_Type)
  304.                            and then In_Open_Scopes (E))
  305.  
  306.                   --  Access discriminant constraint
  307.  
  308.                  or else (Is_Type (E) and then E = Current_Scope)
  309.                  or else (Is_Incomplete_Or_Private_Type (E)
  310.                            and then Full_View (E) = Current_Scope);
  311.  
  312.             elsif Nkind (Obj) = N_Selected_Component then
  313.                return Is_Aliased (Entity (Selector_Name (Obj)));
  314.  
  315.             elsif Nkind (Obj) = N_Indexed_Component then
  316.                return (Is_Aliased (Etype (Prefix (Obj)))
  317.                  or else Is_Access_Type (Etype (Prefix (Obj))));
  318.  
  319.             elsif Nkind (Obj) = N_Unchecked_Type_Conversion
  320.               or else Nkind (Obj) = N_Type_Conversion
  321.             then
  322.                return Is_Tagged_Type (Etype (Obj));
  323.  
  324.             elsif Nkind (Obj) = N_Explicit_Dereference then
  325.                return True;  --  more precise test needed???
  326.  
  327.             elsif Nkind (Obj) = N_Expression_Actions then
  328.                return Valid_Aliased_View (Expression (Obj));
  329.  
  330.             else
  331.                return False;
  332.             end if;
  333.          end Valid_Aliased_View;
  334.  
  335.       --  Start of processing for Access_Attribute
  336.  
  337.       begin
  338.          Check_E0;
  339.  
  340.          --  In the case of an access to subprogram, use the name of the
  341.          --  subprogram itself as the designated type. Type-checking in
  342.          --  this case compares the signatures of the designated types.
  343.  
  344.          if Is_Entity_Name (P)
  345.            and then Is_Overloadable (Entity (P))
  346.          then
  347.             if not Is_Overloaded (P) then
  348.                Acc_Type :=
  349.                  New_Internal_Entity
  350.                    (E_Access_Subprogram_Type, Current_Scope, Loc, 'A');
  351.                Set_Etype (Acc_Type,  Acc_Type);
  352.                Set_Directly_Designated_Type (Acc_Type, Entity (P));
  353.                Set_Etype (N, Acc_Type);
  354.  
  355.             else
  356.                Get_First_Interp (P, Index, It);
  357.                Set_Etype (N, Any_Type);
  358.  
  359.                while Present (It.Nam) loop
  360.                   Acc_Type :=
  361.                     New_Internal_Entity
  362.                       (E_Access_Subprogram_Type, Current_Scope, Loc, 'A');
  363.                   Set_Etype (Acc_Type,  Acc_Type);
  364.                   Set_Directly_Designated_Type (Acc_Type, It.Nam);
  365.                   Add_One_Interp (N,  Acc_Type,  Acc_Type);
  366.                   Get_Next_Interp (Index, It);
  367.                end loop;
  368.             end if;
  369.  
  370.             --  Rewrite the access attribute subtree to qualified
  371.             --  expression in case prefix is a remote subprogram
  372.  
  373.             Process_Remote_AST_Attribute (N, Unanalyzed);
  374.  
  375.          elsif (Nkind (P) = N_Selected_Component
  376.            and then Is_Overloadable (Entity (Selector_Name (P))))
  377.          then
  378.             Unimplemented (N,  "access to protected operations");
  379.  
  380.          --  Case of access to object
  381.  
  382.          else
  383.             Acc_Type := New_Internal_Entity (E_Anonymous_Access_Type,
  384.               Current_Scope, Loc, 'A');
  385.             Set_Etype (Acc_Type,  Acc_Type);
  386.             Set_Directly_Designated_Type (Acc_Type, P_Type);
  387.             Set_Etype (N, Acc_Type);
  388.  
  389.             --  Check for aliased view unless unrestricted case
  390.  
  391.             if Aname /= Name_Unrestricted_Access
  392.               and then not Valid_Aliased_View (P)
  393.             then
  394.                Error_Attr ("prefix of % attribute must be aliased", P);
  395.             end if;
  396.          end if;
  397.  
  398.       end Access_Attribute;
  399.  
  400.       --------------------------------
  401.       -- Check_Array_Or_Scalar_Type --
  402.       --------------------------------
  403.  
  404.       procedure Check_Array_Or_Scalar_Type is
  405.          Index_Type : Entity_Id;
  406.  
  407.          D : Int;
  408.          --  Dimension number for array attributes.
  409.  
  410.       begin
  411.          if Is_Scalar_Type (P_Type) then
  412.             Check_Type;
  413.  
  414.             if Present (E1) then
  415.                Error_Attr ("invalid argument in % attribute", E1);
  416.             else
  417.                Set_Etype (N, P_Base_Type);
  418.                return;
  419.             end if;
  420.  
  421.          else
  422.             Check_Array_Type;
  423.  
  424.             --  We know prefix is an array type, or the name of an array
  425.             --  object, and that the expression, if present, is static
  426.             --  and within the range of the dimensions of the type.
  427.  
  428.             if Is_Array_Type (P_Type) then
  429.                Index_Type := First_Index (P_Type);
  430.  
  431.             elsif Is_Access_Type (P_Type) then
  432.                Index_Type := First_Index (Designated_Type (P_Type));
  433.             end if;
  434.  
  435.             if No (E1) then
  436.  
  437.                --  First dimension assumed
  438.  
  439.                Set_Etype (N, Etype (Index_Type));
  440.  
  441.             else
  442.                D := UI_To_Int (Intval (E1));
  443.  
  444.                for I in 1 .. D - 1 loop
  445.                   Index_Type := Next_Index (Index_Type);
  446.                end loop;
  447.  
  448.                Set_Etype (N, Etype (Index_Type));
  449.                Set_Etype (E1, Standard_Integer);
  450.             end if;
  451.          end if;
  452.       end Check_Array_Or_Scalar_Type;
  453.  
  454.       ----------------------
  455.       -- Check_Array_Type --
  456.       ----------------------
  457.  
  458.       procedure Check_Array_Type is
  459.          D : Int;
  460.          --  Dimension number for array attributes.
  461.  
  462.       begin
  463.          Check_E0_Or_E1;
  464.  
  465.          if Is_Array_Type (P_Type) then
  466.             if not Is_Constrained (P_Type)
  467.               and then Is_Entity_Name (P)
  468.               and then Is_Type (Entity (P))
  469.             then
  470.                Error_Attr
  471.                  ("prefix for % attribute must be constrained array", P);
  472.             end if;
  473.  
  474.             D := Number_Dimensions (P_Type);
  475.  
  476.          elsif Is_Access_Type (P_Type)
  477.            and then Is_Array_Type (Designated_Type (P_Type))
  478.          then
  479.             if Is_Entity_Name (P) and then Is_Type (Entity (P)) then
  480.                Error_Attr ("prefix of % attribute cannot be access type", P);
  481.             end if;
  482.  
  483.             D := Number_Dimensions (Designated_Type (P_Type));
  484.  
  485.          else
  486.             Error_Attr ("prefix for % attribute must be array", P);
  487.          end if;
  488.  
  489.          if Present (E1) then
  490.             Resolve (E1, Any_Integer);
  491.             Set_Etype (E1, Standard_Integer);
  492.  
  493.             if not Is_Static_Expression (E1) then
  494.                Error_Attr ("expression for dimension must be static", E1);
  495.  
  496.             elsif  UI_To_Int (Intval (E1)) > D
  497.               or else UI_To_Int (Intval (E1)) < 1
  498.             then
  499.                Error_Attr ("invalid dimension number for array type", E1);
  500.             end if;
  501.          end if;
  502.       end Check_Array_Type;
  503.  
  504.       ---------------------
  505.       -- Check_Component --
  506.       ---------------------
  507.  
  508.       procedure Check_Component is
  509.       begin
  510.          Check_E0;
  511.  
  512.          if Nkind (P) /= N_Selected_Component
  513.            or else
  514.              (Ekind (Entity (Selector_Name (P))) /= E_Component
  515.                and then
  516.               Ekind (Entity (Selector_Name (P))) /= E_Discriminant)
  517.          then
  518.             Error_Attr
  519.               ("prefix for % attribute must be selected component", P);
  520.          end if;
  521.       end Check_Component;
  522.  
  523.       ------------------------------------
  524.       -- Check_Decimal_Fixed_Point_Type --
  525.       ------------------------------------
  526.  
  527.       procedure Check_Decimal_Fixed_Point_Type is
  528.       begin
  529.          Check_Type;
  530.  
  531.          if not Is_Decimal_Fixed_Point_Type (P_Type) then
  532.             Error_Attr
  533.               ("prefix of % attribute must be decimal type", P);
  534.          end if;
  535.       end Check_Decimal_Fixed_Point_Type;
  536.  
  537.       ------------------------------
  538.       -- Check_Discrete_Attribute --
  539.       ------------------------------
  540.  
  541.       procedure Check_Discrete_Attribute is
  542.       begin
  543.          Check_Discrete_Type;
  544.          Check_E1;
  545.          Resolve (E1, P_Type);
  546.       end Check_Discrete_Attribute;
  547.  
  548.       -------------------------
  549.       -- Check_Discrete_Type --
  550.       -------------------------
  551.  
  552.       procedure Check_Discrete_Type is
  553.       begin
  554.          Check_Type;
  555.  
  556.          if not Is_Discrete_Type (P_Type) then
  557.             Error_Attr ("prefix of % attribute must be discrete type", P);
  558.          end if;
  559.       end Check_Discrete_Type;
  560.  
  561.       --------------
  562.       -- Check_E0 --
  563.       --------------
  564.  
  565.       procedure Check_E0 is
  566.       begin
  567.          if Present (E1) then
  568.             Unexpected_Argument (E1);
  569.          end if;
  570.       end Check_E0;
  571.  
  572.       --------------------
  573.       -- Check_E0_Or_E1 --
  574.       --------------------
  575.  
  576.       procedure Check_E0_Or_E1 is
  577.       begin
  578.          if Present (E2) then
  579.             Unexpected_Argument (E2);
  580.          end if;
  581.       end Check_E0_Or_E1;
  582.  
  583.       --------------
  584.       -- Check_E1 --
  585.       --------------
  586.  
  587.       procedure Check_E1 is
  588.       begin
  589.          Check_E0_Or_E1;
  590.  
  591.          if No (E1) then
  592.             Error_Attr ("missing argument for % attribute", N);
  593.          end if;
  594.       end Check_E1;
  595.  
  596.       --------------
  597.       -- Check_E2 --
  598.       --------------
  599.  
  600.       procedure Check_E2 is
  601.       begin
  602.          if No (E1) then
  603.             Error_Attr ("missing arguments for % attribute (2 required)", N);
  604.          elsif No (E2) then
  605.             Error_Attr ("missing argument for % attribute (2 required)", N);
  606.          end if;
  607.       end Check_E2;
  608.  
  609.       ----------------------------
  610.       -- Check_Enumeration_Type --
  611.       ----------------------------
  612.  
  613.       procedure Check_Enumeration_Type is
  614.       begin
  615.          Check_Type;
  616.  
  617.          if not Is_Enumeration_Type (P_Type) then
  618.             Error_Attr ("prefix of % attribute must be enumeration type", P);
  619.          end if;
  620.       end Check_Enumeration_Type;
  621.  
  622.       ----------------------------
  623.       -- Check_Fixed_Point_Type --
  624.       ----------------------------
  625.  
  626.       procedure Check_Fixed_Point_Type is
  627.       begin
  628.          Check_Type;
  629.  
  630.          if not Is_Fixed_Point_Type (P_Type) then
  631.             Error_Attr ("prefix of % attribute must be fixed point type", P);
  632.          end if;
  633.       end Check_Fixed_Point_Type;
  634.  
  635.       ------------------------------
  636.       -- Check_Fixed_Point_Type_0 --
  637.       ------------------------------
  638.  
  639.       procedure Check_Fixed_Point_Type_0 is
  640.       begin
  641.          Check_Fixed_Point_Type;
  642.          Check_E0;
  643.       end Check_Fixed_Point_Type_0;
  644.  
  645.       -------------------------------
  646.       -- Check_Floating_Point_Type --
  647.       -------------------------------
  648.  
  649.       procedure Check_Floating_Point_Type is
  650.       begin
  651.          Check_Type;
  652.  
  653.          if not Is_Floating_Point_Type (P_Type) then
  654.             Error_Attr ("prefix of % attribute must be float type", P);
  655.          end if;
  656.       end Check_Floating_Point_Type;
  657.  
  658.       ---------------------------------
  659.       -- Check_Floating_Point_Type_0 --
  660.       ---------------------------------
  661.  
  662.       procedure Check_Floating_Point_Type_0 is
  663.       begin
  664.          Check_Floating_Point_Type;
  665.          Check_E0;
  666.       end Check_Floating_Point_Type_0;
  667.  
  668.       ---------------------------------
  669.       -- Check_Floating_Point_Type_1 --
  670.       ---------------------------------
  671.  
  672.       procedure Check_Floating_Point_Type_1 is
  673.       begin
  674.          Check_Floating_Point_Type;
  675.          Check_E1;
  676.       end Check_Floating_Point_Type_1;
  677.  
  678.       ---------------------------------
  679.       -- Check_Floating_Point_Type_2 --
  680.       ---------------------------------
  681.  
  682.       procedure Check_Floating_Point_Type_2 is
  683.       begin
  684.          Check_Floating_Point_Type;
  685.          Check_E2;
  686.       end Check_Floating_Point_Type_2;
  687.  
  688.       ------------------------
  689.       -- Check_Integer_Type --
  690.       ------------------------
  691.  
  692.       procedure Check_Integer_Type is
  693.       begin
  694.          Check_Type;
  695.  
  696.          if not Is_Integer_Type (P_Type) then
  697.             Error_Attr ("prefix of % attribute must be integer type", P);
  698.          end if;
  699.       end Check_Integer_Type;
  700.  
  701.       ------------------------
  702.       -- Check_Library_Unit --
  703.       ------------------------
  704.  
  705.       procedure Check_Library_Unit is
  706.       begin
  707.          if not Is_Entity_Name (P)
  708.            or else
  709.              (Ekind (Entity (P)) /= E_Function
  710.                and then Ekind (Entity (P)) /= E_Procedure
  711.                and then Ekind (Entity (P)) /= E_Package)
  712.            or else
  713.              Scope (Entity (P)) /= Standard_Standard
  714.          then
  715.             Error_Attr ("prefix of % attribute must be library unit", P);
  716.          end if;
  717.       end Check_Library_Unit;
  718.  
  719.       ----------------------------
  720.       -- Check_Object_Reference --
  721.       ----------------------------
  722.  
  723.       procedure Check_Object_Reference is
  724.       begin
  725.          if Is_Entity_Name (P) then
  726.             if Is_Object (Entity (P)) then
  727.                return;
  728.             end if;
  729.  
  730.          elsif Nkind (P) = N_Indexed_Component
  731.            and then Is_Array_Type (Etype (Prefix (P)))
  732.          then
  733.             return;
  734.  
  735.          elsif Nkind (P) = N_Selected_Component then
  736.             return;
  737.  
  738.          elsif Nkind (P) = N_Explicit_Dereference then
  739.             return;
  740.  
  741.          else
  742.             Error_Attr ("prefix of % attribute must be object", P);
  743.          end if;
  744.       end Check_Object_Reference;
  745.  
  746.       ---------------------
  747.       -- Check_Real_Type --
  748.       ---------------------
  749.  
  750.       procedure Check_Real_Type is
  751.       begin
  752.          Check_Type;
  753.  
  754.          if not Is_Real_Type (P_Type) then
  755.             Error_Attr ("prefix of % attribute must be real type", P);
  756.          end if;
  757.       end Check_Real_Type;
  758.  
  759.       -----------------------
  760.       -- Check_Scalar_Type --
  761.       -----------------------
  762.  
  763.       procedure Check_Scalar_Type is
  764.       begin
  765.          Check_Type;
  766.  
  767.          if not Is_Scalar_Type (P_Type) then
  768.             Error_Attr ("prefix of % attribute must be scalar type", P);
  769.          end if;
  770.       end Check_Scalar_Type;
  771.  
  772.       ---------------------------
  773.       -- Check_Standard_Prefix --
  774.       ---------------------------
  775.  
  776.       procedure Check_Standard_Prefix is
  777.       begin
  778.          Check_E0;
  779.  
  780.          if Nkind (P) /= N_Identifier
  781.            or else Chars (P) /= Name_Standard
  782.          then
  783.             Error_Attr ("only allowed prefix for % attribute is Standard", P);
  784.          end if;
  785.  
  786.       end Check_Standard_Prefix;
  787.  
  788.       -----------------------
  789.       -- Check_Task_Prefix --
  790.       -----------------------
  791.  
  792.       procedure Check_Task_Prefix is
  793.       begin
  794.          Analyze (P);
  795.  
  796.          if Is_Task_Type (Etype (P))
  797.            or else (Is_Access_Type (Etype (P))
  798.               and then Is_Task_Type (Designated_Type (Etype (P))))
  799.          then
  800.             Resolve (P, Etype (P));
  801.          else
  802.             Error_Attr ("prefix of % attribute must be a task", P);
  803.          end if;
  804.       end Check_Task_Prefix;
  805.  
  806.       ----------------
  807.       -- Check_Type --
  808.       ----------------
  809.  
  810.       --  The possibilities are an entity name denoting a type, or an
  811.       --  attribute reference that denotes a type (Base or Class). If
  812.       --  the type is incomplete, replace it with its full view.
  813.  
  814.       procedure Check_Type is
  815.       begin
  816.          if not Is_Entity_Name (P)
  817.            or else not Is_Type (Entity (P))
  818.          then
  819.             Error_Attr ("prefix of % attribute must be a type", P);
  820.  
  821.          elsif Ekind (Entity (P)) = E_Incomplete_Type
  822.             and then Present (Full_View (Entity (P)))
  823.          then
  824.             P_Type := Full_View (Entity (P));
  825.             Set_Entity (P, P_Type);
  826.          end if;
  827.       end Check_Type;
  828.  
  829.       ----------------
  830.       -- Error_Attr --
  831.       ----------------
  832.  
  833.       procedure Error_Attr (Msg : String; Error_Node : Node_Id) is
  834.       begin
  835.          Error_Msg_Name_1 := Aname;
  836.          Error_Msg_N (Msg, Error_Node);
  837.          Set_Etype (N, Any_Type);
  838.          Set_Entity (N, Any_Type);
  839.          raise Bad_Attribute;
  840.       end Error_Attr;
  841.  
  842.       ------------------------
  843.       -- Standard_Attribute --
  844.       ------------------------
  845.  
  846.       procedure Standard_Attribute (Val : Int) is
  847.       begin
  848.          Check_Standard_Prefix;
  849.          Rewrite_Substitute_Tree (N,
  850.            Make_Integer_Literal (Loc, UI_From_Int (Val)));
  851.          Analyze (N);
  852.       end Standard_Attribute;
  853.  
  854.       -------------------------
  855.       -- Unexpected Argument --
  856.       -------------------------
  857.  
  858.       procedure Unexpected_Argument (En : Node_Id) is
  859.       begin
  860.          Error_Attr ("unexpected argument for % attribute", En);
  861.       end Unexpected_Argument;
  862.  
  863.       -----------------------------
  864.       -- Unimplemented_Attribute --
  865.       -----------------------------
  866.  
  867.       procedure Unimplemented_Attribute is
  868.       begin
  869.          Error_Attr ("% attribute not implemented yet", N);
  870.       end Unimplemented_Attribute;
  871.  
  872.       -------------------------------------------------
  873.       -- Validate_Non_Static_Attribute_Function_Call --
  874.       -------------------------------------------------
  875.  
  876.       --  This function should be moved to Sem_Dist ???
  877.  
  878.       procedure Validate_Non_Static_Attribute_Function_Call is
  879.       begin
  880.          if Inside_Preelaborated_Unit
  881.            and then not Inside_Subprogram_Unit
  882.          then
  883.             Error_Msg_N ("non-static function call in preelaborated unit", N);
  884.          end if;
  885.       end Validate_Non_Static_Attribute_Function_Call;
  886.  
  887.    -----------------------------------------------
  888.    -- Start of Processing for Analyze_Attribute --
  889.    -----------------------------------------------
  890.  
  891.    begin
  892.       --  Immediate return if unrecognized attribute (already diagnosed
  893.       --  by parser, so there is nothing more that we need to do)
  894.  
  895.       if not Is_Attribute_Name (Aname) then
  896.          raise Bad_Attribute;
  897.       end if;
  898.  
  899.       --  Deal with Ada 83 and Featues issues
  900.  
  901.       if not Attribute_83 (Attr_Id) then
  902.          if Ada_83 and then Comes_From_Source (N) then
  903.             Error_Msg_Name_1 := Aname;
  904.             Error_Msg_N ("(Ada 83) attribute% is not recognized", N);
  905.          end if;
  906.  
  907.          if Attribute_Impl_Def (Attr_Id) then
  908.             Note_Feature (Implementation_Dependent_Attributes, Loc);
  909.          else
  910.             Note_Feature (New_Attributes, Loc);
  911.          end if;
  912.       end if;
  913.  
  914.       --   Remote access to subprogram type access attribute reference needs
  915.       --   unanalyzed copy for tree transformation. The analyzed copy is used
  916.       --   for its semantic information (whether prefix is a remote subprogram
  917.       --   name), the unanalyzed copy is used to construct new subtree rooted
  918.       --   with N_aggregate which represents a fat pointer aggregate.
  919.  
  920.       if Aname = Name_Access then
  921.          Unanalyzed := Copy_Separate_Tree (N);
  922.       end if;
  923.  
  924.       --  Analyze prefix and exit if error in analysis. If the prefix is an
  925.       --  incomplete type, use full view if available.
  926.  
  927.       Analyze (P);
  928.       P_Type := Etype (P);
  929.  
  930.       if Is_Entity_Name (P)
  931.         and then Is_Type (Entity (P))
  932.         and then Ekind (Entity (P)) = E_Incomplete_Type
  933.       then
  934.          P_Type := Get_Full_View (P_Type);
  935.          Set_Entity (P, P_Type);
  936.          Set_Etype  (P, P_Type);
  937.       end if;
  938.  
  939.       if P_Type = Any_Type then
  940.          raise Bad_Attribute;
  941.       end if;
  942.  
  943.       P_Base_Type := Base_Type (P_Type);
  944.       P_Root_Type := Root_Type (P_Base_Type);
  945.  
  946.       --  Freeze the prefix unless this is a type attribute (a reference
  947.       --  such as X'Base or X'Class definitely must not freeze X).
  948.  
  949.       if not Is_Type_Attribute_Name (Aname) then
  950.          Freeze_Expression (P);
  951.       end if;
  952.  
  953.       --  Analyze expressions that may be present, exiting if an error occurs
  954.  
  955.       if No (Exprs) then
  956.          E1 := Empty;
  957.          E2 := Empty;
  958.  
  959.       else
  960.          E1 := First (Exprs);
  961.          Analyze (E1);
  962.  
  963.          if Etype (E1) = Any_Type then
  964.             raise Bad_Attribute;
  965.          end if;
  966.  
  967.          E2 := Next (E1);
  968.  
  969.          if Present (E2) then
  970.             Analyze (E2);
  971.  
  972.             if Etype (E2) = Any_Type then
  973.                raise Bad_Attribute;
  974.             end if;
  975.  
  976.             if Present (Next (E2)) then
  977.                Unexpected_Argument (Next (E2));
  978.             end if;
  979.          end if;
  980.       end if;
  981.  
  982.       if Is_Overloaded (P)
  983.         and then Aname /= Name_Access
  984.         and then Aname /= Name_Address
  985.         and then Aname /= Name_Count
  986.         and then Aname /= Name_Unchecked_Access
  987.       then
  988.          Error_Attr ("ambiguous prefix for % attribute", P);
  989.       end if;
  990.  
  991.       --  Remaining processing depends on attribute
  992.  
  993.       case Attr_Id is
  994.  
  995.       ------------------
  996.       -- Abort_Signal --
  997.       ------------------
  998.  
  999.       when Attribute_Abort_Signal =>
  1000.          Check_Standard_Prefix;
  1001.          Rewrite_Substitute_Tree (N,
  1002.            New_Reference_To (Stand.Abort_Signal, Loc));
  1003.          Analyze (N);
  1004.  
  1005.       ------------
  1006.       -- Access --
  1007.       ------------
  1008.  
  1009.       when Attribute_Access =>
  1010.          Access_Attribute;
  1011.  
  1012.       -------------
  1013.       -- Address --
  1014.       -------------
  1015.  
  1016.       when Attribute_Address =>
  1017.          Check_E0;
  1018.  
  1019.          if Is_Entity_Name (P)
  1020.            and then Is_Type (Entity (P))
  1021.            and then not Is_Task_Type (Entity (P))
  1022.          then
  1023.             Error_Attr ("prefix of % attribute cannot be a type", P);
  1024.          end if;
  1025.  
  1026.          Set_Etype (N, RTE (RE_Address));
  1027.  
  1028.       ------------------
  1029.       -- Address_Size --
  1030.       ------------------
  1031.  
  1032.       when Attribute_Address_Size =>
  1033.          Standard_Attribute (Ttypes.System_Address_Size);
  1034.  
  1035.       --------------
  1036.       -- Adjacent --
  1037.       --------------
  1038.  
  1039.       when Attribute_Adjacent =>
  1040.          Check_Floating_Point_Type_2;
  1041.          Set_Etype (N, P_Base_Type);
  1042.          Resolve (E1, P_Base_Type);
  1043.          Resolve (E2, P_Base_Type);
  1044.  
  1045.       ---------
  1046.       -- Aft --
  1047.       ---------
  1048.  
  1049.       when Attribute_Aft =>
  1050.          Check_Fixed_Point_Type_0;
  1051.          Set_Etype (N, Universal_Integer);
  1052.  
  1053.       ---------------
  1054.       -- Alignment --
  1055.       ---------------
  1056.  
  1057.       when Attribute_Alignment =>
  1058.          Check_E0;
  1059.          Set_Etype (N, Universal_Integer);
  1060.  
  1061.       ----------
  1062.       -- Base --
  1063.       ----------
  1064.  
  1065.       when Attribute_Base => Base :
  1066.       begin
  1067.          Check_E0_Or_E1;
  1068.          Find_Type (P);
  1069.          Set_Etype (N, Base_Type (Entity (P)));
  1070.  
  1071.          if Present (Exprs) then
  1072.  
  1073.             --  Attribute is the subtype mark of a conversion.
  1074.  
  1075.             declare
  1076.                New_N : Node_Id;
  1077.  
  1078.             begin
  1079.                New_N :=
  1080.                  Make_Type_Conversion (Loc,
  1081.                    Subtype_Mark => New_Reference_To (Etype (N), Loc),
  1082.                    Expression => New_Copy (E1));
  1083.                Rewrite_Substitute_Tree (N,  New_N);
  1084.                Analyze (N);
  1085.             end;
  1086.  
  1087.          --  For other cases, set the proper type as the entity of the
  1088.          --  attribute reference, and then rewrite the node to be an
  1089.          --  occurrence of the referenced base type. This way, no one
  1090.          --  else in the compiler has to worry about the base attribute.
  1091.  
  1092.          else
  1093.             Set_Entity (N, Base_Type (Entity (P)));
  1094.             Rewrite_Substitute_Tree (N,
  1095.               New_Reference_To (Entity (N), Loc));
  1096.             Analyze (N);
  1097.          end if;
  1098.       end Base;
  1099.  
  1100.       ---------------
  1101.       -- Bit_Order --
  1102.       ---------------
  1103.  
  1104.       when Attribute_Bit_Order => Bit_Order :
  1105.       begin
  1106.          Check_E0;
  1107.          Check_Type;
  1108.  
  1109.          if not Is_Record_Type (P_Type) then
  1110.             Error_Attr ("prefix of % attribute must be record type", P);
  1111.          end if;
  1112.  
  1113.          if Bytes_Big_Endian then
  1114.             Rewrite_Substitute_Tree (N,
  1115.               New_Occurrence_Of (RTE (RE_High_Order_First), Loc));
  1116.          else
  1117.             Rewrite_Substitute_Tree (N,
  1118.               New_Occurrence_Of (RTE (RE_Low_Order_First), Loc));
  1119.          end if;
  1120.  
  1121.          Set_Etype (N, RTE (RE_Bit_Order));
  1122.          Resolve (N, Etype (N));
  1123.  
  1124.          --  Reset incorrect indication of staticness
  1125.  
  1126.          Set_Is_Static_Expression (N, False);
  1127.       end Bit_Order;
  1128.  
  1129.       ------------------
  1130.       -- Body_Version --
  1131.       ------------------
  1132.  
  1133.       --  Missing check: make sure the referenced library unit has a body???
  1134.  
  1135.       when Attribute_Body_Version =>
  1136.          Check_E0;
  1137.          Check_Library_Unit;
  1138.          Set_Etype (N, RTE (RE_Version_String));
  1139.  
  1140.       --------------
  1141.       -- Callable --
  1142.       --------------
  1143.  
  1144.       when Attribute_Callable =>
  1145.          Check_E0;
  1146.          Set_Etype (N, Standard_Boolean);
  1147.          Check_Task_Prefix;
  1148.  
  1149.       ------------
  1150.       -- Caller --
  1151.       ------------
  1152.  
  1153.       when Attribute_Caller =>
  1154.          Check_E0;
  1155.          Unimplemented_Attribute;
  1156.  
  1157.       -------------
  1158.       -- Ceiling --
  1159.       -------------
  1160.  
  1161.       when Attribute_Ceiling =>
  1162.          Check_Floating_Point_Type_1;
  1163.          Set_Etype (N, P_Base_Type);
  1164.          Resolve (E1, P_Base_Type);
  1165.  
  1166.       -----------
  1167.       -- Class --
  1168.       -----------
  1169.  
  1170.       when Attribute_Class => Class :
  1171.       begin
  1172.          Note_Feature (Class_Wide_Types, Loc);
  1173.          Check_E0_Or_E1;
  1174.          Find_Type (N);
  1175.  
  1176.          if Present (E1) then
  1177.  
  1178.             --  This is a conversion not an attribute : T'Class (X)
  1179.  
  1180.             Rewrite_Substitute_Tree (N, Make_Type_Conversion (Loc,
  1181.               Subtype_Mark => New_Occurrence_Of (Etype (N), Loc),
  1182.               Expression => New_Copy (E1)));
  1183.  
  1184.             Analyze (N);
  1185.          end if;
  1186.  
  1187.       end Class;
  1188.  
  1189.       --------------------
  1190.       -- Component_Size --
  1191.       --------------------
  1192.  
  1193.       when Attribute_Component_Size =>
  1194.          Check_E0;
  1195.          Set_Etype (N, Universal_Integer);
  1196.  
  1197.          --  Note: unlike other array attributes, unconstrained arrays are OK
  1198.  
  1199.          if Is_Array_Type (P_Type) and then not Is_Constrained (P_Type) then
  1200.             null;
  1201.          else
  1202.             Check_Array_Type;
  1203.          end if;
  1204.  
  1205.       -------------
  1206.       -- Compose --
  1207.       -------------
  1208.  
  1209.       when Attribute_Compose =>
  1210.          Check_Floating_Point_Type_2;
  1211.          Set_Etype (N, P_Base_Type);
  1212.          Resolve (E1, P_Base_Type);
  1213.          Resolve (E2, Any_Integer);
  1214.  
  1215.       -----------------
  1216.       -- Constrained --
  1217.       -----------------
  1218.  
  1219.       when Attribute_Constrained =>
  1220.          Check_E0;
  1221.          Set_Etype (N, Standard_Boolean);
  1222.  
  1223.          if Is_Entity_Name (P) and then Is_Type (Entity (P)) then
  1224.             if Is_Private_Type (Entity (P))
  1225.               and then not Is_Record_Type (Entity (P))
  1226.             then
  1227.                return;
  1228.             end if;
  1229.          else
  1230.             Check_Object_Reference;
  1231.  
  1232.             if Has_Discriminants (P_Type)
  1233.                or else (Is_Access_Type (P_Type)
  1234.                   and then
  1235.                       Has_Discriminants (Designated_Type (P_Type)))
  1236.             then
  1237.                return;
  1238.             end if;
  1239.          end if;
  1240.  
  1241.          --  Fall through if bad prefix
  1242.  
  1243.          Error_Attr
  1244.            ("prefix of % attribute must be object of discriminated type", P);
  1245.  
  1246.       ---------------
  1247.       -- Copy_Sign --
  1248.       ---------------
  1249.  
  1250.       when Attribute_Copy_Sign =>
  1251.          Check_Floating_Point_Type_2;
  1252.          Set_Etype (N, P_Base_Type);
  1253.          Resolve (E1, P_Base_Type);
  1254.          Resolve (E2, P_Base_Type);
  1255.  
  1256.       -----------
  1257.       -- Count --
  1258.       -----------
  1259.  
  1260.       when Attribute_Count => Count :
  1261.       declare
  1262.          Ent : Entity_Id;
  1263.          H   : Entity_Id;
  1264.          S   : Entity_Id;
  1265.  
  1266.       begin
  1267.          Check_E0;
  1268.  
  1269.          if Nkind (P) = N_Identifier
  1270.            or else Nkind (P) = N_Expanded_Name
  1271.          then
  1272.             Ent := Entity (P);
  1273.  
  1274.             if Ekind (Ent) /= E_Entry then
  1275.                Error_Attr ("invalid entry name",  N);
  1276.             end if;
  1277.  
  1278.          elsif Nkind (P) = N_Indexed_Component then
  1279.             Ent := Entity (Prefix (P));
  1280.  
  1281.             if Ekind (Ent) /= E_Entry_Family then
  1282.                Error_Attr ("invalid entry family name",  P);
  1283.                return;
  1284.             end if;
  1285.  
  1286.          else
  1287.             Error_Attr ("invalid entry name",  N);
  1288.             return;
  1289.          end if;
  1290.  
  1291.          for J in reverse 0 .. Scope_Stack.Last loop
  1292.             S := Scope_Stack.Table (J).Entity;
  1293.  
  1294.             if S = Scope (Ent) then
  1295.                exit;
  1296.  
  1297.             elsif Ekind (Scope (Ent)) in Task_Kind
  1298.               and then Ekind (S) /= E_Loop
  1299.               and then Ekind (S) /= E_Block
  1300.               and then Ekind (S) /= E_Entry
  1301.               and then Ekind (S) /= E_Entry_Family
  1302.             then
  1303.                Error_Attr ("Count cannot appear in inner unit", N);
  1304.             end if;
  1305.          end loop;
  1306.  
  1307.          H := Homonym (Ent);
  1308.  
  1309.          while Present (H) loop
  1310.             if Scope (H) = Scope (Ent) then
  1311.                Error_Attr ("ambiguous entry name", N);
  1312.                return;
  1313.             end if;
  1314.  
  1315.             H := Homonym (H);
  1316.          end loop;
  1317.  
  1318.          Set_Etype (N, Universal_Integer);
  1319.       end Count;
  1320.  
  1321.       -----------------------
  1322.       -- Default_Bit_Order --
  1323.       -----------------------
  1324.  
  1325.       when Attribute_Default_Bit_Order => Default_Bit_Order :
  1326.       begin
  1327.          Check_Standard_Prefix;
  1328.          Check_E0;
  1329.  
  1330.          if Bytes_Big_Endian then
  1331.             Rewrite_Substitute_Tree (N,
  1332.               Make_Integer_Literal (Loc, Uint_0));
  1333.          else
  1334.             Rewrite_Substitute_Tree (N,
  1335.               Make_Integer_Literal (Loc, Uint_1));
  1336.          end if;
  1337.  
  1338.          Set_Etype (N, Universal_Integer);
  1339.       end Default_Bit_Order;
  1340.  
  1341.       --------------
  1342.       -- Definite --
  1343.       --------------
  1344.  
  1345.       when Attribute_Definite =>
  1346.          Check_E0;
  1347.  
  1348.          if not Is_Entity_Name (P)
  1349.            or else not Is_Type (Entity (P))
  1350.          then
  1351.             Error_Attr (" prefix of % attribute must be generic type", N);
  1352.  
  1353.          else
  1354.             --  If the context is a generic unit, then the attribute must
  1355.             --  apply to a formal indefinite subtype. If the context is an
  1356.             --  instance then it applies to the corresponding actual type,
  1357.             --  and can be constant-folded.
  1358.  
  1359.             if In_Generic_Unit
  1360.               and then (not Is_Generic_Type (Entity (P))
  1361.                 or else not Is_Indefinite_Subtype (Entity (P)))
  1362.             then
  1363.                Error_Attr (" prefix of % attribute must be generic type", N);
  1364.             end if;
  1365.          end if;
  1366.  
  1367.          Set_Etype (N, Standard_Boolean);
  1368.  
  1369.       -----------
  1370.       -- Delta --
  1371.       -----------
  1372.  
  1373.       when Attribute_Delta =>
  1374.          Check_Fixed_Point_Type_0;
  1375.          Set_Etype (N, Universal_Real);
  1376.  
  1377.       ------------
  1378.       -- Denorm --
  1379.       ------------
  1380.  
  1381.       when Attribute_Denorm =>
  1382.          Check_Floating_Point_Type_0;
  1383.          Set_Etype (N, Standard_Boolean);
  1384.  
  1385.       ------------
  1386.       -- Digits --
  1387.       ------------
  1388.  
  1389.       when Attribute_Digits =>
  1390.          Check_E0;
  1391.          Check_Type;
  1392.  
  1393.          if not Is_Floating_Point_Type (P_Type)
  1394.            and then not Is_Decimal_Fixed_Point_Type (P_Type)
  1395.          then
  1396.             Error_Attr
  1397.               ("prefix of % attribute must be float or decimal type", P);
  1398.          end if;
  1399.  
  1400.          Set_Etype (N, Universal_Integer);
  1401.  
  1402.       ---------------
  1403.       -- Elab_Body --
  1404.       ---------------
  1405.  
  1406.       when Attribute_Elab_Body =>
  1407.          Check_E0;
  1408.          Check_Library_Unit;
  1409.          Set_Etype (N, Standard_Void_Type);
  1410.  
  1411.       ---------------
  1412.       -- Elab_Spec --
  1413.       ---------------
  1414.  
  1415.       when Attribute_Elab_Spec =>
  1416.          Check_E0;
  1417.          Check_Library_Unit;
  1418.          Set_Etype (N, Standard_Void_Type);
  1419.  
  1420.       ----------
  1421.       -- Emax --
  1422.       ----------
  1423.  
  1424.       when Attribute_Emax =>
  1425.          Check_Floating_Point_Type_0;
  1426.          Set_Etype (N, Universal_Integer);
  1427.  
  1428.       --------------
  1429.       -- Enum_Rep --
  1430.       --------------
  1431.  
  1432.       when Attribute_Enum_Rep => Enum_Rep : declare
  1433.       begin
  1434.          Check_E1;
  1435.          Check_Enumeration_Type;
  1436.          Resolve (E1, P_Base_Type);
  1437.          Set_Etype (N, Universal_Integer);
  1438.       end Enum_Rep;
  1439.  
  1440.       -------------
  1441.       -- Epsilon --
  1442.       -------------
  1443.  
  1444.       when Attribute_Epsilon =>
  1445.          Check_Floating_Point_Type_0;
  1446.          Set_Etype (N, Universal_Real);
  1447.  
  1448.       --------------
  1449.       -- Exponent --
  1450.       --------------
  1451.  
  1452.       when Attribute_Exponent =>
  1453.          Check_Floating_Point_Type_1;
  1454.          Set_Etype (N, P_Base_Type);
  1455.          Resolve (E1, P_Base_Type);
  1456.  
  1457.       ------------------
  1458.       -- External_Tag --
  1459.       ------------------
  1460.  
  1461.       when Attribute_External_Tag =>
  1462.          Check_E0;
  1463.          Unimplemented_Attribute;
  1464.  
  1465.       -----------
  1466.       -- First --
  1467.       -----------
  1468.  
  1469.       when Attribute_First =>
  1470.          Check_Array_Or_Scalar_Type;
  1471.  
  1472.       ---------------
  1473.       -- First_Bit --
  1474.       ---------------
  1475.  
  1476.       when Attribute_First_Bit =>
  1477.          Check_Component;
  1478.          Set_Etype (N, Universal_Integer);
  1479.  
  1480.       -----------------
  1481.       -- Fixed_Value --
  1482.       -----------------
  1483.  
  1484.       when Attribute_Fixed_Value =>
  1485.          Check_E1;
  1486.          Check_Fixed_Point_Type;
  1487.          Resolve (E1, Any_Integer);
  1488.  
  1489.       -----------
  1490.       -- Floor --
  1491.       -----------
  1492.  
  1493.       when Attribute_Floor =>
  1494.          Check_Floating_Point_Type_1;
  1495.          Set_Etype (N, P_Base_Type);
  1496.          Resolve (E1, P_Base_Type);
  1497.  
  1498.       ----------
  1499.       -- Fore --
  1500.       ----------
  1501.  
  1502.       when Attribute_Fore =>
  1503.          Check_Fixed_Point_Type_0;
  1504.          Set_Etype (N, Universal_Integer);
  1505.  
  1506.       --------------
  1507.       -- Fraction --
  1508.       --------------
  1509.  
  1510.       when Attribute_Fraction =>
  1511.          Check_Floating_Point_Type_1;
  1512.          Set_Etype (N, P_Base_Type);
  1513.          Resolve (E1, P_Base_Type);
  1514.  
  1515.       --------------
  1516.       -- Identity --
  1517.       --------------
  1518.  
  1519.       when Attribute_Identity =>
  1520.          Check_E0;
  1521.          Unimplemented_Attribute;
  1522.  
  1523.       -----------
  1524.       -- Image --
  1525.       -----------
  1526.  
  1527.       when Attribute_Image => Image :
  1528.       begin
  1529.          Set_Etype (N, Standard_String);
  1530.          Check_Scalar_Type;
  1531.  
  1532.          if Is_Real_Type (P_Type) then
  1533.             Check_Type;
  1534.             Note_Feature (Image_Attribute_For_Real, Loc);
  1535.  
  1536.             if Ada_83 and then Comes_From_Source (N) then
  1537.                Error_Msg_Name_1 := Aname;
  1538.                Error_Msg_N
  1539.                  ("(Ada 83) % attribute not allowed for real types", N);
  1540.             end if;
  1541.          else
  1542.             Check_Discrete_Attribute;
  1543.          end if;
  1544.  
  1545.          Validate_Non_Static_Attribute_Function_Call;
  1546.       end Image;
  1547.  
  1548.       ---------
  1549.       -- Img --
  1550.       ---------
  1551.  
  1552.       when Attribute_Img => Img :
  1553.       begin
  1554.          Set_Etype (N, Standard_String);
  1555.  
  1556.          --  Must be scalar type
  1557.  
  1558.          if Is_Scalar_Type (P_Type) then
  1559.  
  1560.             --  Variable is OK
  1561.  
  1562.             if Is_Variable (P) then
  1563.                return;
  1564.  
  1565.             --  So is constant (or in parameter)
  1566.  
  1567.             elsif Is_Entity_Name (P) then
  1568.                if Ekind (Entity (P)) = E_Constant
  1569.                  or else Ekind (Entity (P)) = E_In_Parameter
  1570.                then
  1571.                   return;
  1572.                end if;
  1573.             end if;
  1574.          end if;
  1575.  
  1576.          --  Fall through on error
  1577.  
  1578.          Error_Attr ("prefix of % attribute must be scalar object name", N);
  1579.       end Img;
  1580.  
  1581.       -----------
  1582.       -- Input --
  1583.       -----------
  1584.  
  1585.       when Attribute_Input =>
  1586.          Check_E1;
  1587.          Validate_Non_Static_Attribute_Function_Call;
  1588.  
  1589.          if Present (TSS (P_Type, Name_uInput)) then
  1590.             Rewrite_Substitute_Tree (N,
  1591.               Make_Function_Call (Loc,
  1592.                 Name => New_Occurrence_Of (TSS (P_Type, Name_uInput), Loc),
  1593.                 Parameter_Associations => Exprs));
  1594.             Analyze (N);
  1595.          else
  1596.             Unimplemented_Attribute;
  1597.          end if;
  1598.  
  1599.  
  1600.       -------------------
  1601.       -- Integer_Value --
  1602.       -------------------
  1603.  
  1604.       when Attribute_Integer_Value =>
  1605.          Check_E1;
  1606.          Check_Integer_Type;
  1607.          Resolve (E1, Any_Fixed);
  1608.  
  1609.       -----------
  1610.       -- Large --
  1611.       -----------
  1612.  
  1613.       when Attribute_Large =>
  1614.          Check_Floating_Point_Type_0;
  1615.          Set_Etype (N, Universal_Real);
  1616.  
  1617.       ----------
  1618.       -- Last --
  1619.       ----------
  1620.  
  1621.       when Attribute_Last =>
  1622.          Check_Array_Or_Scalar_Type;
  1623.  
  1624.       --------------
  1625.       -- Last_Bit --
  1626.       --------------
  1627.  
  1628.       when Attribute_Last_Bit =>
  1629.          Check_Component;
  1630.          Set_Etype (N, Universal_Integer);
  1631.  
  1632.       ------------------
  1633.       -- Leading_Part --
  1634.       ------------------
  1635.  
  1636.       when Attribute_Leading_Part =>
  1637.          Check_Floating_Point_Type_2;
  1638.          Set_Etype (N, P_Base_Type);
  1639.          Resolve (E1, P_Base_Type);
  1640.          Resolve (E2, Any_Integer);
  1641.  
  1642.       ------------
  1643.       -- Length --
  1644.       ------------
  1645.  
  1646.       when Attribute_Length =>
  1647.          Check_Array_Type;
  1648.          Set_Etype (N, Universal_Integer);
  1649.  
  1650.       -------------
  1651.       -- Machine --
  1652.       -------------
  1653.  
  1654.       when Attribute_Machine =>
  1655.          Check_Floating_Point_Type_1;
  1656.          Set_Etype (N, P_Base_Type);
  1657.          Resolve (E1, P_Base_Type);
  1658.  
  1659.       ------------------
  1660.       -- Machine_Emax --
  1661.       ------------------
  1662.  
  1663.       when Attribute_Machine_Emax =>
  1664.          Check_Floating_Point_Type_0;
  1665.          Set_Etype (N, Universal_Integer);
  1666.  
  1667.       ------------------
  1668.       -- Machine_Emin --
  1669.       ------------------
  1670.  
  1671.       when Attribute_Machine_Emin =>
  1672.          Check_Floating_Point_Type_0;
  1673.          Set_Etype (N, Universal_Integer);
  1674.  
  1675.       ----------------------
  1676.       -- Machine_Mantissa --
  1677.       ----------------------
  1678.  
  1679.       when Attribute_Machine_Mantissa =>
  1680.          Check_Floating_Point_Type_0;
  1681.          Set_Etype (N, Universal_Integer);
  1682.  
  1683.       -----------------------
  1684.       -- Machine_Overflows --
  1685.       -----------------------
  1686.  
  1687.       when Attribute_Machine_Overflows =>
  1688.          Check_Floating_Point_Type_0;
  1689.          Set_Etype (N, Standard_Boolean);
  1690.  
  1691.       -------------------
  1692.       -- Machine_Radix --
  1693.       -------------------
  1694.  
  1695.       when Attribute_Machine_Radix =>
  1696.          Check_Real_Type;
  1697.          Check_E0;
  1698.          Set_Etype (N, Universal_Integer);
  1699.  
  1700.       --------------------
  1701.       -- Machine_Rounds --
  1702.       --------------------
  1703.  
  1704.       when Attribute_Machine_Rounds =>
  1705.          Check_Floating_Point_Type_0;
  1706.          Set_Etype (N, Standard_Boolean);
  1707.  
  1708.       --------------
  1709.       -- Mantissa --
  1710.       --------------
  1711.  
  1712.       when Attribute_Mantissa =>
  1713.          Check_Floating_Point_Type_0;
  1714.          Set_Etype (N, Universal_Integer);
  1715.  
  1716.       ---------
  1717.       -- Max --
  1718.       ---------
  1719.  
  1720.       when Attribute_Max =>
  1721.          Check_E2;
  1722.          Check_Scalar_Type;
  1723.          Resolve (E1, P_Base_Type);
  1724.          Resolve (E2, P_Base_Type);
  1725.          Set_Etype (N, P_Base_Type);
  1726.  
  1727.       ----------------------------
  1728.       -- Max_Interrupt_Priority --
  1729.       ----------------------------
  1730.  
  1731.       when Attribute_Max_Interrupt_Priority =>
  1732.          Standard_Attribute (Ttypes.System_Max_Interrupt_Priority);
  1733.  
  1734.       ------------------
  1735.       -- Max_Priority --
  1736.       ------------------
  1737.  
  1738.       when Attribute_Max_Priority =>
  1739.          Standard_Attribute (Ttypes.System_Max_Priority);
  1740.  
  1741.       ----------------------------------
  1742.       -- Max_Size_In_Storage_Elements --
  1743.       ----------------------------------
  1744.  
  1745.       when Attribute_Max_Size_In_Storage_Elements =>
  1746.          Check_E0;
  1747.          Check_Type;
  1748.          Set_Etype (N, Universal_Integer);
  1749.  
  1750.       -----------------------
  1751.       -- Maximum_Alignment --
  1752.       -----------------------
  1753.  
  1754.       when Attribute_Maximum_Alignment =>
  1755.          Standard_Attribute (Ttypes.Maximum_Alignment);
  1756.  
  1757.       ---------
  1758.       -- Min --
  1759.       ---------
  1760.  
  1761.       when Attribute_Min =>
  1762.          Check_E2;
  1763.          Check_Scalar_Type;
  1764.          Resolve (E1, P_Base_Type);
  1765.          Resolve (E2, P_Base_Type);
  1766.          Set_Etype (N, P_Base_Type);
  1767.  
  1768.       -----------
  1769.       -- Model --
  1770.       -----------
  1771.  
  1772.       when Attribute_Model =>
  1773.          Check_Floating_Point_Type_1;
  1774.          Set_Etype (N, P_Base_Type);
  1775.          Resolve (E1, P_Base_Type);
  1776.  
  1777.       ----------------
  1778.       -- Model_Emin --
  1779.       ----------------
  1780.  
  1781.       when Attribute_Model_Emin =>
  1782.          Check_Floating_Point_Type_0;
  1783.          Set_Etype (N, Universal_Integer);
  1784.  
  1785.       -------------------
  1786.       -- Model_Epsilon --
  1787.       -------------------
  1788.  
  1789.       when Attribute_Model_Epsilon =>
  1790.          Check_Floating_Point_Type_0;
  1791.          Set_Etype (N, Universal_Real);
  1792.  
  1793.       --------------------
  1794.       -- Model_Mantissa --
  1795.       --------------------
  1796.  
  1797.       when Attribute_Model_Mantissa =>
  1798.          Check_Floating_Point_Type_0;
  1799.          Set_Etype (N, Universal_Integer);
  1800.  
  1801.       -----------------
  1802.       -- Model_Small --
  1803.       -----------------
  1804.  
  1805.       when Attribute_Model_Small =>
  1806.          Check_Floating_Point_Type_0;
  1807.          Set_Etype (N, Universal_Real);
  1808.  
  1809.       -------------
  1810.       -- Modulus --
  1811.       -------------
  1812.  
  1813.       when Attribute_Modulus =>
  1814.          Check_Type;
  1815.  
  1816.          if not Is_Modular_Integer_Type (P_Type) then
  1817.             Error_Attr ("prefix of % attribute must be modular type", P);
  1818.          end if;
  1819.  
  1820.          Set_Etype (N, Universal_Integer);
  1821.  
  1822.       ------------
  1823.       -- Output --
  1824.       ------------
  1825.  
  1826.       when Attribute_Output =>
  1827.          Check_E2;
  1828.          Validate_Non_Static_Attribute_Function_Call;
  1829.  
  1830.          if Present (TSS (P_Type, Name_uOutput)) then
  1831.  
  1832.             declare
  1833.                Proc_Call : Node_Id := Parent (N);
  1834.  
  1835.             begin
  1836.                Set_Parameter_Associations (Proc_Call, Exprs);
  1837.                Rewrite_Substitute_Tree (N,
  1838.                  New_Occurrence_Of (TSS (P_Type, Name_uOutput), Loc));
  1839.                Analyze (N);
  1840.             end;
  1841.  
  1842.          else
  1843.             Unimplemented_Attribute;
  1844.          end if;
  1845.  
  1846.       ------------------
  1847.       -- Partition_ID --
  1848.       ------------------
  1849.  
  1850.       --  Probably this should be moved to Sem_Dist ???
  1851.  
  1852.       when Attribute_Partition_ID => Partition_ID : declare
  1853.          Ety            : Entity_Id;
  1854.          Nd             : Node_Id;
  1855.          Get_Pt_Id      : Node_Id;
  1856.          Get_Pt_Id_Call : Node_Id;
  1857.          Prefix_String  : String_Id;
  1858.          Interface_Name : Name_Id;
  1859.  
  1860.          procedure Add_Interface_To (C_Unit : Node_Id);
  1861.          --  Load, analyze and add the package System.Rpc.Partition_Interface
  1862.          --  to the context clauses of the enclosing library unit
  1863.  
  1864.          function Find_Lib_Unit_Entity (Lib_Unit : Node_Id)
  1865.            return Entity_Id;
  1866.          --  Retrieve the entity for various kinds of library unit nodes
  1867.          --  that have different structure.
  1868.  
  1869.          procedure Add_Interface_To (C_Unit : Node_Id) is
  1870.             Contexts       : List_Id := Context_Items (C_Unit);
  1871.             Lib_Unit       : Node_Id;
  1872.             Withn          : Node_Id;
  1873.             Uname          : Unit_Name_Type;
  1874.             Unum           : Unit_Number_Type;
  1875.             UEntity        : Entity_Id;
  1876.             Withed         : Boolean := False;
  1877.             Context        : Node_Id;
  1878.  
  1879.             procedure Failure (S : String);
  1880.             --  Internal procedure called if an error occurs. The parameter
  1881.             --  is a detailed error message that is to be given
  1882.  
  1883.             -------------
  1884.             -- Failure --
  1885.             -------------
  1886.  
  1887.             procedure Failure (S : String) is
  1888.             begin
  1889.                Set_Standard_Error;
  1890.  
  1891.                Write_Str ("fatal error: runtime library configuration error");
  1892.                Write_Eol;
  1893.                Write_Char ('"');
  1894.                Write_Name (Get_File_Name (Uname));
  1895.                Write_Str (""" (");
  1896.                Write_Str (S);
  1897.                Write_Char (')');
  1898.                Write_Eol;
  1899.                Set_Standard_Output;
  1900.                raise Unrecoverable_Error;
  1901.             end Failure;
  1902.  
  1903.          --  Start of processing for Add_Interface_To
  1904.  
  1905.          begin
  1906.             Name_Buffer (1 .. 32) := "system.rpc.partition_interface%s";
  1907.             Name_Len := 32;
  1908.             Uname := Name_Find;
  1909.             Unum := Load_Unit (Uname, False, Empty);
  1910.  
  1911.             if Unum = No_Unit then
  1912.                Failure ("unit not found");
  1913.             elsif Fatal_Error (Unum) then
  1914.                Failure ("parser errors");
  1915.             end if;
  1916.  
  1917.             --  Make sure that the unit is analyzed
  1918.  
  1919.             if not Analyzed (Cunit (Unum)) then
  1920.                Semantics (Cunit (Unum));
  1921.  
  1922.                if Fatal_Error (Unum) then
  1923.                   Failure ("semantic errors");
  1924.                end if;
  1925.             end if;
  1926.  
  1927.             Lib_Unit := Unit (Cunit (Unum));
  1928.  
  1929.             UEntity := Defining_Unit_Simple_Name (Specification (Lib_Unit));
  1930.  
  1931.             --  Add to the context clause
  1932.  
  1933.             if Contexts /= No_List then
  1934.                Context := First (Contexts);
  1935.                while Present (Context) and not Withed loop
  1936.                   Withed := Nkind (Context) = N_With_Clause and then
  1937.                     Find_Lib_Unit_Entity (Unit (Library_Unit (Context)))
  1938.                       = UEntity;
  1939.                   Context := Next (Context);
  1940.                end loop;
  1941.             end if;
  1942.             if not Withed then
  1943.                Withn :=
  1944.                  Make_With_Clause (Standard_Location,
  1945.                    Name => New_Reference_To (UEntity, Standard_Location));
  1946.                Set_Library_Unit          (Withn, Cunit (Unum));
  1947.                Set_Corresponding_Spec    (Withn, UEntity);
  1948.                Set_First_Name            (Withn, True);
  1949.                Set_Implicit_With         (Withn, True);
  1950.                Mark_Rewrite_Insertion (Withn);
  1951.                Prepend (Withn, Contexts);
  1952.             end if;
  1953.          end Add_Interface_To;
  1954.  
  1955.          --------------------------
  1956.          -- Find_Lib_Unit_Entity --
  1957.          --------------------------
  1958.  
  1959.          function Find_Lib_Unit_Entity (Lib_Unit : Node_Id)
  1960.            return Entity_Id
  1961.          is
  1962.          begin
  1963.             if Nkind (Lib_Unit) in N_Generic_Instantiation
  1964.               or else Nkind (Lib_Unit)  = N_Package_Renaming_Declaration
  1965.               or else Nkind (Lib_Unit) in N_Generic_Renaming_Declaration
  1966.             then
  1967.                return Defining_Unit_Simple_Name (Lib_Unit);
  1968.  
  1969.             else
  1970.                return Defining_Unit_Simple_Name (Specification (Lib_Unit));
  1971.             end if;
  1972.          end Find_Lib_Unit_Entity;
  1973.  
  1974.       --  Processing for Partition_ID
  1975.  
  1976.       begin
  1977.          Check_E0;
  1978.  
  1979.          if P_Type /= Any_Type then
  1980.             if not Is_Library_Level_Entity (Entity (P)) then
  1981.                Error_Attr
  1982.                  ("prefix of % attribute must be library-level entity", P);
  1983.  
  1984.             --  The defining entity of prefix should not be declared inside
  1985.             --  a Pure unit. RM E.1(8).
  1986.             --  The Is_Pure flag has been set during declaration.
  1987.  
  1988.             elsif Is_Entity_Name (P)
  1989.               and then Is_Pure (Entity (P))
  1990.             then
  1991.                Error_Attr
  1992.                  ("prefix of % attribute must not be declared pure", P);
  1993.             end if;
  1994.          end if;
  1995.  
  1996.          Ety := Entity (P);
  1997.  
  1998.          --  In case prefix is not a library unit entity, get the entity
  1999.          --  of library unit.
  2000.  
  2001.          while (Present (Scope (Ety))
  2002.            and then Scope (Ety) /= Standard_Standard)
  2003.            and not Is_Child_Unit (Ety)
  2004.          loop
  2005.             Ety := Scope (Ety);
  2006.          end loop;
  2007.  
  2008.          Nd := Enclosing_Lib_Unit_Node (N);
  2009.  
  2010.          --  Add System.Rpc.Partition_Interface to the context clauses of the
  2011.          --  enclosing library unit in which the attribute is used
  2012.  
  2013.          Add_Interface_To (Nd);
  2014.  
  2015.          --  Build a node for System.RPC.Partition_Interface.Get_Partition_Id
  2016.  
  2017.          Name_Len := 19;
  2018.          Name_Buffer (1 .. Name_Len) := "partition_interface";
  2019.          Interface_Name := Name_Find;
  2020.  
  2021.          --  Set the right function to call
  2022.  
  2023.          if Is_Remote_Call_Interface (Ety) then
  2024.             Name_Len := 23;
  2025.             Name_Buffer (1 .. Name_Len) := "get_active_partition_id";
  2026.  
  2027.          elsif Is_Shared_Passive (Ety) then
  2028.             Name_Len := 24;
  2029.             Name_Buffer (1 .. Name_Len) := "get_passive_partition_id";
  2030.          else
  2031.             Name_Len := 22;
  2032.             Name_Buffer (1 .. Name_Len) := "get_local_partition_id";
  2033.          end if;
  2034.  
  2035.          Get_Pt_Id :=
  2036.            Make_Selected_Component (Loc,
  2037.              Prefix =>
  2038.                Make_Selected_Component (Loc,
  2039.                  Prefix =>
  2040.                    Make_Selected_Component (Loc,
  2041.                      Prefix => Make_Identifier (Loc, Name_System),
  2042.                      Selector_Name => Make_Identifier (Loc, Name_Rpc)),
  2043.                  Selector_Name =>
  2044.                    Make_Identifier (Loc, Interface_Name)),
  2045.              Selector_Name => Make_Identifier (Loc, Name_Find));
  2046.  
  2047.          --  Get and store the String_Id corresponding to the name of the
  2048.          --  library unit whose Partition_ID is needed
  2049.  
  2050.          Get_Unit_Name_String (Get_Unit_Name (Get_Declaration_Node (Ety)));
  2051.          Name_Len := Name_Len - 7;
  2052.          --  Remove seven last character ("(spec)" or " (body)").
  2053.  
  2054.          Start_String;
  2055.          Store_String_Chars (Name_Buffer (1 .. Name_Len));
  2056.          Prefix_String := End_String;
  2057.  
  2058.          --  Build the function call which will replace the attribute
  2059.  
  2060.          if Is_Remote_Call_Interface (Ety) or Is_Shared_Passive (Ety) then
  2061.  
  2062.             Get_Pt_Id_Call :=
  2063.               Make_Function_Call (Loc,
  2064.                 Name => Get_Pt_Id,
  2065.                 Parameter_Associations =>
  2066.                   New_List (Make_String_Literal (Loc, Prefix_String)));
  2067.  
  2068.          else
  2069.             Get_Pt_Id_Call := Make_Function_Call (Loc, Get_Pt_Id);
  2070.  
  2071.          end if;
  2072.  
  2073.          --  Replace the attribute node by the function call
  2074.  
  2075.          Rewrite_Substitute_Tree (N, Get_Pt_Id_Call);
  2076.          Analyze (N);
  2077.  
  2078.       end Partition_ID;
  2079.  
  2080.       -------------------------
  2081.       -- Passed_By_Reference --
  2082.       -------------------------
  2083.  
  2084.       when Attribute_Passed_By_Reference =>
  2085.          Check_E0;
  2086.          Check_Type;
  2087.          Set_Etype (N, Standard_Boolean);
  2088.  
  2089.       ---------
  2090.       -- Pos --
  2091.       ---------
  2092.  
  2093.       when Attribute_Pos =>
  2094.          Check_Discrete_Attribute;
  2095.          Set_Etype (N, Universal_Integer);
  2096.  
  2097.       --------------
  2098.       -- Position --
  2099.       --------------
  2100.  
  2101.       when Attribute_Position =>
  2102.          Check_Component;
  2103.          Set_Etype (N, Universal_Integer);
  2104.  
  2105.       ----------
  2106.       -- Pred --
  2107.       ----------
  2108.  
  2109.       when Attribute_Pred =>
  2110.          Check_Scalar_Type;
  2111.          Check_E1;
  2112.          Resolve (E1, P_Type);
  2113.          Set_Etype (N, P_Base_Type);
  2114.  
  2115.          if Is_Real_Type (P_Type) then
  2116.             Note_Feature (Pred_Succ_Attribute_For_Real, Loc);
  2117.  
  2118.          --  If not real type, test for overflow check required.
  2119.  
  2120.          else
  2121.             if not Range_Checks_Suppressed (P_Base_Type) then
  2122.                Set_Do_Range_Check (E1);
  2123.             end if;
  2124.          end if;
  2125.  
  2126.       -----------
  2127.       -- Range --
  2128.       -----------
  2129.  
  2130.       when Attribute_Range =>
  2131.          Check_Array_Or_Scalar_Type;
  2132.  
  2133.          if Ada_83
  2134.            and then Is_Scalar_Type (P_Type)
  2135.            and then Comes_From_Source (N)
  2136.          then
  2137.             Error_Attr
  2138.               ("(Ada 83) % attribute not allowed for scalar type", P);
  2139.          end if;
  2140.  
  2141.       ------------------
  2142.       -- Range_Length --
  2143.       ------------------
  2144.  
  2145.       when Attribute_Range_Length =>
  2146.          Check_Discrete_Type;
  2147.          Set_Etype (N, Universal_Integer);
  2148.  
  2149.       ----------
  2150.       -- Read --
  2151.       ----------
  2152.  
  2153.       when Attribute_Read =>
  2154.          Check_E2;
  2155.          Validate_Non_Static_Attribute_Function_Call;
  2156.  
  2157.          if Present (TSS (P_Type, Name_uRead)) then
  2158.  
  2159.             declare
  2160.                Proc_Call : Node_Id := Parent (N);
  2161.  
  2162.             begin
  2163.                Set_Parameter_Associations (Proc_Call, Exprs);
  2164.                Rewrite_Substitute_Tree (N,
  2165.                  New_Occurrence_Of (TSS (P_Type, Name_uRead), Loc));
  2166.                Analyze (N);
  2167.             end;
  2168.          else
  2169.  
  2170.             Unimplemented_Attribute;
  2171.          end if;
  2172.  
  2173.       ---------------
  2174.       -- Remainder --
  2175.       ---------------
  2176.  
  2177.       when Attribute_Remainder =>
  2178.          Check_Floating_Point_Type_2;
  2179.          Set_Etype (N, P_Base_Type);
  2180.          Resolve (E1, P_Base_Type);
  2181.          Resolve (E2, P_Base_Type);
  2182.  
  2183.       -----------
  2184.       -- Round --
  2185.       -----------
  2186.  
  2187.       when Attribute_Round =>
  2188.          Check_E1;
  2189.          Check_Decimal_Fixed_Point_Type;
  2190.          Resolve (E1, Any_Real);
  2191.  
  2192.       --------------
  2193.       -- Rounding --
  2194.       --------------
  2195.  
  2196.       when Attribute_Rounding =>
  2197.          Check_Floating_Point_Type_1;
  2198.          Set_Etype (N, P_Base_Type);
  2199.          Resolve (E1, P_Base_Type);
  2200.  
  2201.       ---------------
  2202.       -- Safe_Emax --
  2203.       ---------------
  2204.  
  2205.       when Attribute_Safe_Emax =>
  2206.          Check_Floating_Point_Type_0;
  2207.          Set_Etype (N, Universal_Integer);
  2208.  
  2209.       ----------------
  2210.       -- Safe_First --
  2211.       ----------------
  2212.  
  2213.       when Attribute_Safe_First =>
  2214.          Check_Floating_Point_Type_0;
  2215.          Set_Etype (N, Universal_Real);
  2216.  
  2217.       ----------------
  2218.       -- Safe_Large --
  2219.       ----------------
  2220.  
  2221.       when Attribute_Safe_Large =>
  2222.          Check_Floating_Point_Type_0;
  2223.          Set_Etype (N, Universal_Real);
  2224.  
  2225.       ---------------
  2226.       -- Safe_Last --
  2227.       ---------------
  2228.  
  2229.       when Attribute_Safe_Last =>
  2230.          Check_Floating_Point_Type_0;
  2231.          Set_Etype (N, Universal_Real);
  2232.  
  2233.       ----------------
  2234.       -- Safe_Small --
  2235.       ----------------
  2236.  
  2237.       when Attribute_Safe_Small =>
  2238.          Check_Floating_Point_Type_0;
  2239.          Set_Etype (N, Universal_Real);
  2240.  
  2241.       -----------
  2242.       -- Scale --
  2243.       -----------
  2244.  
  2245.       when Attribute_Scale =>
  2246.          Check_E0;
  2247.          Check_Decimal_Fixed_Point_Type;
  2248.          Set_Etype (N, Universal_Integer);
  2249.  
  2250.       -------------
  2251.       -- Scaling --
  2252.       -------------
  2253.  
  2254.       when Attribute_Scaling =>
  2255.          Check_Floating_Point_Type_2;
  2256.          Set_Etype (N, P_Base_Type);
  2257.          Resolve (E1, P_Base_Type);
  2258.  
  2259.       ------------------
  2260.       -- Signed_Zeros --
  2261.       ------------------
  2262.  
  2263.       when Attribute_Signed_Zeros =>
  2264.          Check_Floating_Point_Type_0;
  2265.          Set_Etype (N, Standard_Boolean);
  2266.  
  2267.       ----------
  2268.       -- Size --
  2269.       ----------
  2270.  
  2271.       when Attribute_Size =>
  2272.          Check_E0;
  2273.          Set_Etype (N, Universal_Integer);
  2274.  
  2275.       -----------
  2276.       -- Small --
  2277.       -----------
  2278.  
  2279.       when Attribute_Small =>
  2280.          Check_Fixed_Point_Type_0;
  2281.          Set_Etype (N, Universal_Real);
  2282.  
  2283.       ------------------
  2284.       -- Storage_Pool --
  2285.       ------------------
  2286.  
  2287.       when Attribute_Storage_Pool =>
  2288.          if Is_Access_Type (P_Type) then
  2289.             Check_E0;
  2290.             Set_Etype (N, Class_Wide_Type (RTE (RE_Root_Storage_Pool)));
  2291.  
  2292.             --  Validate_Remote_Access_To_Class_Wide_Type for attribute
  2293.             --  Storage_Pool since this attribute is not defined for such
  2294.             --  types (RM E.2.3(22)).
  2295.  
  2296.             Validate_Remote_Access_To_Class_Wide_Type (N);
  2297.  
  2298.          else
  2299.             Error_Attr ("prefix of % attribute must be access type", P);
  2300.          end if;
  2301.  
  2302.       ------------------
  2303.       -- Storage_Size --
  2304.       ------------------
  2305.  
  2306.       when Attribute_Storage_Size =>
  2307.  
  2308.          if Is_Task_Type (P_Type) then
  2309.             Check_E0;
  2310.             Set_Etype (N, Universal_Integer);
  2311.  
  2312.          elsif Is_Access_Type (P_Type) then
  2313.             Check_E0;
  2314.             Check_Type;
  2315.             Set_Etype (N, Universal_Integer);
  2316.  
  2317.             --   Validate_Remote_Access_To_Class_Wide_Type for attribute
  2318.             --   Storage_Size since this attribute is not defined for
  2319.             --   such types (RM E.2.3(22)).
  2320.  
  2321.             Validate_Remote_Access_To_Class_Wide_Type (N);
  2322.  
  2323.          else
  2324.             Error_Attr
  2325.               ("prefix of % attribute must be access or task type", P);
  2326.          end if;
  2327.  
  2328.       ------------------
  2329.       -- Storage_Unit --
  2330.       ------------------
  2331.  
  2332.       when Attribute_Storage_Unit =>
  2333.          Standard_Attribute (Ttypes.System_Storage_Unit);
  2334.  
  2335.       ----------
  2336.       -- Succ --
  2337.       ----------
  2338.  
  2339.       when Attribute_Succ =>
  2340.          Check_Scalar_Type;
  2341.          Check_E1;
  2342.          Resolve (E1, P_Type);
  2343.          Set_Etype (N, P_Base_Type);
  2344.  
  2345.          if Is_Real_Type (P_Type) then
  2346.             Note_Feature (Pred_Succ_Attribute_For_Real, Loc);
  2347.  
  2348.          --  If not real type, test for overflow check required.
  2349.  
  2350.          else
  2351.             if not Range_Checks_Suppressed (P_Base_Type) then
  2352.                Set_Do_Range_Check (E1);
  2353.             end if;
  2354.          end if;
  2355.  
  2356.       ---------
  2357.       -- Tag --
  2358.       ---------
  2359.  
  2360.       when Attribute_Tag =>
  2361.          Check_E0;
  2362.          if not Is_Tagged_Type (P_Type) then
  2363.             Error_Attr ("prefix of % attribute must be tagged", P);
  2364.          end if;
  2365.  
  2366.          Set_Etype (N, RTE (RE_Tag));
  2367.  
  2368.       ----------------
  2369.       -- Terminated --
  2370.       ----------------
  2371.  
  2372.       when Attribute_Terminated =>
  2373.          Check_E0;
  2374.          Set_Etype (N, Standard_Boolean);
  2375.          Check_Task_Prefix;
  2376.  
  2377.       ----------
  2378.       -- Tick --
  2379.       ----------
  2380.  
  2381.       when Attribute_Tick =>
  2382.          Check_Standard_Prefix;
  2383.          Rewrite_Substitute_Tree (N,
  2384.            Make_Real_Literal (Loc,
  2385.              UR_From_Components (
  2386.                Num   => UI_From_Int (Ttypes.System_Tick_Nanoseconds),
  2387.                Den   => UI_From_Int (9),
  2388.                Rbase => 10)));
  2389.          Analyze (N);
  2390.  
  2391.       ----------------
  2392.       -- Truncation --
  2393.       ----------------
  2394.  
  2395.       when Attribute_Truncation =>
  2396.          Check_Floating_Point_Type_1;
  2397.          Resolve (E1, P_Base_Type);
  2398.          Set_Etype (N, P_Base_Type);
  2399.  
  2400.       -----------------------
  2401.       -- Unbiased_Rounding --
  2402.       -----------------------
  2403.  
  2404.       when Attribute_Unbiased_Rounding =>
  2405.          Check_Floating_Point_Type_1;
  2406.          Set_Etype (N, P_Base_Type);
  2407.          Resolve (E1, P_Base_Type);
  2408.  
  2409.       ----------------------
  2410.       -- Unchecked_Access --
  2411.       ----------------------
  2412.  
  2413.       when Attribute_Unchecked_Access =>
  2414.          Access_Attribute;
  2415.  
  2416.       ------------------------------
  2417.       -- Universal_Literal_String --
  2418.       ------------------------------
  2419.  
  2420.       --  This is a GNAT specific attribute whose prefix must be a named
  2421.       --  number where the expression is either a single numeric literal,
  2422.       --  or a numeric literal immediately preceded by a minus sign. The
  2423.       --  result is equivalent to a string literal containing the text of
  2424.       --  the literal as it appeared in the source program with a possible
  2425.       --  leading minus sign.
  2426.  
  2427.       when Attribute_Universal_Literal_String => Universal_Literal_String :
  2428.       begin
  2429.          Check_E0;
  2430.  
  2431.          if not Is_Entity_Name (P)
  2432.            or else Ekind (Entity (P)) not in Named_Kind
  2433.          then
  2434.             Error_Attr ("prefix for % attribute must be named number", P);
  2435.  
  2436.          else
  2437.             declare
  2438.                Expr     : Node_Id;
  2439.                Negative : Boolean;
  2440.                S        : Source_Ptr;
  2441.                Src      : Source_Buffer_Ptr;
  2442.  
  2443.             begin
  2444.                Expr := Original_Node (Expression (Parent (Entity (P))));
  2445.  
  2446.                if Nkind (Expr) = N_Op_Minus then
  2447.                   Negative := True;
  2448.                   Expr := Original_Node (Right_Opnd (Expr));
  2449.                else
  2450.                   Negative := False;
  2451.                end if;
  2452.  
  2453.                if Nkind (Expr) /= N_Integer_Literal
  2454.                  and then Nkind (Expr) /= N_Real_Literal
  2455.                then
  2456.                   Error_Attr
  2457.                     ("named number for % attribute must be simple literal", N);
  2458.                end if;
  2459.  
  2460.                --  Build string literal corresponding to source literal text
  2461.  
  2462.                Start_String;
  2463.  
  2464.                if Negative then
  2465.                   Store_String_Char (Get_Char_Code ('-'));
  2466.                end if;
  2467.  
  2468.                S := Sloc (Expr);
  2469.                Src := Source_Text (Get_Source_File_Index (S));
  2470.  
  2471.                while Src (S) /= ';' and then Src (S) /= ' ' loop
  2472.                   Store_String_Char (Get_Char_Code (Src (S)));
  2473.                   S := S + 1;
  2474.                end loop;
  2475.  
  2476.                --  Now we rewrite the attribute with the string literal
  2477.  
  2478.                Rewrite_Substitute_Tree (N,
  2479.                  Make_String_Literal (Loc, End_String));
  2480.                Analyze (N);
  2481.             end;
  2482.          end if;
  2483.       end Universal_Literal_String;
  2484.  
  2485.       -------------------------
  2486.       -- Unrestricted_Access --
  2487.       -------------------------
  2488.  
  2489.       --  This is a GNAT specific attribute which is like Access except that
  2490.       --  all scope checks and checks for aliased views are omitted.
  2491.  
  2492.       when Attribute_Unrestricted_Access =>
  2493.          Access_Attribute;
  2494.  
  2495.       ---------
  2496.       -- Val --
  2497.       ---------
  2498.  
  2499.       when Attribute_Val => Val : declare
  2500.       begin
  2501.          Check_E1;
  2502.          Check_Discrete_Type;
  2503.  
  2504.          if not Is_Integer_Type (Etype (E1)) then
  2505.             Error_Attr ("argument of % attribute is not integer type", N);
  2506.  
  2507.          else
  2508.             Resolve (E1, Etype (E1));
  2509.          end if;
  2510.  
  2511.          Set_Etype (N, P_Base_Type);
  2512.  
  2513.          if not Range_Checks_Suppressed (P_Base_Type) then
  2514.             Set_Do_Range_Check (E1);
  2515.          end if;
  2516.       end Val;
  2517.  
  2518.       -----------
  2519.       -- Valid --
  2520.       -----------
  2521.  
  2522.       when Attribute_Valid =>
  2523.          Check_E0;
  2524.          Check_Object_Reference;
  2525.  
  2526.          if not Is_Scalar_Type (P_Type) then
  2527.             Error_Attr ("object for % attribute must be of scalar type", P);
  2528.          end if;
  2529.  
  2530.          Set_Etype (N, Standard_Boolean);
  2531.  
  2532.       -----------
  2533.       -- Value --
  2534.       -----------
  2535.  
  2536.       when Attribute_Value => Value :
  2537.       begin
  2538.          Check_E1;
  2539.          Check_Scalar_Type;
  2540.  
  2541.          if Is_Floating_Point_Type (P_Type) then
  2542.             Note_Feature (Value_Attribute_For_Real, Loc);
  2543.          end if;
  2544.  
  2545.          --  Set Etype before resolving expression because expansion
  2546.          --  of expression may require enclosing type.
  2547.  
  2548.          Set_Etype (N, P_Type);
  2549.          Resolve (E1, Standard_String);
  2550.          Validate_Non_Static_Attribute_Function_Call;
  2551.       end Value;
  2552.  
  2553.       -------------
  2554.       -- Version --
  2555.       -------------
  2556.  
  2557.       when Attribute_Version =>
  2558.          Check_E0;
  2559.          Check_Library_Unit;
  2560.          Set_Etype (N, RTE (RE_Version_String));
  2561.  
  2562.       ----------------
  2563.       -- Wide_Image --
  2564.       ----------------
  2565.  
  2566.       when Attribute_Wide_Image => Wide_Image :
  2567.       begin
  2568.          Check_Scalar_Type;
  2569.          Set_Etype (N, Standard_Wide_String);
  2570.  
  2571.          if not Is_Real_Type (P_Type) then
  2572.             Check_Discrete_Attribute;
  2573.          end if;
  2574.  
  2575.          Validate_Non_Static_Attribute_Function_Call;
  2576.       end Wide_Image;
  2577.  
  2578.       ----------------
  2579.       -- Wide_Value --
  2580.       ----------------
  2581.  
  2582.       when Attribute_Wide_Value => Wide_Value :
  2583.       begin
  2584.          Check_E1;
  2585.          Check_Discrete_Type;
  2586.          Resolve (E1, Standard_Wide_String);
  2587.          Set_Etype (N, P_Type);
  2588.  
  2589.          if Is_Modular_Integer_Type (P_Type)
  2590.            or else Is_Real_Type (P_Type)
  2591.          then
  2592.             Unimplemented_Attribute;
  2593.          end if;
  2594.  
  2595.          Validate_Non_Static_Attribute_Function_Call;
  2596.       end Wide_Value;
  2597.  
  2598.       ----------------
  2599.       -- Wide_Width --
  2600.       ----------------
  2601.  
  2602.       when Attribute_Wide_Width =>
  2603.          Check_E0;
  2604.          Check_Scalar_Type;
  2605.          Set_Etype (N, Universal_Integer);
  2606.  
  2607.       -----------
  2608.       -- Width --
  2609.       -----------
  2610.  
  2611.       when Attribute_Width =>
  2612.          Check_E0;
  2613.          Check_Scalar_Type;
  2614.          Set_Etype (N, Universal_Integer);
  2615.  
  2616.       ---------------
  2617.       -- Word_Size --
  2618.       ---------------
  2619.  
  2620.       when Attribute_Word_Size =>
  2621.          Standard_Attribute (System_Word_Size);
  2622.  
  2623.       -----------
  2624.       -- Write --
  2625.       -----------
  2626.  
  2627.       when Attribute_Write =>
  2628.          Check_E2;
  2629.          Validate_Non_Static_Attribute_Function_Call;
  2630.  
  2631.          if Present (TSS (P_Type, Name_uWrite)) then
  2632.  
  2633.             declare
  2634.                Proc_Call    : constant Node_Id := Parent (N);
  2635.  
  2636.             begin
  2637.                Set_Parameter_Associations (Proc_Call, Exprs);
  2638.                Rewrite_Substitute_Tree (N,
  2639.                  New_Occurrence_Of (TSS (P_Type, Name_uWrite), Loc));
  2640.                Analyze (N);
  2641.             end;
  2642.  
  2643.          else
  2644.  
  2645.             Unimplemented_Attribute;
  2646.          end if;
  2647.  
  2648.       end case;
  2649.  
  2650.    --  All errors raise Bad_Attribute, so that we get out before any further
  2651.    --  damage occurs when an error is detected (for example, if we check for
  2652.    --  one attribute expression, and the check succeeds, we want to be able
  2653.    --  to proceed securely assuming that an expression is in fact present.
  2654.  
  2655.    exception
  2656.       when Bad_Attribute =>
  2657.          Set_Etype (N, Any_Type);
  2658.          return;
  2659.  
  2660.    end Analyze_Attribute;
  2661.  
  2662.    --------------------
  2663.    -- Eval_Attribute --
  2664.    --------------------
  2665.  
  2666.    procedure Eval_Attribute (N : Node_Id) is
  2667.       Loc    : constant Source_Ptr   := Sloc (N);
  2668.       Aname  : constant Name_Id      := Attribute_Name (N);
  2669.       Id     : constant Attribute_Id := Get_Attribute_Id (Aname);
  2670.       P      : constant Node_Id      := Prefix (N);
  2671.  
  2672.       C_Type : constant Entity_Id := Etype (N);
  2673.       --  The type imposed by the context.
  2674.  
  2675.       E1 : Node_Id;
  2676.       --  First expression, or Empty if none
  2677.  
  2678.       E2 : Node_Id;
  2679.       --  Second expression, or Empty if none
  2680.  
  2681.       P_Entity : Entity_Id;
  2682.       --  Entity denoted by prefix
  2683.  
  2684.       P_Type : Entity_Id;
  2685.       --  The type of the prefix
  2686.  
  2687.       P_Root_Type : Entity_Id;
  2688.       --  The root type of type of the prefix
  2689.  
  2690.       Static : Boolean;
  2691.       --  True if prefix type is static
  2692.  
  2693.       Lo_Bound, Hi_Bound : Node_Id;
  2694.       --  Expressions for low and high bounds of type or array index referenced
  2695.       --  by First, Last, or Length attribute for array, set by Set_Bounds.
  2696.  
  2697.       CE_Node : Node_Id;
  2698.       --  Used to remember identity of expression raising constraint error
  2699.  
  2700.       function Aft_Value return Nat;
  2701.       --  Computes Aft value for current attribute prefix (used by Aft itself
  2702.       --  and also by Width for computing the Width of a fixed point type).
  2703.  
  2704.       procedure Check_Expressions;
  2705.       --  In case where the attribute is not foldable, the expressions, if
  2706.       --  any, of the attribute, are in a non-static context. This procedure
  2707.       --  performs the required additional checks.
  2708.  
  2709.       procedure Float_Attribute_Boolean
  2710.         (Short_Float_Val     : Boolean;
  2711.          Float_Val           : Boolean;
  2712.          Long_Float_Val      : Boolean;
  2713.          Long_Long_Float_Val : Boolean);
  2714.       --  This procedure evaluates a float attribute with no arguments that
  2715.       --  returns a Boolean result. The four parameters are the Boolean result
  2716.       --  values for the four possible floating-point root types. The prefix
  2717.       --  type is a floating-point type (and is thus not a generic type).
  2718.  
  2719.       procedure Float_Attribute_Universal_Integer
  2720.         (Short_Float_Val     : Int;
  2721.          Float_Val           : Int;
  2722.          Long_Float_Val      : Int;
  2723.          Long_Long_Float_Val : Int);
  2724.       --  This procedure evaluates a float attribute with no arguments that
  2725.       --  returns a universal integer result. All such results are easily
  2726.       --  within Int range, and the four parameters are the result values
  2727.       --  for the four possible floating-point root types. The prefix type
  2728.       --  is a floating-point type (and is thus not a generic type).
  2729.  
  2730.       procedure Float_Attribute_Universal_Real
  2731.         (Short_Float_Val     : String;
  2732.          Float_Val           : String;
  2733.          Long_Float_Val      : String;
  2734.          Long_Long_Float_Val : String);
  2735.       --  This procedure evaluates a float attribute with no arguments that
  2736.       --  returns a universal real result. The four parameters are strings
  2737.       --  that contain representations of the values required in normal
  2738.       --  real literal format with a possible leading minus sign. The prefix
  2739.       --  type is a floating-point type (and is thus not a generic type)
  2740.  
  2741.       function Fore_Value return Nat;
  2742.       --  Computes the Fore value for the current attribute prefix, which is
  2743.       --  known to be a static fixed-point type. Used by Fore and Width.
  2744.  
  2745.       procedure Set_Bounds;
  2746.       --  Used for First, Last and Length attributes applied to an array or
  2747.       --  array subtype. Sets the variables Index_Lo and Index_Hi to the low
  2748.       --  and high bound expressions for the index referenced by the attribute
  2749.       --  designator (i.e. the first index if no expression is present, and
  2750.       --  the N'th index if the value N is present as an expression).
  2751.  
  2752.       ---------------
  2753.       -- Aft_Value --
  2754.       ---------------
  2755.  
  2756.       function Aft_Value return Nat is
  2757.          Result    : Nat;
  2758.          Delta_Val : Ureal;
  2759.  
  2760.       begin
  2761.          Result := 1;
  2762.          Delta_Val := Delta_Value (P_Type);
  2763.  
  2764.          while Delta_Val < Ureal_Tenth loop
  2765.             Delta_Val := Delta_Val * Ureal_10;
  2766.             Result := Result + 1;
  2767.          end loop;
  2768.  
  2769.          return Result;
  2770.       end Aft_Value;
  2771.  
  2772.       -----------------------
  2773.       -- Check_Expressions --
  2774.       -----------------------
  2775.  
  2776.       procedure Check_Expressions is
  2777.          E : Node_Id := E1;
  2778.  
  2779.       begin
  2780.          while Present (E) loop
  2781.             Check_Non_Static_Context (E);
  2782.             E := Next (E);
  2783.          end loop;
  2784.       end Check_Expressions;
  2785.  
  2786.       -----------------------------
  2787.       -- Float_Attribute_Boolean --
  2788.       -----------------------------
  2789.  
  2790.       procedure Float_Attribute_Boolean
  2791.         (Short_Float_Val     : Boolean;
  2792.          Float_Val           : Boolean;
  2793.          Long_Float_Val      : Boolean;
  2794.          Long_Long_Float_Val : Boolean)
  2795.       is
  2796.          Val    : Boolean;
  2797.  
  2798.       begin
  2799.          if P_Root_Type = Standard_Short_Float then
  2800.             Val := Short_Float_Val;
  2801.          elsif P_Root_Type = Standard_Float then
  2802.             Val := Float_Val;
  2803.          elsif P_Root_Type = Standard_Long_Float then
  2804.             Val := Long_Float_Val;
  2805.          else
  2806.             pragma Assert (P_Root_Type = Standard_Long_Long_Float);
  2807.             Val := Long_Long_Float_Val;
  2808.          end if;
  2809.  
  2810.          if Val then
  2811.             Fold_Uint (N, Uint_1);
  2812.          else
  2813.             Fold_Uint (N, Uint_0);
  2814.          end if;
  2815.       end Float_Attribute_Boolean;
  2816.  
  2817.       ---------------------------------------
  2818.       -- Float_Attribute_Universal_Integer --
  2819.       ---------------------------------------
  2820.  
  2821.       procedure Float_Attribute_Universal_Integer
  2822.         (Short_Float_Val     : Int;
  2823.          Float_Val           : Int;
  2824.          Long_Float_Val      : Int;
  2825.          Long_Long_Float_Val : Int)
  2826.       is
  2827.          Val : Int;
  2828.  
  2829.       begin
  2830.          if P_Root_Type = Standard_Short_Float then
  2831.             Val := Short_Float_Val;
  2832.          elsif P_Root_Type = Standard_Float then
  2833.             Val := Float_Val;
  2834.          elsif P_Root_Type = Standard_Long_Float then
  2835.             Val := Long_Float_Val;
  2836.          else
  2837.             pragma Assert (P_Root_Type = Standard_Long_Long_Float);
  2838.             Val := Long_Long_Float_Val;
  2839.          end if;
  2840.  
  2841.          Fold_Uint (N, UI_From_Int (Val));
  2842.       end Float_Attribute_Universal_Integer;
  2843.  
  2844.       ------------------------------------
  2845.       -- Float_Attribute_Universal_Real --
  2846.       ------------------------------------
  2847.  
  2848.       procedure Float_Attribute_Universal_Real
  2849.         (Short_Float_Val     : String;
  2850.          Float_Val           : String;
  2851.          Long_Float_Val      : String;
  2852.          Long_Long_Float_Val : String)
  2853.       is
  2854.          Result : Node_Id;
  2855.  
  2856.       begin
  2857.          if P_Root_Type = Standard_Short_Float then
  2858.             Result := Real_Convert (Short_Float_Val);
  2859.          elsif P_Root_Type = Standard_Float then
  2860.             Result := Real_Convert (Float_Val);
  2861.          elsif P_Root_Type = Standard_Long_Float then
  2862.             Result := Real_Convert (Long_Float_Val);
  2863.          else
  2864.             pragma Assert (P_Root_Type = Standard_Long_Long_Float);
  2865.             Result := Real_Convert (Long_Long_Float_Val);
  2866.          end if;
  2867.  
  2868.          Rewrite_Substitute_Tree (N, Result);
  2869.          Analyze (N);
  2870.          Resolve (N, C_Type);
  2871.       end Float_Attribute_Universal_Real;
  2872.  
  2873.       ----------------
  2874.       -- Fore_Value --
  2875.       ----------------
  2876.  
  2877.       --  Note that the Fore calculation is based on the actual values
  2878.       --  of the bounds, and does not take into account possible rounding.
  2879.  
  2880.       function Fore_Value return Nat is
  2881.          Lo      : constant Uint  := Expr_Value (Type_Low_Bound (P_Type));
  2882.          Hi      : constant Uint  := Expr_Value (Type_High_Bound (P_Type));
  2883.          Small   : constant Ureal := Small_Value (P_Type);
  2884.          Lo_Real : constant Ureal := Lo * Small;
  2885.          Hi_Real : constant Ureal := Hi * Small;
  2886.          T       : Ureal;
  2887.          R       : Nat;
  2888.  
  2889.       begin
  2890.          --  Bounds are given in terms of small units, so first compute
  2891.          --  proper values as reals.
  2892.  
  2893.          T := UR_Max (abs Lo_Real, abs Hi_Real);
  2894.          R := 2;
  2895.  
  2896.          --  Loop to compute proper value if more than one digit required
  2897.  
  2898.          while T >= Ureal_10 loop
  2899.             R := R + 1;
  2900.             T := T / Ureal_10;
  2901.          end loop;
  2902.  
  2903.          return R;
  2904.       end Fore_Value;
  2905.  
  2906.       ----------------
  2907.       -- Set_Bounds --
  2908.       ----------------
  2909.  
  2910.       procedure Set_Bounds is
  2911.          N    : Nat;
  2912.          Indx : Node_Id;
  2913.          Ityp : Entity_Id;
  2914.  
  2915.       begin
  2916.          --  For non-array case, just get bounds of scalar type
  2917.  
  2918.          if Is_Scalar_Type (P_Type) then
  2919.             Ityp := P_Type;
  2920.  
  2921.          --  For array case, get type of proper index
  2922.  
  2923.          else
  2924.             if No (E1) then
  2925.                N := 1;
  2926.             else
  2927.                N := UI_To_Int (Expr_Value (E1));
  2928.             end if;
  2929.  
  2930.             Indx := First_Index (P_Type);
  2931.             while N > 1 loop
  2932.                Indx := Next_Index (Indx);
  2933.                N := N - 1;
  2934.             end loop;
  2935.  
  2936.             Ityp := Etype (Indx);
  2937.          end if;
  2938.  
  2939.          Lo_Bound := Type_Low_Bound (Ityp);
  2940.          Hi_Bound := Type_High_Bound (Ityp);
  2941.  
  2942.       end Set_Bounds;
  2943.  
  2944.    --------------------
  2945.    -- Eval_Attribute --
  2946.    --------------------
  2947.  
  2948.    begin
  2949.       --  Acquire first two expressions (at the moment, no attributes
  2950.       --  take more than two expressions in any case).
  2951.  
  2952.       if Present (Expressions (N)) then
  2953.          E1 := First (Expressions (N));
  2954.          E2 := Next (E1);
  2955.       else
  2956.          E1 := Empty;
  2957.          E2 := Empty;
  2958.       end if;
  2959.  
  2960.       --  Attribute definitely is not foldable if prefix is not an entity
  2961.  
  2962.       if not Is_Entity_Name (P) then
  2963.          Check_Expressions;
  2964.          return;
  2965.       else
  2966.          P_Entity := Entity (P);
  2967.       end if;
  2968.  
  2969.       --  First foldable possibility is a scalar or array type (RM 4.9(7))
  2970.       --  that is not generic (generic types are eliminated by RM 4.9(25)).
  2971.       --  Note we allow non-static non-generic types at this stage as further
  2972.       --  described below.
  2973.  
  2974.       if Is_Type (P_Entity)
  2975.         and then (Is_Scalar_Type (P_Entity) or Is_Array_Type (P_Entity))
  2976.         and then (not Is_Generic_Type (P_Entity))
  2977.       then
  2978.          P_Type := P_Entity;
  2979.  
  2980.       --  Second foldable possibility is an array object (RM 4.9(8))
  2981.  
  2982.       elsif (Ekind (P_Entity) = E_Variable
  2983.                or else Ekind (P_Entity) = E_Constant)
  2984.         and then Is_Array_Type (Etype (P_Entity))
  2985.         and then (not Is_Generic_Type (P_Entity))
  2986.       then
  2987.          P_Type := Etype (P_Entity);
  2988.  
  2989.       --  'Definite must be folded if the prefix is not a generic type,
  2990.       --  that is to say if we are within an instantiation.
  2991.  
  2992.       elsif Id = Attribute_Definite
  2993.         and then not In_Generic_Unit
  2994.       then
  2995.          P_Type := P_Entity;
  2996.  
  2997.       --  No other cases are foldable (they certainly aren't static, and at
  2998.       --  the moment we don't try to fold any cases other than the two above)
  2999.  
  3000.       else
  3001.          Check_Expressions;
  3002.          return;
  3003.       end if;
  3004.  
  3005.       --  If either attribute or the prefix is Any_Type, then propagate
  3006.       --  Any_Type to the result and don't do anything else at all.
  3007.  
  3008.       if P_Type = Any_Type
  3009.         or else (Present (E1) and then Etype (E1) = Any_Type)
  3010.         or else (Present (E2) and then Etype (E2) = Any_Type)
  3011.       then
  3012.          Set_Etype (N, Any_Type);
  3013.          return;
  3014.       end if;
  3015.  
  3016.       --  Scalar subtype case. We have not yet enforced the static requirement
  3017.       --  of (RM 4.9(7)) and we don't intend to just yet, since there are cases
  3018.       --  of non-static attribute references (e.g. S'Digits for a non-static
  3019.       --  floating-point type, which we can compute at compile time).
  3020.  
  3021.       --  Note: this folding of non-static attributes is not simply a case of
  3022.       --  optimization. For many of the attributes affected, Gigi cannot handle
  3023.       --  the attribute and depends on the front end having folded them away.
  3024.  
  3025.       --  Note: although we don't require staticness at this stage, we do set
  3026.       --  the Static variable to record the staticness, for easy reference by
  3027.       --  those attributes where it matters (e.g. Succ and Pred), and also to
  3028.       --  be used to ensure that non-static folded things are not marked as
  3029.       --  being static (a check that is done right at the end).
  3030.  
  3031.       P_Root_Type := Root_Type (P_Type);
  3032.  
  3033.       if Is_Scalar_Type (P_Type) then
  3034.          Static := Is_Static_Subtype (P_Type);
  3035.  
  3036.       --  Array case. We enforce the constrained requirement of (RM 4.9(7-8))
  3037.       --  since we can't do anything with unconstrained arrays. In addition,
  3038.       --  only the First, Last and Length attributes are foldable.
  3039.       --  'Definite is again an exception, because it applies as well to
  3040.       --  unconstrained types.
  3041.  
  3042.       elsif Id = Attribute_Definite then
  3043.          null;
  3044.  
  3045.       else
  3046.          if not Is_Constrained (P_Type)
  3047.            or else (Id /= Attribute_First
  3048.                      and then Id /= Attribute_Last
  3049.                      and then Id /= Attribute_Length)
  3050.          then
  3051.             Check_Expressions;
  3052.             return;
  3053.          end if;
  3054.  
  3055.          --  The rules in (RM 4.9(7,8)) require a static array, but as in the
  3056.          --  scalar case, we hold off on enforcing staticness, since there are
  3057.          --  cases which we can fold at compile time even though they are not
  3058.          --  static (e.g. 'Length applied to a static index, even though other
  3059.          --  non-static indexes make the array type non-static). This is only
  3060.          --  ab optimization, but it falls out essentially free, so why not.
  3061.          --  Again we compute the variable Static for easy reference later
  3062.          --  (note that no array attributes are static in Ada 83).
  3063.  
  3064.          Static := Ada_95;
  3065.  
  3066.          declare
  3067.             N : Node_Id;
  3068.  
  3069.          begin
  3070.             N := First_Index (P_Type);
  3071.             while Present (N) loop
  3072.                Static := Static and Is_Static_Subtype (Etype (N));
  3073.                N := Next_Index (N);
  3074.             end loop;
  3075.          end;
  3076.       end if;
  3077.  
  3078.       --  Check any expressions that are present. Note that these expressions,
  3079.       --  depending on the particular attribute type, are either part of the
  3080.       --  attribute designator, or they are arguments in a case where the
  3081.       --  attribute reference returns a function. In the latter case, the
  3082.       --  rule in (RM 4.9(22)) applies and in particular requires the type
  3083.       --  of the expressions to be scalar in order for the attribute to be
  3084.       --  considered to be static.
  3085.  
  3086.       declare
  3087.          E : Node_Id;
  3088.  
  3089.       begin
  3090.          E := E1;
  3091.          while Present (E) loop
  3092.  
  3093.             --  If expression is not static, then the attribute reference
  3094.             --  certainly is neither foldable nor static, so we can quit
  3095.             --  immediately. We can also quit if the expression is not of
  3096.             --  a scalar type as noted above.
  3097.  
  3098.             if not Is_Static_Expression (E)
  3099.               or else not Is_Scalar_Type (Etype (E))
  3100.             then
  3101.                Check_Expressions;
  3102.                return;
  3103.  
  3104.             --  If the expression raises a constraint error, then so does
  3105.             --  the attribute reference. We keep going in this case because
  3106.             --  we are still interested in whether the attribute reference
  3107.             --  is static even if it is not static.
  3108.  
  3109.             elsif Raises_Constraint_Error (E) then
  3110.                Set_Raises_Constraint_Error (N);
  3111.                CE_Node := E;
  3112.             end if;
  3113.  
  3114.             E := Next (E);
  3115.          end loop;
  3116.       end;
  3117.  
  3118.       --  Deal with the case of a static attribute reference that raises
  3119.       --  constraint error. The Raises_Constraint_Error flag will already
  3120.       --  have been set, and the Static flag shows whether the attribute
  3121.       --  reference is static. In any case we certainly can't fold such an
  3122.       --  attribute reference.
  3123.  
  3124.       --  Note that the rewriting of the attribute node with the constraint
  3125.       --  error node is essential in this case, because otherwise Gigi might
  3126.       --  blow up on one of the attributes it never expects to see.
  3127.  
  3128.       if Raises_Constraint_Error (N) then
  3129.          Check_Expressions;
  3130.          Rewrite_Substitute_Tree (N, Relocate_Node (CE_Node));
  3131.          Set_Is_Static_Expression (N, Static);
  3132.          return;
  3133.       end if;
  3134.  
  3135.       --  At this point we have a potentially foldable attribute reference.
  3136.       --  If Static is set, then the attribute reference definitely obeys
  3137.       --  the requirements in (RM 4.9(7,8,22)), and it definitely can be
  3138.       --  folded. If Static is not set, then the attribute may or may not
  3139.       --  be foldable, and the individual attribute processing routines
  3140.       --  test Static as required in cases where it makes a difference.
  3141.  
  3142.       case Id is
  3143.  
  3144.       --------------
  3145.       -- Adjacent --
  3146.       --------------
  3147.  
  3148.       when Attribute_Adjacent =>
  3149.          if Static then
  3150.             Fold_Ureal (N,
  3151.               Eval_Fat.Adjacent
  3152.                 (P_Root_Type, Expr_Value_R (E1), Expr_Value_R (E2)));
  3153.          end if;
  3154.  
  3155.       ---------
  3156.       -- Aft --
  3157.       ---------
  3158.  
  3159.       when Attribute_Aft =>
  3160.          Fold_Uint (N, UI_From_Int (Aft_Value));
  3161.  
  3162.       ---------------
  3163.       -- Alignment --
  3164.       ---------------
  3165.  
  3166.       when Attribute_Alignment =>
  3167.  
  3168.          --  If alignment clause given, get value from clause
  3169.  
  3170.          if Has_Alignment_Clause (P_Type) then
  3171.             Fold_Uint (N, Expr_Value (Expression (Alignment_Clause (P_Type))));
  3172.  
  3173.          --  For all non-scalar types, return maximum alignment. This is a
  3174.          --  temporary kludge, really Gigi should handle alignment here. ???
  3175.  
  3176.          elsif not (Is_Scalar_Type (P_Type)) then
  3177.             Fold_Uint (N, UI_From_Int (Ttypes.Maximum_Alignment));
  3178.  
  3179.          --  For scalar types, we calculate the alignmnent as the largest power
  3180.          --  of two multiple of System.Storage_Unit that does not exceed either
  3181.          --  the actual size of the type, or the maximum required alignment
  3182.  
  3183.          else
  3184.             declare
  3185.                S : constant Int :=
  3186.                      UI_To_Int (Esize (P_Type)) / Ttypes.System_Storage_Unit;
  3187.                A : Int;
  3188.  
  3189.             begin
  3190.                A := 1;
  3191.  
  3192.                while 2 * A <= Ttypes.Maximum_Alignment
  3193.                   and then 2 * A <= S
  3194.                loop
  3195.                   A := 2 * A;
  3196.                end loop;
  3197.  
  3198.                Fold_Uint (N, UI_From_Int (A));
  3199.             end;
  3200.          end if;
  3201.  
  3202.       ------------------
  3203.       -- Body_Version --
  3204.       ------------------
  3205.  
  3206.       --  Body_version can never be static
  3207.  
  3208.       when Attribute_Body_Version =>
  3209.          null;
  3210.  
  3211.       -------------
  3212.       -- Ceiling --
  3213.       -------------
  3214.  
  3215.       when Attribute_Ceiling =>
  3216.          if Static then
  3217.             Fold_Ureal (N,
  3218.               Eval_Fat.Ceiling (P_Root_Type, Expr_Value_R (E1)));
  3219.          end if;
  3220.  
  3221.       -------------
  3222.       -- Compose --
  3223.       -------------
  3224.  
  3225.       when Attribute_Compose =>
  3226.          if Static then
  3227.             Fold_Ureal (N,
  3228.               Eval_Fat.Compose
  3229.                 (P_Root_Type, Expr_Value_R (E1), Expr_Value (E2)));
  3230.          end if;
  3231.  
  3232.       ---------------
  3233.       -- Copy_Sign --
  3234.       ---------------
  3235.  
  3236.       when Attribute_Copy_Sign =>
  3237.          if Static then
  3238.             Fold_Ureal (N,
  3239.               Eval_Fat.Copy_Sign
  3240.                 (P_Root_Type, Expr_Value_R (E1), Expr_Value_R (E2)));
  3241.          end if;
  3242.  
  3243.       -----------
  3244.       -- Delta --
  3245.       -----------
  3246.  
  3247.       when Attribute_Delta =>
  3248.          Fold_Ureal (N, Delta_Value (P_Type));
  3249.  
  3250.       --------------
  3251.       -- Definite --
  3252.       --------------
  3253.  
  3254.       when Attribute_Definite =>
  3255.          declare
  3256.             Result : Node_Id;
  3257.          begin
  3258.             if Is_Indefinite_Subtype (P_Entity) then
  3259.                Result := New_Occurrence_Of (Standard_False, Loc);
  3260.             else
  3261.                Result := New_Occurrence_Of (Standard_True, Loc);
  3262.             end if;
  3263.  
  3264.             Rewrite_Substitute_Tree (N, Result);
  3265.             Analyze (N);
  3266.             Resolve (N, Standard_Boolean);
  3267.          end;
  3268.  
  3269.       ------------
  3270.       -- Denorm --
  3271.       ------------
  3272.  
  3273.       when Attribute_Denorm =>
  3274.          Float_Attribute_Boolean (
  3275.            Short_Float_Attr_Denorm,
  3276.            Float_Attr_Denorm,
  3277.            Long_Float_Attr_Denorm,
  3278.            Long_Long_Float_Attr_Denorm);
  3279.  
  3280.       ------------
  3281.       -- Digits --
  3282.       ------------
  3283.  
  3284.       when Attribute_Digits =>
  3285.          Fold_Uint (N, Digits_Value (P_Type));
  3286.  
  3287.       ----------
  3288.       -- Emax --
  3289.       ----------
  3290.  
  3291.       when Attribute_Emax =>
  3292.          Float_Attribute_Universal_Integer (
  3293.            Short_Float_Attr_Emax,
  3294.            Float_Attr_Emax,
  3295.            Long_Float_Attr_Emax,
  3296.            Long_Long_Float_Attr_Emax);
  3297.  
  3298.       --------------
  3299.       -- Enum_Rep --
  3300.       --------------
  3301.  
  3302.       when Attribute_Enum_Rep =>
  3303.          if Static then
  3304.             Fold_Uint (N, Enumeration_Rep (Expr_Value_E (E1)));
  3305.          end if;
  3306.  
  3307.       -------------
  3308.       -- Epsilon --
  3309.       -------------
  3310.  
  3311.       when Attribute_Epsilon =>
  3312.          Float_Attribute_Universal_Real (
  3313.            Short_Float_Attr_Epsilon'Universal_Literal_String,
  3314.            Float_Attr_Epsilon'Universal_Literal_String,
  3315.            Long_Float_Attr_Epsilon'Universal_Literal_String,
  3316.            Long_Long_Float_Attr_Epsilon'Universal_Literal_String);
  3317.  
  3318.       --------------
  3319.       -- Exponent --
  3320.       --------------
  3321.  
  3322.       when Attribute_Exponent =>
  3323.          if Static then
  3324.             Fold_Uint (N,
  3325.               Eval_Fat.Exponent (P_Root_Type, Expr_Value_R (E1)));
  3326.          end if;
  3327.  
  3328.       -----------
  3329.       -- First --
  3330.       -----------
  3331.  
  3332.       when Attribute_First => First_Attr :
  3333.       begin
  3334.          Set_Bounds;
  3335.  
  3336.          if Static and Is_OK_Static_Expression (Lo_Bound) then
  3337.             if Is_Real_Type (P_Type) then
  3338.                Fold_Ureal (N, Expr_Value_R (Lo_Bound));
  3339.             else
  3340.                Fold_Uint  (N, Expr_Value (Lo_Bound));
  3341.             end if;
  3342.          end if;
  3343.       end First_Attr;
  3344.  
  3345.       -----------------
  3346.       -- Fixed_Value --
  3347.       -----------------
  3348.  
  3349.       when Attribute_Fixed_Value =>
  3350.          if Static then
  3351.             Fold_Ureal
  3352.               (N, UR_From_Uint (Expr_Value (E1)) * Small_Value (P_Type));
  3353.          end if;
  3354.  
  3355.       -----------
  3356.       -- Floor --
  3357.       -----------
  3358.  
  3359.       when Attribute_Floor =>
  3360.          if Static then
  3361.             Fold_Ureal (N,
  3362.               Eval_Fat.Floor (P_Root_Type, Expr_Value_R (E1)));
  3363.          end if;
  3364.  
  3365.       ----------
  3366.       -- Fore --
  3367.       ----------
  3368.  
  3369.       when Attribute_Fore =>
  3370.          if Static then
  3371.             Fold_Uint (N, UI_From_Int (Fore_Value));
  3372.          end if;
  3373.  
  3374.       --------------
  3375.       -- Fraction --
  3376.       --------------
  3377.  
  3378.       when Attribute_Fraction =>
  3379.          if Static then
  3380.             Fold_Ureal (N,
  3381.               Eval_Fat.Fraction (P_Root_Type, Expr_Value_R (E1)));
  3382.          end if;
  3383.  
  3384.       -----------
  3385.       -- Image --
  3386.       -----------
  3387.  
  3388.       --  Image is a scalar attribute, but is never static, because it is
  3389.       --  not a static function (having a non-scalar argument (RM 4.9(22))
  3390.  
  3391.       when Attribute_Image =>
  3392.          null;
  3393.  
  3394.       ---------
  3395.       -- Img --
  3396.       ---------
  3397.  
  3398.       --  Img is a scalar attribute, but is never static, because it is
  3399.       --  not a static function (having a non-scalar argument (RM 4.9(22))
  3400.  
  3401.       when Attribute_Img =>
  3402.          null;
  3403.  
  3404.       -------------------
  3405.       -- Integer_Value --
  3406.       -------------------
  3407.  
  3408.       when Attribute_Integer_Value =>
  3409.          if Static then
  3410.             Fold_Uint (N, Expr_Value (E1));
  3411.          end if;
  3412.  
  3413.       -----------
  3414.       -- Large --
  3415.       -----------
  3416.  
  3417.       when Attribute_Large =>
  3418.          Float_Attribute_Universal_Real (
  3419.            Short_Float_Attr_Large'Universal_Literal_String,
  3420.            Float_Attr_Large'Universal_Literal_String,
  3421.            Long_Float_Attr_Large'Universal_Literal_String,
  3422.            Long_Long_Float_Attr_Large'Universal_Literal_String);
  3423.  
  3424.       ----------
  3425.       -- Last --
  3426.       ----------
  3427.  
  3428.       when Attribute_Last => Last :
  3429.       begin
  3430.          Set_Bounds;
  3431.  
  3432.          if Static and Is_OK_Static_Expression (Hi_Bound) then
  3433.             if Is_Real_Type (P_Type) then
  3434.                Fold_Ureal (N, Expr_Value_R (Hi_Bound));
  3435.             else
  3436.                Fold_Uint  (N, Expr_Value (Hi_Bound));
  3437.             end if;
  3438.          end if;
  3439.       end Last;
  3440.  
  3441.       ------------------
  3442.       -- Leading_Part --
  3443.       ------------------
  3444.  
  3445.       when Attribute_Leading_Part =>
  3446.          if Static then
  3447.             Fold_Ureal (N,
  3448.               Eval_Fat.Leading_Part
  3449.                 (P_Root_Type, Expr_Value_R (E1), Expr_Value (E2)));
  3450.          end if;
  3451.  
  3452.       ------------
  3453.       -- Length --
  3454.       ------------
  3455.  
  3456.       when Attribute_Length => Length :
  3457.       begin
  3458.          Set_Bounds;
  3459.  
  3460.          if Is_OK_Static_Expression (Lo_Bound)
  3461.            and then Is_OK_Static_Expression (Hi_Bound)
  3462.          then
  3463.             Fold_Uint (N,
  3464.               UI_Max (0, 1 + (Expr_Value (Hi_Bound) - Expr_Value (Lo_Bound))));
  3465.          end if;
  3466.       end Length;
  3467.  
  3468.       -------------
  3469.       -- Machine --
  3470.       -------------
  3471.  
  3472.       when Attribute_Machine =>
  3473.          if Static then
  3474.             Fold_Ureal (N,
  3475.               Eval_Fat.Machine (P_Root_Type, Expr_Value_R (E1)));
  3476.          end if;
  3477.  
  3478.       ------------------
  3479.       -- Machine_Emax --
  3480.       ------------------
  3481.  
  3482.       when Attribute_Machine_Emax =>
  3483.          Float_Attribute_Universal_Integer (
  3484.            Short_Float_Attr_Machine_Emax,
  3485.            Float_Attr_Machine_Emax,
  3486.            Long_Float_Attr_Machine_Emax,
  3487.            Long_Long_Float_Attr_Machine_Emax);
  3488.  
  3489.       ------------------
  3490.       -- Machine_Emin --
  3491.       ------------------
  3492.  
  3493.       when Attribute_Machine_Emin =>
  3494.          Float_Attribute_Universal_Integer (
  3495.            Short_Float_Attr_Machine_Emin,
  3496.            Float_Attr_Machine_Emin,
  3497.            Long_Float_Attr_Machine_Emin,
  3498.            Long_Long_Float_Attr_Machine_Emin);
  3499.  
  3500.       ----------------------
  3501.       -- Machine_Mantissa --
  3502.       ----------------------
  3503.  
  3504.       when Attribute_Machine_Mantissa =>
  3505.          Float_Attribute_Universal_Integer (
  3506.            Short_Float_Attr_Machine_Mantissa,
  3507.            Float_Attr_Machine_Mantissa,
  3508.            Long_Float_Attr_Machine_Mantissa,
  3509.            Long_Long_Float_Attr_Machine_Mantissa);
  3510.  
  3511.       -----------------------
  3512.       -- Machine_Overflows --
  3513.       -----------------------
  3514.  
  3515.       when Attribute_Machine_Overflows =>
  3516.          Float_Attribute_Boolean (
  3517.            Short_Float_Attr_Machine_Overflows,
  3518.            Float_Attr_Machine_Overflows,
  3519.            Long_Float_Attr_Machine_Overflows,
  3520.            Long_Long_Float_Attr_Machine_Overflows);
  3521.  
  3522.       -------------------
  3523.       -- Machine_Radix --
  3524.       -------------------
  3525.  
  3526.       when Attribute_Machine_Radix =>
  3527.          if Is_Fixed_Point_Type (P_Type) then
  3528.             if Is_Decimal_Fixed_Point_Type (P_Type)
  3529.               and then Machine_Radix_10 (P_Type)
  3530.             then
  3531.                Fold_Uint (N, Uint_10);
  3532.             else
  3533.                Fold_Uint (N, Uint_2);
  3534.             end if;
  3535.  
  3536.          else
  3537.             Float_Attribute_Universal_Integer (
  3538.               Short_Float_Attr_Machine_Radix,
  3539.               Float_Attr_Machine_Radix,
  3540.               Long_Float_Attr_Machine_Radix,
  3541.               Long_Long_Float_Attr_Machine_Radix);
  3542.          end if;
  3543.  
  3544.       --------------------
  3545.       -- Machine_Rounds --
  3546.       --------------------
  3547.  
  3548.       when Attribute_Machine_Rounds =>
  3549.          Float_Attribute_Boolean (
  3550.            Short_Float_Attr_Machine_Rounds,
  3551.            Float_Attr_Machine_Rounds,
  3552.            Long_Float_Attr_Machine_Rounds,
  3553.            Long_Long_Float_Attr_Machine_Rounds);
  3554.  
  3555.       --------------
  3556.       -- Mantissa --
  3557.       --------------
  3558.  
  3559.       when Attribute_Mantissa =>
  3560.          Float_Attribute_Universal_Integer (
  3561.            Short_Float_Attr_Mantissa,
  3562.            Float_Attr_Mantissa,
  3563.            Long_Float_Attr_Mantissa,
  3564.            Long_Long_Float_Attr_Mantissa);
  3565.  
  3566.       ---------
  3567.       -- Max --
  3568.       ---------
  3569.  
  3570.       when Attribute_Max => Max :
  3571.       begin
  3572.          if Is_Real_Type (P_Type) then
  3573.             Fold_Ureal (N, UR_Max (Expr_Value_R (E1), Expr_Value_R (E2)));
  3574.          else
  3575.             Fold_Uint (N, UI_Max (Expr_Value (E1), Expr_Value (E2)));
  3576.          end if;
  3577.       end Max;
  3578.  
  3579.       ----------------------------------
  3580.       -- Max_Size_In_Storage_Elements --
  3581.       ----------------------------------
  3582.  
  3583.       --  Max_Size_In_Storage_Elements is simply the Size rounded up to a
  3584.       --  Storage_Unit boundary. We can fold any cases for which the size
  3585.       --  is known by the front end.
  3586.  
  3587.       when Attribute_Max_Size_In_Storage_Elements =>
  3588.          if Esize (P_Type) /= 0 then
  3589.             Fold_Uint (N,
  3590.               (Esize (P_Type) + System_Storage_Unit - 1) /
  3591.                                           System_Storage_Unit);
  3592.          end if;
  3593.  
  3594.       ---------
  3595.       -- Min --
  3596.       ---------
  3597.  
  3598.       when Attribute_Min => Min :
  3599.       begin
  3600.          if Is_Real_Type (P_Type) then
  3601.             Fold_Ureal (N, UR_Min (Expr_Value_R (E1), Expr_Value_R (E2)));
  3602.          else
  3603.             Fold_Uint (N, UI_Min (Expr_Value (E1), Expr_Value (E2)));
  3604.          end if;
  3605.       end Min;
  3606.  
  3607.       -----------
  3608.       -- Model --
  3609.       -----------
  3610.  
  3611.       when Attribute_Model =>
  3612.          if Static then
  3613.             Fold_Ureal (N,
  3614.               Eval_Fat.Model (P_Root_Type, Expr_Value_R (E1)));
  3615.          end if;
  3616.  
  3617.       ----------------
  3618.       -- Model_Emin --
  3619.       ----------------
  3620.  
  3621.       when Attribute_Model_Emin =>
  3622.          Float_Attribute_Universal_Integer (
  3623.            Short_Float_Attr_Model_Emin,
  3624.            Float_Attr_Model_Emin,
  3625.            Long_Float_Attr_Model_Emin,
  3626.            Long_Long_Float_Attr_Model_Emin);
  3627.  
  3628.       -------------------
  3629.       -- Model_Epsilon --
  3630.       -------------------
  3631.  
  3632.       when Attribute_Model_Epsilon =>
  3633.          Float_Attribute_Universal_Real (
  3634.            Short_Float_Attr_Model_Epsilon'Universal_Literal_String,
  3635.            Float_Attr_Model_Epsilon'Universal_Literal_String,
  3636.            Long_Float_Attr_Model_Epsilon'Universal_Literal_String,
  3637.            Long_Long_Float_Attr_Model_Epsilon'Universal_Literal_String);
  3638.  
  3639.       --------------------
  3640.       -- Model_Mantissa --
  3641.       --------------------
  3642.  
  3643.       when Attribute_Model_Mantissa =>
  3644.          Float_Attribute_Universal_Integer (
  3645.            Short_Float_Attr_Model_Mantissa,
  3646.            Float_Attr_Model_Mantissa,
  3647.            Long_Float_Attr_Model_Mantissa,
  3648.            Long_Long_Float_Attr_Model_Mantissa);
  3649.  
  3650.       -----------------
  3651.       -- Model_Small --
  3652.       -----------------
  3653.  
  3654.       when Attribute_Model_Small =>
  3655.          Float_Attribute_Universal_Real (
  3656.            Short_Float_Attr_Model_Small'Universal_Literal_String,
  3657.            Float_Attr_Model_Small'Universal_Literal_String,
  3658.            Long_Float_Attr_Model_Small'Universal_Literal_String,
  3659.            Long_Long_Float_Attr_Model_Small'Universal_Literal_String);
  3660.  
  3661.       -------------
  3662.       -- Modulus --
  3663.       -------------
  3664.  
  3665.       when Attribute_Modulus =>
  3666.          Fold_Uint (N, Modulus (P_Type));
  3667.  
  3668.       -------------------------
  3669.       -- Passed_By_Reference --
  3670.       -------------------------
  3671.  
  3672.       --  Scalar types are never passed by reference
  3673.  
  3674.       when Attribute_Passed_By_Reference =>
  3675.          Fold_Uint (N, Uint_0);
  3676.  
  3677.       ---------
  3678.       -- Pos --
  3679.       ---------
  3680.  
  3681.       when Attribute_Pos =>
  3682.          Fold_Uint (N, Expr_Value (E1));
  3683.  
  3684.       ----------
  3685.       -- Pred --
  3686.       ----------
  3687.  
  3688.       when Attribute_Pred => Pred :
  3689.       begin
  3690.          if Static then
  3691.  
  3692.             --  Floating-point case
  3693.  
  3694.             if Is_Floating_Point_Type (P_Type) then
  3695.                Fold_Ureal (N,
  3696.                  Eval_Fat.Pred (P_Root_Type, Expr_Value_R (E1)));
  3697.  
  3698.             --  Fixed-point case
  3699.  
  3700.             elsif Is_Fixed_Point_Type (P_Type) then
  3701.                Fold_Ureal (N,
  3702.                  Expr_Value_R (E1) + Small_Value (P_Type));
  3703.  
  3704.             --  Scalar case
  3705.  
  3706.             else
  3707.                pragma Assert (Is_Scalar_Type (P_Type));
  3708.  
  3709.                if Expr_Value (E1) =
  3710.                   Expr_Value (Type_Low_Bound (P_Type))
  3711.                then
  3712.                   Compile_Time_Constraint_Error (N, "Pred of type''First");
  3713.                   Check_Expressions;
  3714.                   return;
  3715.                else
  3716.                   Fold_Uint (N, Expr_Value (E1) - 1);
  3717.                end if;
  3718.             end if;
  3719.          end if;
  3720.       end Pred;
  3721.  
  3722.       -----------
  3723.       -- Range --
  3724.       -----------
  3725.  
  3726.       --  No processing required, because by this stage, Range has been
  3727.       --  replaced by First .. Last, so this branch can never be taken.
  3728.  
  3729.       when Attribute_Range =>
  3730.          pragma Assert (False); null;
  3731.  
  3732.       ------------------
  3733.       -- Range_Length --
  3734.       ------------------
  3735.  
  3736.       when Attribute_Range_Length =>
  3737.          Set_Bounds;
  3738.  
  3739.          if Is_OK_Static_Expression (Hi_Bound)
  3740.            and then Is_OK_Static_Expression (Lo_Bound)
  3741.          then
  3742.             Fold_Uint (N,
  3743.               UI_Max
  3744.                 (0, Expr_Value (Hi_Bound) - Expr_Value (Lo_Bound) + 1));
  3745.          end if;
  3746.  
  3747.       ---------------
  3748.       -- Remainder --
  3749.       ---------------
  3750.  
  3751.       when Attribute_Remainder =>
  3752.          if Static then
  3753.             Fold_Ureal (N,
  3754.               Eval_Fat.Remainder
  3755.                 (P_Root_Type, Expr_Value_R (E1), Expr_Value_R (E2)));
  3756.          end if;
  3757.  
  3758.       -----------
  3759.       -- Round --
  3760.       -----------
  3761.  
  3762.       when Attribute_Round => Round :
  3763.       declare
  3764.          Sr : Ureal;
  3765.          Si : Uint;
  3766.  
  3767.       begin
  3768.          if Static then
  3769.             --  First we get the (exact result) in units of small
  3770.  
  3771.             Sr := Expr_Value_R (E1) / Small_Value (C_Type);
  3772.  
  3773.             --  Now round that exactly to an integer
  3774.  
  3775.             Si := UR_To_Uint (Sr);
  3776.  
  3777.             --  Finally the result is obtained by converting back to real
  3778.  
  3779.             Fold_Ureal (N, Si * Small_Value (C_Type));
  3780.          end if;
  3781.       end Round;
  3782.  
  3783.       --------------
  3784.       -- Rounding --
  3785.       --------------
  3786.  
  3787.       when Attribute_Rounding =>
  3788.          if Static then
  3789.             Fold_Ureal (N,
  3790.               Eval_Fat.Rounding (P_Root_Type, Expr_Value_R (E1)));
  3791.          end if;
  3792.  
  3793.       ---------------
  3794.       -- Safe_Emax --
  3795.       ---------------
  3796.  
  3797.       when Attribute_Safe_Emax =>
  3798.          Float_Attribute_Universal_Integer (
  3799.            Short_Float_Attr_Safe_Emax,
  3800.            Float_Attr_Safe_Emax,
  3801.            Long_Float_Attr_Safe_Emax,
  3802.            Long_Long_Float_Attr_Safe_Emax);
  3803.  
  3804.       ----------------
  3805.       -- Safe_First --
  3806.       ----------------
  3807.  
  3808.       when Attribute_Safe_First =>
  3809.          Float_Attribute_Universal_Real (
  3810.            Short_Float_Attr_Safe_First'Universal_Literal_String,
  3811.            Float_Attr_Safe_First'Universal_Literal_String,
  3812.            Long_Float_Attr_Safe_First'Universal_Literal_String,
  3813.            Long_Long_Float_Attr_Safe_First'Universal_Literal_String);
  3814.  
  3815.       ----------------
  3816.       -- Safe_Large --
  3817.       ----------------
  3818.  
  3819.       when Attribute_Safe_Large =>
  3820.          Float_Attribute_Universal_Real (
  3821.            Short_Float_Attr_Safe_Large'Universal_Literal_String,
  3822.            Float_Attr_Safe_Large'Universal_Literal_String,
  3823.            Long_Float_Attr_Safe_Large'Universal_Literal_String,
  3824.            Long_Long_Float_Attr_Safe_Large'Universal_Literal_String);
  3825.  
  3826.       ---------------
  3827.       -- Safe_Last --
  3828.       ---------------
  3829.  
  3830.       when Attribute_Safe_Last =>
  3831.          Float_Attribute_Universal_Real (
  3832.            Short_Float_Attr_Safe_Last'Universal_Literal_String,
  3833.            Float_Attr_Safe_Last'Universal_Literal_String,
  3834.            Long_Float_Attr_Safe_Last'Universal_Literal_String,
  3835.            Long_Long_Float_Attr_Safe_Last'Universal_Literal_String);
  3836.  
  3837.       ----------------
  3838.       -- Safe_Small --
  3839.       ----------------
  3840.  
  3841.       when Attribute_Safe_Small =>
  3842.          Float_Attribute_Universal_Real (
  3843.            Short_Float_Attr_Safe_Small'Universal_Literal_String,
  3844.            Float_Attr_Safe_Small'Universal_Literal_String,
  3845.            Long_Float_Attr_Safe_Small'Universal_Literal_String,
  3846.            Long_Long_Float_Attr_Safe_Small'Universal_Literal_String);
  3847.  
  3848.       -----------
  3849.       -- Scale --
  3850.       -----------
  3851.  
  3852.       when Attribute_Scale =>
  3853.          Fold_Uint (N, Scale_Value (P_Type));
  3854.  
  3855.       -------------
  3856.       -- Scaling --
  3857.       -------------
  3858.  
  3859.       when Attribute_Scaling =>
  3860.          if Static then
  3861.             Fold_Ureal (N,
  3862.               Eval_Fat.Scaling
  3863.                 (P_Root_Type, Expr_Value_R (E1), Expr_Value (E2)));
  3864.          end if;
  3865.  
  3866.       ------------------
  3867.       -- Signed_Zeros --
  3868.       ------------------
  3869.  
  3870.       when Attribute_Signed_Zeros =>
  3871.          Float_Attribute_Boolean (
  3872.            Short_Float_Attr_Signed_Zeros,
  3873.            Float_Attr_Signed_Zeros,
  3874.            Long_Float_Attr_Signed_Zeros,
  3875.            Long_Long_Float_Attr_Signed_Zeros);
  3876.  
  3877.       ----------
  3878.       -- Size --
  3879.       ----------
  3880.  
  3881.       --  Size attribute returns the size. All scalar types can be folded,
  3882.       --  as well as any types for which the size is known by the front end,
  3883.       --  including any type for which a size attribute is specified.
  3884.  
  3885.       when Attribute_Size =>
  3886.          if Esize (P_Type) /= 0 then
  3887.             Fold_Uint (N, Esize (P_Type));
  3888.          end if;
  3889.  
  3890.       -----------
  3891.       -- Small --
  3892.       -----------
  3893.  
  3894.       when Attribute_Small =>
  3895.          Fold_Ureal (N, Small_Value (P_Type));
  3896.  
  3897.       ----------
  3898.       -- Succ --
  3899.       ----------
  3900.  
  3901.       when Attribute_Succ => Succ :
  3902.       begin
  3903.          if Static then
  3904.  
  3905.             --  Floating-point case
  3906.  
  3907.             if Is_Floating_Point_Type (P_Type) then
  3908.                Fold_Ureal (N,
  3909.                  Eval_Fat.Succ (P_Root_Type, Expr_Value_R (E1)));
  3910.  
  3911.             --  Fixed-point case
  3912.  
  3913.             elsif Is_Fixed_Point_Type (P_Type) then
  3914.                Fold_Ureal (N,
  3915.                  Expr_Value_R (E1) + Small_Value (P_Type));
  3916.  
  3917.             --  Scalar case
  3918.  
  3919.             else
  3920.                pragma Assert (Is_Scalar_Type (P_Type));
  3921.  
  3922.                if Expr_Value (E1) =
  3923.                   Expr_Value (Type_High_Bound (P_Type))
  3924.                then
  3925.                   Compile_Time_Constraint_Error (N, "Succ of type''Last");
  3926.                   Check_Expressions;
  3927.                   return;
  3928.                else
  3929.                   Fold_Uint (N, Expr_Value (E1) + 1);
  3930.                end if;
  3931.             end if;
  3932.          end if;
  3933.       end Succ;
  3934.  
  3935.       ----------------
  3936.       -- Truncation --
  3937.       ----------------
  3938.  
  3939.       when Attribute_Truncation =>
  3940.          if Static then
  3941.             Fold_Ureal (N,
  3942.               Eval_Fat.Truncation (P_Root_Type, Expr_Value_R (E1)));
  3943.          end if;
  3944.  
  3945.       -----------------------
  3946.       -- Unbiased_Rounding --
  3947.       -----------------------
  3948.  
  3949.       when Attribute_Unbiased_Rounding =>
  3950.          if Static then
  3951.             Fold_Ureal (N,
  3952.               Eval_Fat.Unbiased_Rounding (P_Root_Type, Expr_Value_R (E1)));
  3953.          end if;
  3954.  
  3955.       ---------
  3956.       -- Val --
  3957.       ---------
  3958.  
  3959.       when Attribute_Val => Val :
  3960.       begin
  3961.          if Static then
  3962.             if  Expr_Value (E1) < Expr_Value (Type_Low_Bound (P_Type))
  3963.               or else
  3964.                 Expr_Value (E1) > Expr_Value (Type_High_Bound (P_Type))
  3965.             then
  3966.                Compile_Time_Constraint_Error (N, "Pos out of range");
  3967.                Check_Expressions;
  3968.                return;
  3969.             else
  3970.                Fold_Uint (N, Expr_Value (E1));
  3971.             end if;
  3972.          end if;
  3973.       end Val;
  3974.  
  3975.       -------------
  3976.       -- Version --
  3977.       -------------
  3978.  
  3979.       --  Version can never be static
  3980.  
  3981.       when Attribute_Version =>
  3982.          null;
  3983.  
  3984.       ----------------
  3985.       -- Wide_Image --
  3986.       ----------------
  3987.  
  3988.       --  Wide_Image is a scalar attribute, but is never static, because it
  3989.       --  is not a static function (having a non-scalar argument (RM 4.9(22))
  3990.  
  3991.       when Attribute_Wide_Image =>
  3992.          null;
  3993.  
  3994.       ----------------
  3995.       -- Wide_Width --
  3996.       ----------------
  3997.  
  3998.       --  Processing for Wide_Width is combined with Width
  3999.  
  4000.       -----------
  4001.       -- Width --
  4002.       -----------
  4003.  
  4004.       --  This processing also handles the case of Wide_Width
  4005.  
  4006.       when Attribute_Width | Attribute_Wide_Width => Width :
  4007.       begin
  4008.          if Static then
  4009.  
  4010.             --  Floating-point types
  4011.  
  4012.             if Is_Floating_Point_Type (P_Type) then
  4013.  
  4014.                --  Width is zero for a null range (RM 3.5 (38))
  4015.  
  4016.                if Expr_Value_R (Type_High_Bound (P_Type)) <
  4017.                   Expr_Value_R (Type_Low_Bound (P_Type))
  4018.                then
  4019.                   Fold_Uint (N, Uint_0);
  4020.  
  4021.                else
  4022.                   --  For floating-point, we have +N.dddE+nnn where length
  4023.                   --  of ddd is determined by type'Digits - 1 (but is one
  4024.                   --  if Digits is one (RM 3.5 (33))
  4025.  
  4026.                   Fold_Uint (N,
  4027.                     UI_From_Int (7 +
  4028.                       Int'Max (2, UI_To_Int (Digits_Value (P_Type)))));
  4029.                end if;
  4030.  
  4031.             --  Fixed-point types
  4032.  
  4033.             elsif Is_Fixed_Point_Type (P_Type) then
  4034.  
  4035.                --  Width is zero for a null range (RM 3.5 (38))
  4036.  
  4037.                if Expr_Value (Type_High_Bound (P_Type)) <
  4038.                   Expr_Value (Type_Low_Bound  (P_Type))
  4039.                then
  4040.                   Fold_Uint (N, Uint_0);
  4041.  
  4042.                --  The non-null case depends on the specific real type
  4043.  
  4044.                else
  4045.                   --  For fixed-point type width is Fore + 1 + Aft (RM 3.5(34))
  4046.  
  4047.                   Fold_Uint (N, UI_From_Int (Fore_Value + 1 + Aft_Value));
  4048.                end if;
  4049.  
  4050.             --  Discrete types
  4051.  
  4052.             else
  4053.                declare
  4054.                   R  : constant Entity_Id := Root_Type (P_Type);
  4055.                   Lo : constant Uint :=
  4056.                          Expr_Value (Type_Low_Bound (P_Type));
  4057.                   Hi : constant Uint :=
  4058.                          Expr_Value (Type_High_Bound (P_Type));
  4059.                   W  : Nat;
  4060.                   Wt : Nat;
  4061.                   T  : Uint;
  4062.                   L  : Node_Id;
  4063.                   C  : Character;
  4064.  
  4065.                begin
  4066.                   --  Empty ranges
  4067.  
  4068.                   if Lo > Hi then
  4069.                      W := 0;
  4070.  
  4071.                   --  Width for types derived from Standard.Character
  4072.                   --  and Standard.Wide_Character.
  4073.  
  4074.                   elsif R = Standard_Character
  4075.                     or else R = Standard_Wide_Character
  4076.                   then
  4077.                      W := 0;
  4078.  
  4079.                      --  Set W larger if needed
  4080.  
  4081.                      for J in UI_To_Int (Lo) .. UI_To_Int (Hi) loop
  4082.  
  4083.                         --  Assume all wide-character escape sequences are
  4084.                         --  same length, so we can quit when we reach one.
  4085.  
  4086.                         if J > 255 then
  4087.                            if Id = Attribute_Wide_Width then
  4088.                               W := Int'Max (W, 3);
  4089.                               exit;
  4090.                            else
  4091.                               W := Int'Max (W, Length_Wide);
  4092.                               exit;
  4093.                            end if;
  4094.  
  4095.                         else
  4096.                            C := Character'Val (J);
  4097.  
  4098.                            --  Test for all cases where Character'Image
  4099.                            --  yields an image that is longer than three
  4100.                            --  characters. First the cases of Reserved_xxx
  4101.                            --  names (length = 12).
  4102.  
  4103.                            case C is
  4104.                               when Reserved_128 | Reserved_129 |
  4105.                                    Reserved_132 | Reserved_153
  4106.  
  4107.                                 => Wt := 12;
  4108.  
  4109.                               when BS | HT | LF | VT | FF | CR |
  4110.                                    SO | SI | EM | FS | GS | RS |
  4111.                                    US | RI | MW | ST | PM
  4112.  
  4113.                                 => Wt := 2;
  4114.  
  4115.                               when NUL | SOH | STX | ETX | EOT |
  4116.                                    ENQ | ACK | BEL | DLE | DC1 |
  4117.                                    DC2 | DC3 | DC4 | NAK | SYN |
  4118.                                    ETB | CAN | SUB | ESC | DEL |
  4119.                                    BPH | NBH | NEL | SSA | ESA |
  4120.                                    HTS | HTJ | VTS | PLD | PLU |
  4121.                                    SS2 | SS3 | DCS | PU1 | PU2 |
  4122.                                    STS | CCH | SPA | EPA | SOS |
  4123.                                    SCI | CSI | OSC | APC
  4124.  
  4125.                                 => Wt := 3;
  4126.  
  4127.                               when Space .. Tilde |
  4128.                                    No_Break_Space .. LC_Y_Diaeresis
  4129.  
  4130.                                 => Wt := 3;
  4131.  
  4132.                            end case;
  4133.  
  4134.                            W := Int'Max (W, Wt);
  4135.                         end if;
  4136.                      end loop;
  4137.  
  4138.                   --  Width for types derived from Standard.Boolean
  4139.  
  4140.                   elsif R = Standard_Boolean then
  4141.                      if Lo = 0 then
  4142.                         W := 5; -- FALSE
  4143.                      else
  4144.                         W := 4; -- TRUE
  4145.                      end if;
  4146.  
  4147.                   --  Width for integer types
  4148.  
  4149.                   elsif Is_Integer_Type (P_Type) then
  4150.                      T := UI_Max (abs Lo, abs Hi);
  4151.  
  4152.                      W := 2;
  4153.                      while T >= 10 loop
  4154.                         W := W + 1;
  4155.                         T := T / 10;
  4156.                      end loop;
  4157.  
  4158.                   --  Only remaining possibility is user declared enum type
  4159.  
  4160.                   else
  4161.                      pragma Assert (Is_Enumeration_Type (P_Type));
  4162.  
  4163.                      W := 0;
  4164.                      L := First_Literal (P_Type);
  4165.  
  4166.                      while Present (L) loop
  4167.  
  4168.                         --  Only pay attention to in range characters
  4169.  
  4170.                         if Lo <= Enumeration_Pos (L)
  4171.                           and then Enumeration_Pos (L) <= Hi
  4172.                         then
  4173.                            --  For Width case, use decoded name
  4174.  
  4175.                            if Id = Attribute_Width then
  4176.                               Get_Decoded_Name_String (Chars (L));
  4177.                               Wt := Nat (Name_Len);
  4178.  
  4179.                            --  For Wide_Width, use encoded name, and then
  4180.                            --  adjust for the encoding.
  4181.  
  4182.                            else
  4183.                               Get_Name_String (Chars (L));
  4184.  
  4185.                               --  Character literals are always of length 3
  4186.  
  4187.                               if Name_Buffer (1) = 'Q' then
  4188.                                  Wt := 3;
  4189.  
  4190.                               --  Otherwise loop to adjust for upper/wide chars
  4191.  
  4192.                               else
  4193.                                  Wt := Nat (Name_Len);
  4194.  
  4195.                                  for J in 1 .. Name_Len loop
  4196.                                     if Name_Buffer (J) = 'U' then
  4197.                                        Wt := Wt - 2;
  4198.                                     elsif Name_Buffer (J) = 'W' then
  4199.                                        Wt := Wt - 4;
  4200.                                     end if;
  4201.                                  end loop;
  4202.                               end if;
  4203.                            end if;
  4204.  
  4205.                            W := Int'Max (W, Wt);
  4206.                         end if;
  4207.  
  4208.                         L := Next_Literal (L);
  4209.                      end loop;
  4210.                   end if;
  4211.  
  4212.                   Fold_Uint (N, UI_From_Int (W));
  4213.                end;
  4214.             end if;
  4215.          end if;
  4216.       end Width;
  4217.  
  4218.       --  The following attributes can never be folded, and furthermore we
  4219.       --  should not even have entered the case statement for any of these.
  4220.       --  Note that in some cases, the values have already been folded as
  4221.       --  a result of the processing in Analyze_Attribute.
  4222.  
  4223.       when Attribute_Abort_Signal             |
  4224.            Attribute_Access                   |
  4225.            Attribute_Address                  |
  4226.            Attribute_Address_Size             |
  4227.            Attribute_Base                     |
  4228.            Attribute_Bit_Order                |
  4229.            Attribute_Callable                 |
  4230.            Attribute_Caller                   |
  4231.            Attribute_Class                    |
  4232.            Attribute_Component_Size           |
  4233.            Attribute_Constrained              |
  4234.            Attribute_Count                    |
  4235.            Attribute_Default_Bit_Order        |
  4236.            Attribute_Elab_Body                |
  4237.            Attribute_Elab_Spec                |
  4238.            Attribute_External_Tag             |
  4239.            Attribute_First_Bit                |
  4240.            Attribute_Identity                 |
  4241.            Attribute_Input                    |
  4242.            Attribute_Last_Bit                 |
  4243.            Attribute_Max_Interrupt_Priority   |
  4244.            Attribute_Max_Priority             |
  4245.            Attribute_Maximum_Alignment        |
  4246.            Attribute_Output                   |
  4247.            Attribute_Partition_ID             |
  4248.            Attribute_Position                 |
  4249.            Attribute_Read                     |
  4250.            Attribute_Storage_Pool             |
  4251.            Attribute_Storage_Size             |
  4252.            Attribute_Storage_Unit             |
  4253.            Attribute_Tag                      |
  4254.            Attribute_Terminated               |
  4255.            Attribute_Tick                     |
  4256.            Attribute_Unchecked_Access         |
  4257.            Attribute_Universal_Literal_String |
  4258.            Attribute_Unrestricted_Access      |
  4259.            Attribute_Valid                    |
  4260.            Attribute_Value                    |
  4261.            Attribute_Wide_Value               |
  4262.            Attribute_Word_Size                |
  4263.            Attribute_Write                    =>
  4264.  
  4265.          pragma Assert (False); null;
  4266.  
  4267.       end case;
  4268.  
  4269.       --  At the end of the case, one more check. If we did a static evaluation
  4270.       --  so that the result is now an integer or real constant, then set the
  4271.       --  Is_Static_Expression flag in this literal only if the prefix type is
  4272.       --  a static subtype. For non-static subtypes, the replacement is still
  4273.       --  OK, but cannot be considered to be static.
  4274.  
  4275.       if Nkind (N) /= N_Attribute_Reference then
  4276.          Set_Is_Static_Expression (N, Static);
  4277.  
  4278.       --  If this is still an attribute reference, then it has not been folded
  4279.       --  and that means that its expressions are in a non-static context.
  4280.  
  4281.       else
  4282.          Check_Expressions;
  4283.       end if;
  4284.  
  4285.    end Eval_Attribute;
  4286.  
  4287.    -----------------------
  4288.    -- Resolve_Attribute --
  4289.    -----------------------
  4290.  
  4291.    procedure Resolve_Attribute (N : Node_Id; Typ : Entity_Id) is
  4292.       Loc   : constant Source_Ptr := Sloc (N);
  4293.       P     : constant Node_Id    := Prefix (N);
  4294.       Aname : constant Name_Id    := Attribute_Name (N);
  4295.       Index : Interp_Index;
  4296.       It    : Interp;
  4297.       Btyp  : Entity_Id := Base_Type (Typ);
  4298.  
  4299.    begin
  4300.       --  If attribute was universal type, reset to actual type
  4301.  
  4302.       if Etype (N) = Universal_Integer
  4303.         or else Etype (N) = Universal_Real
  4304.       then
  4305.          Set_Etype (N, Typ);
  4306.       end if;
  4307.  
  4308.       --  Remaining processing depends on attribute
  4309.  
  4310.       case Get_Attribute_Id (Aname) is
  4311.  
  4312.          ------------
  4313.          -- Access --
  4314.          ------------
  4315.  
  4316.          --  For access attributes, if the prefix denotes an entity, it is
  4317.          --  interpreted as a name, never as a call. It may be overloaded,
  4318.          --  in which case resolution uses the profile of the context type.
  4319.          --  Otherwise prefix must be resolved.
  4320.  
  4321.          when Attribute_Access
  4322.             | Attribute_Unchecked_Access
  4323.             | Attribute_Unrestricted_Access =>
  4324.  
  4325.             if Is_Entity_Name (P) then
  4326.                if Is_Overloaded (P) then
  4327.                   Get_First_Interp (P, Index, It);
  4328.  
  4329.                   while Present (It.Nam) loop
  4330.  
  4331.                      if Type_Conformant (Designated_Type (Typ), It.Nam) then
  4332.                         Set_Entity (P, It.Nam);
  4333.                         exit;
  4334.                      end if;
  4335.  
  4336.                      Get_Next_Interp (Index, It);
  4337.                   end loop;
  4338.  
  4339.                elsif not Is_Overloadable (Entity (P))
  4340.                  and then not Is_Type (Entity (P))
  4341.                then
  4342.                   Resolve (P, Etype (P));
  4343.                end if;
  4344.  
  4345.                if not Is_Entity_Name (P) then
  4346.                   null;
  4347.  
  4348.                elsif Is_Abstract (Entity (P)) then
  4349.                   Error_Msg_Name_1 := Aname;
  4350.                   Error_Msg_N ("prefix of % attribute cannot be abstract", P);
  4351.                   Set_Etype (N, Any_Type);
  4352.  
  4353.                elsif Convention (Entity (P)) = Convention_Intrinsic then
  4354.                   Error_Msg_Name_1 := Aname;
  4355.                   Error_Msg_N ("prefix of % attribute cannot be intrinsic", P);
  4356.                   Set_Etype (N, Any_Type);
  4357.                end if;
  4358.  
  4359.                --  Assignments, return statements, components of aggregates,
  4360.                --  generic instantiations will require convention checks if
  4361.                --  the type is an access to subprogram. Given that there will
  4362.                --  also be accessibility checks on those,  this is where the
  4363.                --  checks can eventually  be centralized ???
  4364.  
  4365.                if Ekind (Btyp) = E_Access_Subprogram_Type then
  4366.                   if Convention (Btyp) /= Convention (Entity (P)) then
  4367.                      Error_Msg_N ("conventions must match", P);
  4368.                   end if;
  4369.  
  4370.                   if Get_Attribute_Id (Aname) = Attribute_Unchecked_Access then
  4371.                      Error_Msg_Name_1 := Aname;
  4372.                      Error_Msg_N
  4373.                        ("prefix of % attribute must aliased object", P);
  4374.  
  4375.                   --  Check the static accessibility rule of 3.10.2(32)
  4376.  
  4377.                   elsif Get_Attribute_Id (Aname) = Attribute_Access
  4378.                     and then Subprogram_Access_Level (Entity (P))
  4379.                       > Type_Access_Level (Btyp)
  4380.                   then
  4381.                      Error_Msg_N
  4382.                        ("subprogram must not be deeper than access type?", P);
  4383.                      Temporary_Msg_N
  4384.                        ("this will be a fatal error in the next release?!", P);
  4385.                      Temporary_Msg_N ("see gnatinfo.txt for details?!", P);
  4386.                   end if;
  4387.                end if;
  4388.  
  4389.             else
  4390.                Resolve (P, Etype (P));
  4391.             end if;
  4392.  
  4393.             --  Check the static accessibility rule of 3.10.2(28).
  4394.             --  Note that this check is not performed for the
  4395.             --  case of an anonymous access type, since the access
  4396.             --  attribute is always legal in such a context.
  4397.  
  4398.             if Ekind (Btyp) = E_General_Access_Type
  4399.               and then Get_Attribute_Id (Aname) = Attribute_Access
  4400.             then
  4401.                if Object_Access_Level (P) > Type_Access_Level (Btyp) then
  4402.                   Error_Msg_N
  4403.                     ("object must not be deeper than the access type?", P);
  4404.                   Temporary_Msg_N
  4405.                     ("this will be a fatal error in 2.06, see gnatinfo.txt?",
  4406.                      P);
  4407.  
  4408.                end if;
  4409.             end if;
  4410.  
  4411.             Set_Etype (N, Typ);
  4412.  
  4413.          -------------
  4414.          -- Address --
  4415.          -------------
  4416.  
  4417.          --  Deal with resolving the type for Address attribute, overloading
  4418.          --  is not permitted here, since there is no context to resolve it.
  4419.  
  4420.          when Attribute_Address =>
  4421.  
  4422.             if not Is_Entity_Name (P)
  4423.                or else not Is_Overloadable (Entity (P))
  4424.             then
  4425.                if not Is_Task_Type (Etype (P)) then
  4426.                   Resolve (P, Etype (P));
  4427.                end if;
  4428.  
  4429.             elsif Is_Overloaded (P) then
  4430.                Get_First_Interp (P, Index, It);
  4431.                Get_Next_Interp (Index, It);
  4432.  
  4433.                if Present (It.Nam) then
  4434.                   Error_Msg_Name_1 := Aname;
  4435.                   Error_Msg_N
  4436.                     ("prefix of % attribute cannot be overloaded", N);
  4437.                end if;
  4438.             end if;
  4439.  
  4440.          -----------
  4441.          -- Count --
  4442.          -----------
  4443.  
  4444.          --  Prefix of the Count attribute is an entry name, which should
  4445.          --  not be resolved, lest is appears as a call.
  4446.  
  4447.          when Attribute_Count =>
  4448.             null;
  4449.  
  4450.          -----------
  4451.          -- Range --
  4452.          -----------
  4453.  
  4454.          --  We replace the Range attribute node with a range expression
  4455.          --  whose bounds are the 'First and 'Last attributes applied to the
  4456.          --  same prefix. The reason that we do this transformation here
  4457.          --  instead of in the expander is that it simplifies other parts of
  4458.          --  the semantic analysis which assume that the Range has been
  4459.          --  replaced; thus it must be done even when in semantic-only mode
  4460.          --  (note that the RM specifically mentions this equivalence, we
  4461.          --  take care that the prefix is only evaluated once).
  4462.  
  4463.          when Attribute_Range =>
  4464.             declare
  4465.                LB   : Node_Id;
  4466.                HB   : Node_Id;
  4467.  
  4468.             begin
  4469.                if not Is_Entity_Name (P)
  4470.                  or else not Is_Type (Entity (P))
  4471.                then
  4472.                   Resolve (P, Etype (P));
  4473.                end if;
  4474.  
  4475.                HB :=
  4476.                  Make_Attribute_Reference (Loc,
  4477.                    Prefix         => Duplicate_Subexpr (P),
  4478.                    Attribute_Name => Name_Last,
  4479.                    Expressions    => Expressions (N));
  4480.  
  4481.                LB :=
  4482.                  Make_Attribute_Reference (Loc,
  4483.                    Prefix         => P,
  4484.                    Attribute_Name => Name_First,
  4485.                    Expressions    => Expressions (N));
  4486.  
  4487.                Rewrite_Substitute_Tree (N, Make_Range (Loc, LB, HB));
  4488.                Analyze (N);
  4489.                Resolve (N, Typ);
  4490.  
  4491.                --  Normally after resolving attribute nodes, Eval_Attribute
  4492.                --  is called to do any possible static evaluation of the node.
  4493.                --  However, here since the Range attribute has just been
  4494.                --  transformed into a range expression it is no longer an
  4495.                --  attribute node and therefore the call needs to be avoided
  4496.                --  and is accomplished by simply returning from the procedure.
  4497.  
  4498.                return;
  4499.             end;
  4500.  
  4501.          ----------------------
  4502.          -- Unchecked_Access --
  4503.          ----------------------
  4504.  
  4505.          --  Processing is shared with Access
  4506.  
  4507.          -------------------------
  4508.          -- Unrestricted_Access --
  4509.          -------------------------
  4510.  
  4511.          --  Processing is shared with Access
  4512.  
  4513.          ----------------------
  4514.          -- Other Attributes --
  4515.          ----------------------
  4516.  
  4517.          --  For other attributes, resolve prefix unless it is a type. If
  4518.          --  the attribute reference itself is a type name ('Base and 'Class)
  4519.          --  then this is only legal within a task or protected record.
  4520.  
  4521.          when others =>
  4522.             if not Is_Entity_Name (P)
  4523.               or else not Is_Type (Entity (P))
  4524.             then
  4525.                Resolve (P, Etype (P));
  4526.  
  4527.             elsif Is_Entity_Name (N) then
  4528.                if Is_Concurrent_Type (Entity (P))
  4529.                  and then In_Open_Scopes (Entity (P))
  4530.                then
  4531.                   null;
  4532.                else
  4533.                   Error_Msg_N
  4534.                     ("Invalid use of subtype name in expression or call", N);
  4535.                end if;
  4536.             end if;
  4537.  
  4538.       end case;
  4539.  
  4540.       --  Normally the Freezing is done by Resolve but sometimes the Prefix is
  4541.       --  not resolved, in which case the freezing must be done.
  4542.  
  4543.       Freeze_Expression (P);
  4544.  
  4545.       Eval_Attribute (N);
  4546.    end Resolve_Attribute;
  4547.  
  4548.    ---------------------
  4549.    -- In_Generic_Unit --
  4550.    ---------------------
  4551.  
  4552.    function In_Generic_Unit return Boolean is
  4553.       S : Entity_Id := Current_Scope;
  4554.    begin
  4555.       while Present (S)
  4556.         and then S /= Standard_Standard
  4557.       loop
  4558.          if Ekind (S) = E_Generic_Function
  4559.            or else Ekind (S) = E_Generic_Package
  4560.            or else Ekind (S) = E_Generic_Procedure
  4561.          then
  4562.             return True;
  4563.          end if;
  4564.  
  4565.          S := Scope (S);
  4566.       end loop;
  4567.  
  4568.       return False;
  4569.    end In_Generic_Unit;
  4570.  
  4571. end Sem_Attr;
  4572.