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.ads < prev    next >
Text File  |  1996-09-28  |  15KB  |  333 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             S E M _ A T T R                              --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.14 $                             --
  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. --  Attribute handling is isolated in a separate package to ease the addition
  26. --  of implementation defined attributes. Logically this processing belongs
  27. --  in chapter 4. See Sem_Ch4 for a description of the relation of the
  28. --  Analyze and Resolve routines for expression components.
  29.  
  30. --  This spec also documents all GNAT implementation defined pragmas
  31.  
  32. with Snames; use Snames;
  33. with Types;  use Types;
  34.  
  35. package Sem_Attr is
  36.  
  37.    type Attribute_Class_Array is array (Attribute_Id) of Boolean;
  38.    --  Type used to build attribute classification flag arrays
  39.  
  40.    -----------------------------------------
  41.    -- Implementation Dependent Attributes --
  42.    -----------------------------------------
  43.  
  44.    --  This section describes the implementation dependent attributes
  45.    --  provided in GNAT, as well as constructing an array of flags
  46.    --  indicating which attributes these are.
  47.  
  48.    Attribute_Impl_Def : Attribute_Class_Array := Attribute_Class_Array'(
  49.  
  50.       ------------------
  51.       -- Abort_Signal --
  52.       ------------------
  53.  
  54.       Attribute_Abort_Signal => True,
  55.       --  Standard'Abort_Signal (Standard is the only allowed prefix)
  56.       --  provides the entity for the special exception used to signal
  57.       --  task abort or asynchronous transfer of control. Normally this
  58.       --  attribute should only be used in the tasking runtime (it is
  59.       --  highly peculiar, and completely outside the normal semantics
  60.       --  of Ada, for a user program to intercept the abort exception).
  61.  
  62.       ------------------
  63.       -- Address_Size --
  64.       ------------------
  65.  
  66.       Attribute_Address_Size => True,
  67.       --  Standard'Address_Size (Standard is the only allowed prefix) is
  68.       --  a static constant giving the number of bits in an Address. It
  69.       --  is used primarily for constructing the definition of Memory_Size
  70.       --  in package Standard, but may be freely used in user programs.
  71.  
  72.       -----------------------
  73.       -- Default_Bit_Order --
  74.       -----------------------
  75.  
  76.       Attribute_Default_Bit_Order => True,
  77.       --  Standard'Default_Bit_Order (Standard is the only permissible prefix),
  78.       --  provides the value System.Default_Bit_Order as a Pos value (0 for
  79.       --  High_Order_First, 1 for Low_Order_First). This is used to construct
  80.       --  the definition of Default_Bit_Order in package System.
  81.  
  82.       ---------------
  83.       -- Elab_Body --
  84.       ---------------
  85.  
  86.       Attribute_Elab_Body => True,
  87.       --  This attribute can only be applied to a program unit name. It
  88.       --  returns the entity for the corresponding elaboration procedure
  89.       --  for elaborating the body of the referenced unit. This is used
  90.       --  in the main generated elaboration procedure by the binder, and
  91.       --  is not normally used in any other context, but there may be
  92.       --  specialized situations in which it is useful to be able to
  93.       --  call this elaboration procedure from Ada code, e.g. if it
  94.       --  is necessary to do selective reelaboration to fix some error.
  95.  
  96.       ---------------
  97.       -- Elab_Spec --
  98.       ---------------
  99.  
  100.       Attribute_Elab_Spec => True,
  101.       --  This attribute can only be applied to a program unit name. It
  102.       --  returns the entity for the corresponding elaboration procedure
  103.       --  for elaborating the spec of the referenced unit. This is used
  104.       --  in the main generated elaboration procedure by the binder, and
  105.       --  is not normally used in any other context, but there may be
  106.       --  specialized situations in which it is useful to be able to
  107.       --  call this elaboration procedure from Ada code, e.g. if it
  108.       --  is necessary to do selective reelaboration to fix some error.
  109.  
  110.       --------------
  111.       -- Enum_Rep --
  112.       --------------
  113.  
  114.       Attribute_Enum_Rep => True,
  115.       --  For every enumeration subtype S, S'Enum_Rep denotes a function
  116.       --  with the following specification:
  117.       --
  118.       --    function S (Arg : S'Base) return universal_integer;
  119.       --
  120.       --  The function returns the representation value for the given
  121.       --  enumeration value. This will be equal to the 'Pos value in the
  122.       --  absence of an enumeration representation clause. This is a static
  123.       --  attribute (i.e. the result is static if the argument is static).
  124.  
  125.       -----------------
  126.       -- Fixed_Value --
  127.       -----------------
  128.  
  129.       Attribute_Fixed_Value => True,
  130.       --  For every fixed-point type S, S'Fixed_Value denotes a function
  131.       --  with the following specification:
  132.       --
  133.       --    function Fixed_Value (Arg : universal_integer) return S;
  134.       --
  135.       --  The value returned is the fixed-point value V such that
  136.       --
  137.       --    V = Arg * S'Small
  138.       --
  139.       --  The effect is thus equivalent to first converting the argument
  140.       --  to the integer type used to represent S, and then doing an
  141.       --  unchecked conversion to the fixed-point type. This attribute is
  142.       --  primarily intended for use in implementation of the input-output
  143.       --  functions for fixed-point values.
  144.  
  145.       ---------
  146.       -- Img --
  147.       ---------
  148.  
  149.       Attribute_Img => True,
  150.       --  The 'Img attribute differs from 'Image in that it may be applied
  151.       --  to objects as well as types, in which case it gives the 'Image
  152.       --  for the subtype of the object. This is convenient for debugging
  153.       --
  154.       --     Put_Line ("X = " & X'Img);
  155.       --
  156.       --  has the same meaning as the more verbose:
  157.       --
  158.       --     Put_Line ("X = " & Temperature_Type'Image (X));
  159.       --
  160.       --  where Temperature_Type is the subtype of the object X.
  161.  
  162.       -------------------
  163.       -- Integer_Value --
  164.       -------------------
  165.  
  166.       Attribute_Integer_Value => True,
  167.       --  For every integer type S, S'Integer_Value denotes a function
  168.       --  with the following specification:
  169.       --
  170.       --    function Integer_Value (Arg : universal_fixed) return S;
  171.       --
  172.       --  The value returned is the integer value V, such that
  173.       --
  174.       --    Arg = V * fixed-type'Small
  175.       --
  176.       --  The effect is thus equivalent to first doing an unchecked convert
  177.       --  from the fixed-point type to its corresponding implementation type,
  178.       --  and then converting the result to the target integer type. This
  179.       --  attribute is primarily intended for use in implementation of the
  180.       --  standard input-output functions for fixed-point values.
  181.  
  182.       ----------------------------
  183.       -- Max_Interrupt_Priority --
  184.       ----------------------------
  185.  
  186.       Attribute_Max_Interrupt_Priority => True,
  187.       --  Standard'Max_Interrupt_Priority (Standard is the only permissible
  188.       --  prefix), provides the value System.Max_Interrupt_Priority, and is
  189.       --  intended primarily for constructing this definition in package
  190.       --  System (see note above in Default_Bit_Order description}.
  191.  
  192.       ------------------
  193.       -- Max_Priority --
  194.       ------------------
  195.  
  196.       Attribute_Max_Priority => True,
  197.       --  Standard'Max_Priority (Standard is the only permissible prefix)
  198.       --  provides the value System.Max_Priority, and is intended primarily
  199.       --  for constructing this definition in package System (see note above
  200.       --  in Default_Bit_Order description).
  201.  
  202.       -----------------------
  203.       -- Maximum_Alignment --
  204.       -----------------------
  205.  
  206.       Attribute_Maximum_Alignment => True,
  207.       --  Standard'Maximum_Alignment (Standard is the only permissible prefix)
  208.       --  provides the maximum useful alignment value for the target. This
  209.       --  is a static value that can be used to specify the alignment for an
  210.       --  object, guaranteeing that it is properly aligned in all cases. The
  211.       --  time this is useful is when an external object is imported and its
  212.       --  alignment requirements are unknown.
  213.  
  214.       -------------------------
  215.       -- Passed_By_Reference --
  216.       -------------------------
  217.  
  218.       Attribute_Passed_By_Reference => True,
  219.       --  T'Passed_By_Reference for any subtype T returns a boolean value
  220.       --  that is true if the type is normally passed by reference and
  221.       --  false if the type is normally passed by copy in calls. For scalar
  222.       --  types, the result is always False and is static. For non-scalar
  223.       --  types, the result is non-static (since it is computed by Gigi).
  224.  
  225.       ------------------
  226.       -- Range_Length --
  227.       ------------------
  228.  
  229.       Attribute_Range_Length => True,
  230.       --  T'Range_Length for any discrete type T yields the number of
  231.       --  values represented by the subtype (zero for a null range). The
  232.       --  result is static for static subtypes. Note that Range_Length
  233.       --  applied to the index subtype of a one dimensional array always
  234.       --  gives the same result as Range applied to the array itself.
  235.  
  236.       ------------------
  237.       -- Storage_Unit --
  238.       ------------------
  239.  
  240.       Attribute_Storage_Unit => True,
  241.       --  Standard'Storage_Unit (Standard is the only permissible prefix)
  242.       --  provides the value System.Storage_Unit, and is intended primarily
  243.       --  for constructing this definition in package System (see note above
  244.       --  in Default_Bit_Order description).
  245.  
  246.       ----------
  247.       -- Tick --
  248.       ----------
  249.  
  250.       Attribute_Tick => True,
  251.       --  Standard'Tick (Standard is the only permissible prefix) provides
  252.       --  the value System.Tick, and is intended primarily for constructing
  253.       --  this definition in package System (see note above in description
  254.       --  of Default_Bit_Order).
  255.  
  256.       ------------------------------
  257.       -- Universal_Literal_String --
  258.       ------------------------------
  259.  
  260.       Attribute_Universal_Literal_String => True,
  261.       --  The prefix of 'Universal_Literal_String must be a named number.
  262.       --  The static result is the string consisting of the characters of
  263.       --  the number as defined in the original source. This allows the
  264.       --  user program to access the actual text of named numbers without
  265.       --  intermediate conversions and without the need to enclose the
  266.       --  strings in quotes (which would preclude their use as numbers).
  267.       --  This is used internally for the construction of values of the
  268.       --  floating-point attributes from the file ttypef.ads, but may
  269.       --  also be used by user programs.
  270.  
  271.       -------------------------
  272.       -- Unrestricted_Access --
  273.       -------------------------
  274.  
  275.       Attribute_Unrestricted_Access => True,
  276.       --  The Unrestricted_Access attribute is similar to Access except that
  277.       --  all accessibility and aliased view checks are omitted. This is very
  278.       --  much a user-beware attribute. Basically its status is very similar
  279.       --  to Address, for which it is a desirable replacement where the value
  280.       --  desired is an access type. In other words, its effect is identical
  281.       --  to first taking 'Address and then doing an unchecked conversion to
  282.       --  a desired access type. Note that in GNAT, but not necessarily in
  283.       --  other implementations, the use of static chains for inner level
  284.       --  subprograms means that Unrestricted_Access applied to a subprogram
  285.       --  yields a value that can be called as long as the subprogram is in
  286.       --  scope (normal Ada 95 accessibility rules restrict this usage).
  287.  
  288.       ---------------
  289.       -- Word_Size --
  290.       ---------------
  291.  
  292.       Attribute_Word_Size => True,
  293.       --  Standard'Word_Size (Standard is the only permissible prefix)
  294.       --  provides the value System.Word_Size, and is intended primarily
  295.       --  for constructing this definition in package System (see note above
  296.       --  in Default_Bit_Order description).
  297.  
  298.  
  299.       others                             => False);
  300.  
  301.    -----------------
  302.    -- Subprograms --
  303.    -----------------
  304.  
  305.    procedure Analyze_Attribute (N : Node_Id);
  306.    --  Performs bottom up semantic analysis of an attribute. Note that the
  307.    --  parser has already checked that type returning attributes appear only
  308.    --  in appropriate contexts (i.e. in subtype marks, or as prefixes for
  309.    --  other attributes).
  310.  
  311.    procedure Eval_Attribute (N : Node_Id);
  312.    --  Performs compile time evaluation of attributes where possible, leaving
  313.    --  the Is_Static_Expression/Raises_Constraint_Error flags appropriately
  314.    --  set, and replacing the node with a literal node if the value can be
  315.    --  computed at compile time. All static attribute references are folded,
  316.    --  as well as a number of cases of non-static attributes that can always
  317.    --  be computed at compile time (e.g. floating-point model attributes that
  318.    --  are applied to non-static subtypes). Of course in such cases, the
  319.    --  Is_Static_Expression flag will not be set on the resulting literal.
  320.  
  321.    procedure Resolve_Attribute (N : Node_Id; Typ : Entity_Id);
  322.    --  Performs type resolution of attribute. If the attribute yields
  323.    --  a universal value, mark its type as that of the context. On
  324.    --  the other hand, if the context itself is universal (as in
  325.    --  T'Val (T'Pos (X)), mark the type as being the largest type of
  326.    --  that class that can be used at run-time. This is correct since
  327.    --  either the value gets folded (in which case it doesn't matter
  328.    --  what type of the class we give if, since the folding uses universal
  329.    --  arithmetic anyway) or it doesn't get folded (in which case it is
  330.    --  going to be dealt with at runtime, and the largest type is right).
  331.  
  332. end Sem_Attr;
  333.