OSDN Git Service

2005-06-14 Ed Schonberg <schonberg@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / sem_ch13.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             S E M _ C H 1 3                              --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
19 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
20 -- MA 02111-1307, USA.                                                      --
21 --                                                                          --
22 -- GNAT was originally developed  by the GNAT team at  New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
24 --                                                                          --
25 ------------------------------------------------------------------------------
26
27 with Atree;    use Atree;
28 with Checks;   use Checks;
29 with Einfo;    use Einfo;
30 with Errout;   use Errout;
31 with Exp_Tss;  use Exp_Tss;
32 with Exp_Util; use Exp_Util;
33 with Lib;      use Lib;
34 with Nlists;   use Nlists;
35 with Nmake;    use Nmake;
36 with Opt;      use Opt;
37 with Restrict; use Restrict;
38 with Rident;   use Rident;
39 with Rtsfind;  use Rtsfind;
40 with Sem;      use Sem;
41 with Sem_Ch8;  use Sem_Ch8;
42 with Sem_Eval; use Sem_Eval;
43 with Sem_Res;  use Sem_Res;
44 with Sem_Type; use Sem_Type;
45 with Sem_Util; use Sem_Util;
46 with Snames;   use Snames;
47 with Stand;    use Stand;
48 with Sinfo;    use Sinfo;
49 with Table;
50 with Targparm; use Targparm;
51 with Ttypes;   use Ttypes;
52 with Tbuild;   use Tbuild;
53 with Urealp;   use Urealp;
54
55 with GNAT.Heap_Sort_A; use GNAT.Heap_Sort_A;
56
57 package body Sem_Ch13 is
58
59    SSU : constant Pos := System_Storage_Unit;
60    --  Convenient short hand for commonly used constant
61
62    -----------------------
63    -- Local Subprograms --
64    -----------------------
65
66    procedure Alignment_Check_For_Esize_Change (Typ : Entity_Id);
67    --  This routine is called after setting the Esize of type entity Typ.
68    --  The purpose is to deal with the situation where an aligment has been
69    --  inherited from a derived type that is no longer appropriate for the
70    --  new Esize value. In this case, we reset the Alignment to unknown.
71
72    procedure Check_Component_Overlap (C1_Ent, C2_Ent : Entity_Id);
73    --  Given two entities for record components or discriminants, checks
74    --  if they hav overlapping component clauses and issues errors if so.
75
76    function Get_Alignment_Value (Expr : Node_Id) return Uint;
77    --  Given the expression for an alignment value, returns the corresponding
78    --  Uint value. If the value is inappropriate, then error messages are
79    --  posted as required, and a value of No_Uint is returned.
80
81    function Is_Operational_Item (N : Node_Id) return Boolean;
82    --  A specification for a stream attribute is allowed before the full
83    --  type is declared, as explained in AI-00137 and the corrigendum.
84    --  Attributes that do not specify a representation characteristic are
85    --  operational attributes.
86
87    function Address_Aliased_Entity (N : Node_Id) return Entity_Id;
88    --  If expression N is of the form E'Address, return E
89
90    procedure Mark_Aliased_Address_As_Volatile (N : Node_Id);
91    --  This is used for processing of an address representation clause. If
92    --  the expression N is of the form of K'Address, then the entity that
93    --  is associated with K is marked as volatile.
94
95    procedure New_Stream_Function
96      (N    : Node_Id;
97       Ent  : Entity_Id;
98       Subp : Entity_Id;
99       Nam  : TSS_Name_Type);
100    --  Create a function renaming of a given stream attribute to the
101    --  designated subprogram and then in the tagged case, provide this as
102    --  a primitive operation, or in the non-tagged case make an appropriate
103    --  TSS entry. Used for Input. This is more properly an expansion activity
104    --  than just semantics, but the presence of user-defined stream functions
105    --  for limited types is a legality check, which is why this takes place
106    --  here rather than in exp_ch13, where it was previously. Nam indicates
107    --  the name of the TSS function to be generated.
108    --
109    --  To avoid elaboration anomalies with freeze nodes, for untagged types
110    --  we generate both a subprogram declaration and a subprogram renaming
111    --  declaration, so that the attribute specification is handled as a
112    --  renaming_as_body. For tagged types, the specification is one of the
113    --  primitive specs.
114
115    procedure New_Stream_Procedure
116      (N     : Node_Id;
117       Ent   : Entity_Id;
118       Subp  : Entity_Id;
119       Nam   : TSS_Name_Type;
120       Out_P : Boolean := False);
121    --  Create a procedure renaming of a given stream attribute to the
122    --  designated subprogram and then in the tagged case, provide this as
123    --  a primitive operation, or in the non-tagged case make an appropriate
124    --  TSS entry. Used for Read, Output, Write. Nam indicates the name of
125    --  the TSS procedure to be generated.
126
127    ----------------------------------------------
128    -- Table for Validate_Unchecked_Conversions --
129    ----------------------------------------------
130
131    --  The following table collects unchecked conversions for validation.
132    --  Entries are made by Validate_Unchecked_Conversion and then the
133    --  call to Validate_Unchecked_Conversions does the actual error
134    --  checking and posting of warnings. The reason for this delayed
135    --  processing is to take advantage of back-annotations of size and
136    --  alignment values peformed by the back end.
137
138    type UC_Entry is record
139       Enode  : Node_Id;   -- node used for posting warnings
140       Source : Entity_Id; -- source type for unchecked conversion
141       Target : Entity_Id; -- target type for unchecked conversion
142    end record;
143
144    package Unchecked_Conversions is new Table.Table (
145      Table_Component_Type => UC_Entry,
146      Table_Index_Type     => Int,
147      Table_Low_Bound      => 1,
148      Table_Initial        => 50,
149      Table_Increment      => 200,
150      Table_Name           => "Unchecked_Conversions");
151
152    ----------------------------
153    -- Address_Aliased_Entity --
154    ----------------------------
155
156    function Address_Aliased_Entity (N : Node_Id) return Entity_Id is
157    begin
158       if Nkind (N) = N_Attribute_Reference
159         and then Attribute_Name (N) = Name_Address
160       then
161          declare
162             Nam : Node_Id := Prefix (N);
163          begin
164             while False
165               or else Nkind (Nam) = N_Selected_Component
166               or else Nkind (Nam) = N_Indexed_Component
167             loop
168                Nam := Prefix (Nam);
169             end loop;
170
171             if Is_Entity_Name (Nam) then
172                return Entity (Nam);
173             end if;
174          end;
175       end if;
176
177       return Empty;
178    end Address_Aliased_Entity;
179
180    --------------------------------------
181    -- Alignment_Check_For_Esize_Change --
182    --------------------------------------
183
184    procedure Alignment_Check_For_Esize_Change (Typ : Entity_Id) is
185    begin
186       --  If the alignment is known, and not set by a rep clause, and is
187       --  inconsistent with the size being set, then reset it to unknown,
188       --  we assume in this case that the size overrides the inherited
189       --  alignment, and that the alignment must be recomputed.
190
191       if Known_Alignment (Typ)
192         and then not Has_Alignment_Clause (Typ)
193         and then Esize (Typ) mod (Alignment (Typ) * SSU) /= 0
194       then
195          Init_Alignment (Typ);
196       end if;
197    end Alignment_Check_For_Esize_Change;
198
199    -----------------------
200    -- Analyze_At_Clause --
201    -----------------------
202
203    --  An at clause is replaced by the corresponding Address attribute
204    --  definition clause that is the preferred approach in Ada 95.
205
206    procedure Analyze_At_Clause (N : Node_Id) is
207    begin
208       Check_Restriction (No_Obsolescent_Features, N);
209
210       if Warn_On_Obsolescent_Feature then
211          Error_Msg_N
212            ("at clause is an obsolescent feature ('R'M 'J.7(2))?", N);
213          Error_Msg_N
214            ("\use address attribute definition clause instead?", N);
215       end if;
216
217       Rewrite (N,
218         Make_Attribute_Definition_Clause (Sloc (N),
219           Name  => Identifier (N),
220           Chars => Name_Address,
221           Expression => Expression (N)));
222       Analyze_Attribute_Definition_Clause (N);
223    end Analyze_At_Clause;
224
225    -----------------------------------------
226    -- Analyze_Attribute_Definition_Clause --
227    -----------------------------------------
228
229    procedure Analyze_Attribute_Definition_Clause (N : Node_Id) is
230       Loc   : constant Source_Ptr   := Sloc (N);
231       Nam   : constant Node_Id      := Name (N);
232       Attr  : constant Name_Id      := Chars (N);
233       Expr  : constant Node_Id      := Expression (N);
234       Id    : constant Attribute_Id := Get_Attribute_Id (Attr);
235       Ent   : Entity_Id;
236       U_Ent : Entity_Id;
237
238       FOnly : Boolean := False;
239       --  Reset to True for subtype specific attribute (Alignment, Size)
240       --  and for stream attributes, i.e. those cases where in the call
241       --  to Rep_Item_Too_Late, FOnly is set True so that only the freezing
242       --  rules are checked. Note that the case of stream attributes is not
243       --  clear from the RM, but see AI95-00137. Also, the RM seems to
244       --  disallow Storage_Size for derived task types, but that is also
245       --  clearly unintentional.
246
247       procedure Analyze_Stream_TSS_Definition (TSS_Nam : TSS_Name_Type);
248       --  Common processing for 'Read, 'Write, 'Input and 'Output attribute
249       --  definition clauses.
250
251       procedure Analyze_Stream_TSS_Definition (TSS_Nam : TSS_Name_Type) is
252          Subp : Entity_Id := Empty;
253          I    : Interp_Index;
254          It   : Interp;
255          Pnam : Entity_Id;
256
257          Is_Read : constant Boolean := (TSS_Nam = TSS_Stream_Read);
258
259          function Has_Good_Profile (Subp : Entity_Id) return Boolean;
260          --  Return true if the entity is a subprogram with an appropriate
261          --  profile for the attribute being defined.
262
263          ----------------------
264          -- Has_Good_Profile --
265          ----------------------
266
267          function Has_Good_Profile (Subp : Entity_Id) return Boolean is
268             F              : Entity_Id;
269             Is_Function    : constant Boolean := (TSS_Nam = TSS_Stream_Input);
270             Expected_Ekind : constant array (Boolean) of Entity_Kind :=
271                                (False => E_Procedure, True => E_Function);
272             Typ            : Entity_Id;
273
274          begin
275             if Ekind (Subp) /= Expected_Ekind (Is_Function) then
276                return False;
277             end if;
278
279             F := First_Formal (Subp);
280
281             if No (F)
282               or else Ekind (Etype (F)) /= E_Anonymous_Access_Type
283               or else Designated_Type (Etype (F)) /=
284                                Class_Wide_Type (RTE (RE_Root_Stream_Type))
285             then
286                return False;
287             end if;
288
289             if not Is_Function then
290                Next_Formal (F);
291
292                declare
293                   Expected_Mode : constant array (Boolean) of Entity_Kind :=
294                                     (False => E_In_Parameter,
295                                      True  => E_Out_Parameter);
296                begin
297                   if Parameter_Mode (F) /= Expected_Mode (Is_Read) then
298                      return False;
299                   end if;
300                end;
301
302                Typ := Etype (F);
303
304             else
305                Typ := Etype (Subp);
306             end if;
307
308             return Base_Type (Typ) = Base_Type (Ent)
309               and then No (Next_Formal (F));
310
311          end Has_Good_Profile;
312
313       --  Start of processing for Analyze_Stream_TSS_Definition
314
315       begin
316          FOnly := True;
317
318          if not Is_Type (U_Ent) then
319             Error_Msg_N ("local name must be a subtype", Nam);
320             return;
321          end if;
322
323          Pnam := TSS (Base_Type (U_Ent), TSS_Nam);
324
325          if Present (Pnam) and then Has_Good_Profile (Pnam) then
326             Error_Msg_Sloc := Sloc (Pnam);
327             Error_Msg_Name_1 := Attr;
328             Error_Msg_N ("% attribute already defined #", Nam);
329             return;
330          end if;
331
332          Analyze (Expr);
333
334          if Is_Entity_Name (Expr) then
335             if not Is_Overloaded (Expr) then
336                if Has_Good_Profile (Entity (Expr)) then
337                   Subp := Entity (Expr);
338                end if;
339
340             else
341                Get_First_Interp (Expr, I, It);
342
343                while Present (It.Nam) loop
344                   if Has_Good_Profile (It.Nam) then
345                      Subp := It.Nam;
346                      exit;
347                   end if;
348
349                   Get_Next_Interp (I, It);
350                end loop;
351             end if;
352          end if;
353
354          if Present (Subp) then
355             if Is_Abstract (Subp) then
356                Error_Msg_N ("stream subprogram must not be abstract", Expr);
357                return;
358             end if;
359
360             Set_Entity (Expr, Subp);
361             Set_Etype (Expr, Etype (Subp));
362
363             if TSS_Nam = TSS_Stream_Input then
364                New_Stream_Function (N, U_Ent, Subp, TSS_Nam);
365             else
366                New_Stream_Procedure (N, U_Ent, Subp, TSS_Nam,
367                                      Out_P => Is_Read);
368             end if;
369
370          else
371             Error_Msg_Name_1 := Attr;
372             Error_Msg_N ("incorrect expression for% attribute", Expr);
373          end if;
374       end Analyze_Stream_TSS_Definition;
375
376    --  Start of processing for Analyze_Attribute_Definition_Clause
377
378    begin
379       Analyze (Nam);
380       Ent := Entity (Nam);
381
382       if Rep_Item_Too_Early (Ent, N) then
383          return;
384       end if;
385
386       --  Rep clause applies to full view of incomplete type or private type if
387       --  we have one (if not, this is a premature use of the type). However,
388       --  certain semantic checks need to be done on the specified entity (i.e.
389       --  the private view), so we save it in Ent.
390
391       if Is_Private_Type (Ent)
392         and then Is_Derived_Type (Ent)
393         and then not Is_Tagged_Type (Ent)
394         and then No (Full_View (Ent))
395       then
396          --  If this is a private type whose completion is a derivation from
397          --  another private type, there is no full view, and the attribute
398          --  belongs to the type itself, not its underlying parent.
399
400          U_Ent := Ent;
401
402       elsif Ekind (Ent) = E_Incomplete_Type then
403
404          --  The attribute applies to the full view, set the entity of the
405          --  attribute definition accordingly.
406
407          Ent := Underlying_Type (Ent);
408          U_Ent := Ent;
409          Set_Entity (Nam, Ent);
410
411       else
412          U_Ent := Underlying_Type (Ent);
413       end if;
414
415       --  Complete other routine error checks
416
417       if Etype (Nam) = Any_Type then
418          return;
419
420       elsif Scope (Ent) /= Current_Scope then
421          Error_Msg_N ("entity must be declared in this scope", Nam);
422          return;
423
424       elsif No (U_Ent) then
425          U_Ent := Ent;
426
427       elsif Is_Type (U_Ent)
428         and then not Is_First_Subtype (U_Ent)
429         and then Id /= Attribute_Object_Size
430         and then Id /= Attribute_Value_Size
431         and then not From_At_Mod (N)
432       then
433          Error_Msg_N ("cannot specify attribute for subtype", Nam);
434          return;
435       end if;
436
437       --  Switch on particular attribute
438
439       case Id is
440
441          -------------
442          -- Address --
443          -------------
444
445          --  Address attribute definition clause
446
447          when Attribute_Address => Address : begin
448             Analyze_And_Resolve (Expr, RTE (RE_Address));
449
450             if Present (Address_Clause (U_Ent)) then
451                Error_Msg_N ("address already given for &", Nam);
452
453             --  Case of address clause for subprogram
454
455             elsif Is_Subprogram (U_Ent) then
456                if Has_Homonym (U_Ent) then
457                   Error_Msg_N
458                     ("address clause cannot be given " &
459                      "for overloaded subprogram",
460                      Nam);
461                end if;
462
463                --  For subprograms, all address clauses are permitted,
464                --  and we mark the subprogram as having a deferred freeze
465                --  so that Gigi will not elaborate it too soon.
466
467                --  Above needs more comments, what is too soon about???
468
469                Set_Has_Delayed_Freeze (U_Ent);
470
471             --  Case of address clause for entry
472
473             elsif Ekind (U_Ent) = E_Entry then
474                if Nkind (Parent (N)) = N_Task_Body then
475                   Error_Msg_N
476                     ("entry address must be specified in task spec", Nam);
477                end if;
478
479                --  For entries, we require a constant address
480
481                Check_Constant_Address_Clause (Expr, U_Ent);
482
483                if Is_Task_Type (Scope (U_Ent))
484                  and then Comes_From_Source (Scope (U_Ent))
485                then
486                   Error_Msg_N
487                     ("?entry address declared for entry in task type", N);
488                   Error_Msg_N
489                     ("\?only one task can be declared of this type", N);
490                end if;
491
492                Check_Restriction (No_Obsolescent_Features, N);
493
494                if Warn_On_Obsolescent_Feature then
495                   Error_Msg_N
496                     ("attaching interrupt to task entry is an " &
497                      "obsolescent feature ('R'M 'J.7.1)?", N);
498                   Error_Msg_N
499                     ("\use interrupt procedure instead?", N);
500                end if;
501
502             --  Case of an address clause for a controlled object:
503             --  erroneous execution.
504
505             elsif Is_Controlled (Etype (U_Ent)) then
506                Error_Msg_NE
507                  ("?controlled object& must not be overlaid", Nam, U_Ent);
508                Error_Msg_N
509                  ("\?Program_Error will be raised at run time", Nam);
510                Insert_Action (Declaration_Node (U_Ent),
511                  Make_Raise_Program_Error (Loc,
512                    Reason => PE_Overlaid_Controlled_Object));
513
514             --  Case of address clause for a (non-controlled) object
515
516             elsif
517               Ekind (U_Ent) = E_Variable
518                 or else
519               Ekind (U_Ent) = E_Constant
520             then
521                declare
522                   Expr : constant Node_Id   := Expression (N);
523                   Aent : constant Entity_Id := Address_Aliased_Entity (Expr);
524
525                begin
526                   --  Exported variables cannot have an address clause,
527                   --  because this cancels the effect of the pragma Export
528
529                   if Is_Exported (U_Ent) then
530                      Error_Msg_N
531                        ("cannot export object with address clause", Nam);
532
533                   --  Overlaying controlled objects is erroneous
534
535                   elsif Present (Aent)
536                     and then Is_Controlled (Etype (Aent))
537                   then
538                      Error_Msg_N
539                        ("?controlled object must not be overlaid", Expr);
540                      Error_Msg_N
541                        ("\?Program_Error will be raised at run time", Expr);
542                      Insert_Action (Declaration_Node (U_Ent),
543                        Make_Raise_Program_Error (Loc,
544                          Reason => PE_Overlaid_Controlled_Object));
545
546                   elsif Present (Aent)
547                     and then Ekind (U_Ent) = E_Constant
548                     and then Ekind (Aent) /= E_Constant
549                   then
550                      Error_Msg_N ("constant overlays a variable?", Expr);
551
552                   elsif Present (Renamed_Object (U_Ent)) then
553                      Error_Msg_N
554                        ("address clause not allowed"
555                           & " for a renaming declaration ('R'M 13.1(6))", Nam);
556
557                   --  Imported variables can have an address clause, but then
558                   --  the import is pretty meaningless except to suppress
559                   --  initializations, so we do not need such variables to
560                   --  be statically allocated (and in fact it causes trouble
561                   --  if the address clause is a local value).
562
563                   elsif Is_Imported (U_Ent) then
564                      Set_Is_Statically_Allocated (U_Ent, False);
565                   end if;
566
567                   --  We mark a possible modification of a variable with an
568                   --  address clause, since it is likely aliasing is occurring.
569
570                   Note_Possible_Modification (Nam);
571
572                   --  Here we are checking for explicit overlap of one
573                   --  variable by another, and if we find this, then we
574                   --  mark the overlapped variable as also being aliased.
575
576                   --  First case is where we have an explicit
577
578                   --    for J'Address use K'Address;
579
580                   --  In this case, we mark K as volatile
581
582                   Mark_Aliased_Address_As_Volatile (Expr);
583
584                   --  Second case is where we have a constant whose
585                   --  definition is of the form of an adress as in:
586
587                   --     A : constant Address := K'Address;
588                   --     ...
589                   --     for B'Address use A;
590
591                   --  In this case we also mark K as volatile
592
593                   if Is_Entity_Name (Expr) then
594                      declare
595                         Ent  : constant Entity_Id := Entity (Expr);
596                         Decl : constant Node_Id   := Declaration_Node (Ent);
597
598                      begin
599                         if Ekind (Ent) = E_Constant
600                           and then Nkind (Decl) = N_Object_Declaration
601                           and then Present (Expression (Decl))
602                         then
603                            Mark_Aliased_Address_As_Volatile
604                              (Expression (Decl));
605                         end if;
606                      end;
607                   end if;
608
609                   --  Legality checks on the address clause for initialized
610                   --  objects is deferred until the freeze point, because
611                   --  a subsequent pragma might indicate that the object is
612                   --  imported and thus not initialized.
613
614                   Set_Has_Delayed_Freeze (U_Ent);
615
616                   if Is_Exported (U_Ent) then
617                      Error_Msg_N
618                        ("& cannot be exported if an address clause is given",
619                         Nam);
620                      Error_Msg_N
621                        ("\define and export a variable " &
622                         "that holds its address instead",
623                         Nam);
624                   end if;
625
626                   --  Entity has delayed freeze, so we will generate
627                   --  an alignment check at the freeze point.
628
629                   Set_Check_Address_Alignment
630                     (N, not Range_Checks_Suppressed (U_Ent));
631
632                   --  Kill the size check code, since we are not allocating
633                   --  the variable, it is somewhere else.
634
635                   Kill_Size_Check_Code (U_Ent);
636                end;
637
638             --  Not a valid entity for an address clause
639
640             else
641                Error_Msg_N ("address cannot be given for &", Nam);
642             end if;
643          end Address;
644
645          ---------------
646          -- Alignment --
647          ---------------
648
649          --  Alignment attribute definition clause
650
651          when Attribute_Alignment => Alignment_Block : declare
652             Align : constant Uint := Get_Alignment_Value (Expr);
653
654          begin
655             FOnly := True;
656
657             if not Is_Type (U_Ent)
658               and then Ekind (U_Ent) /= E_Variable
659               and then Ekind (U_Ent) /= E_Constant
660             then
661                Error_Msg_N ("alignment cannot be given for &", Nam);
662
663             elsif Has_Alignment_Clause (U_Ent) then
664                Error_Msg_Sloc := Sloc (Alignment_Clause (U_Ent));
665                Error_Msg_N ("alignment clause previously given#", N);
666
667             elsif Align /= No_Uint then
668                Set_Has_Alignment_Clause (U_Ent);
669                Set_Alignment            (U_Ent, Align);
670             end if;
671          end Alignment_Block;
672
673          ---------------
674          -- Bit_Order --
675          ---------------
676
677          --  Bit_Order attribute definition clause
678
679          when Attribute_Bit_Order => Bit_Order : declare
680          begin
681             if not Is_Record_Type (U_Ent) then
682                Error_Msg_N
683                  ("Bit_Order can only be defined for record type", Nam);
684
685             else
686                Analyze_And_Resolve (Expr, RTE (RE_Bit_Order));
687
688                if Etype (Expr) = Any_Type then
689                   return;
690
691                elsif not Is_Static_Expression (Expr) then
692                   Flag_Non_Static_Expr
693                     ("Bit_Order requires static expression!", Expr);
694
695                else
696                   if (Expr_Value (Expr) = 0) /= Bytes_Big_Endian then
697                      Set_Reverse_Bit_Order (U_Ent, True);
698                   end if;
699                end if;
700             end if;
701          end Bit_Order;
702
703          --------------------
704          -- Component_Size --
705          --------------------
706
707          --  Component_Size attribute definition clause
708
709          when Attribute_Component_Size => Component_Size_Case : declare
710             Csize    : constant Uint := Static_Integer (Expr);
711             Btype    : Entity_Id;
712             Biased   : Boolean;
713             New_Ctyp : Entity_Id;
714             Decl     : Node_Id;
715
716          begin
717             if not Is_Array_Type (U_Ent) then
718                Error_Msg_N ("component size requires array type", Nam);
719                return;
720             end if;
721
722             Btype := Base_Type (U_Ent);
723
724             if Has_Component_Size_Clause (Btype) then
725                Error_Msg_N
726                  ("component size clase for& previously given", Nam);
727
728             elsif Csize /= No_Uint then
729                Check_Size (Expr, Component_Type (Btype), Csize, Biased);
730
731                if Has_Aliased_Components (Btype)
732                  and then Csize < 32
733                  and then Csize /= 8
734                  and then Csize /= 16
735                then
736                   Error_Msg_N
737                     ("component size incorrect for aliased components", N);
738                   return;
739                end if;
740
741                --  For the biased case, build a declaration for a subtype
742                --  that will be used to represent the biased subtype that
743                --  reflects the biased representation of components. We need
744                --  this subtype to get proper conversions on referencing
745                --  elements of the array.
746
747                if Biased then
748                   New_Ctyp :=
749                     Make_Defining_Identifier (Loc,
750                       Chars => New_External_Name (Chars (U_Ent), 'C', 0, 'T'));
751
752                   Decl :=
753                     Make_Subtype_Declaration (Loc,
754                       Defining_Identifier => New_Ctyp,
755                       Subtype_Indication  =>
756                         New_Occurrence_Of (Component_Type (Btype), Loc));
757
758                   Set_Parent (Decl, N);
759                   Analyze (Decl, Suppress => All_Checks);
760
761                   Set_Has_Delayed_Freeze        (New_Ctyp, False);
762                   Set_Esize                     (New_Ctyp, Csize);
763                   Set_RM_Size                   (New_Ctyp, Csize);
764                   Init_Alignment                (New_Ctyp);
765                   Set_Has_Biased_Representation (New_Ctyp, True);
766                   Set_Is_Itype                  (New_Ctyp, True);
767                   Set_Associated_Node_For_Itype (New_Ctyp, U_Ent);
768
769                   Set_Component_Type (Btype, New_Ctyp);
770                end if;
771
772                Set_Component_Size            (Btype, Csize);
773                Set_Has_Component_Size_Clause (Btype, True);
774                Set_Has_Non_Standard_Rep      (Btype, True);
775             end if;
776          end Component_Size_Case;
777
778          ------------------
779          -- External_Tag --
780          ------------------
781
782          when Attribute_External_Tag => External_Tag :
783          begin
784             if not Is_Tagged_Type (U_Ent) then
785                Error_Msg_N ("should be a tagged type", Nam);
786             end if;
787
788             Analyze_And_Resolve (Expr, Standard_String);
789
790             if not Is_Static_Expression (Expr) then
791                Flag_Non_Static_Expr
792                  ("static string required for tag name!", Nam);
793             end if;
794
795             Set_Has_External_Tag_Rep_Clause (U_Ent);
796          end External_Tag;
797
798          -----------
799          -- Input --
800          -----------
801
802          when Attribute_Input =>
803             Analyze_Stream_TSS_Definition (TSS_Stream_Input);
804             Set_Has_Specified_Stream_Input (Ent);
805
806          -------------------
807          -- Machine_Radix --
808          -------------------
809
810          --  Machine radix attribute definition clause
811
812          when Attribute_Machine_Radix => Machine_Radix : declare
813             Radix : constant Uint := Static_Integer (Expr);
814
815          begin
816             if not Is_Decimal_Fixed_Point_Type (U_Ent) then
817                Error_Msg_N ("decimal fixed-point type expected for &", Nam);
818
819             elsif Has_Machine_Radix_Clause (U_Ent) then
820                Error_Msg_Sloc := Sloc (Alignment_Clause (U_Ent));
821                Error_Msg_N ("machine radix clause previously given#", N);
822
823             elsif Radix /= No_Uint then
824                Set_Has_Machine_Radix_Clause (U_Ent);
825                Set_Has_Non_Standard_Rep (Base_Type (U_Ent));
826
827                if Radix = 2 then
828                   null;
829                elsif Radix = 10 then
830                   Set_Machine_Radix_10 (U_Ent);
831                else
832                   Error_Msg_N ("machine radix value must be 2 or 10", Expr);
833                end if;
834             end if;
835          end Machine_Radix;
836
837          -----------------
838          -- Object_Size --
839          -----------------
840
841          --  Object_Size attribute definition clause
842
843          when Attribute_Object_Size => Object_Size : declare
844             Size   : constant Uint := Static_Integer (Expr);
845             Biased : Boolean;
846
847          begin
848             if not Is_Type (U_Ent) then
849                Error_Msg_N ("Object_Size cannot be given for &", Nam);
850
851             elsif Has_Object_Size_Clause (U_Ent) then
852                Error_Msg_N ("Object_Size already given for &", Nam);
853
854             else
855                Check_Size (Expr, U_Ent, Size, Biased);
856
857                if Size /= 8
858                     and then
859                   Size /= 16
860                     and then
861                   Size /= 32
862                     and then
863                   UI_Mod (Size, 64) /= 0
864                then
865                   Error_Msg_N
866                     ("Object_Size must be 8, 16, 32, or multiple of 64",
867                      Expr);
868                end if;
869
870                Set_Esize (U_Ent, Size);
871                Set_Has_Object_Size_Clause (U_Ent);
872                Alignment_Check_For_Esize_Change (U_Ent);
873             end if;
874          end Object_Size;
875
876          ------------
877          -- Output --
878          ------------
879
880          when Attribute_Output =>
881             Analyze_Stream_TSS_Definition (TSS_Stream_Output);
882             Set_Has_Specified_Stream_Output (Ent);
883
884          ----------
885          -- Read --
886          ----------
887
888          when Attribute_Read =>
889             Analyze_Stream_TSS_Definition (TSS_Stream_Read);
890             Set_Has_Specified_Stream_Read (Ent);
891
892          ----------
893          -- Size --
894          ----------
895
896          --  Size attribute definition clause
897
898          when Attribute_Size => Size : declare
899             Size   : constant Uint := Static_Integer (Expr);
900             Etyp   : Entity_Id;
901             Biased : Boolean;
902
903          begin
904             FOnly := True;
905
906             if Has_Size_Clause (U_Ent) then
907                Error_Msg_N ("size already given for &", Nam);
908
909             elsif not Is_Type (U_Ent)
910               and then Ekind (U_Ent) /= E_Variable
911               and then Ekind (U_Ent) /= E_Constant
912             then
913                Error_Msg_N ("size cannot be given for &", Nam);
914
915             elsif Is_Array_Type (U_Ent)
916               and then not Is_Constrained (U_Ent)
917             then
918                Error_Msg_N
919                  ("size cannot be given for unconstrained array", Nam);
920
921             elsif Size /= No_Uint then
922                if Is_Type (U_Ent) then
923                   Etyp := U_Ent;
924                else
925                   Etyp := Etype (U_Ent);
926                end if;
927
928                --  Check size, note that Gigi is in charge of checking
929                --  that the size of an array or record type is OK. Also
930                --  we do not check the size in the ordinary fixed-point
931                --  case, since it is too early to do so (there may be a
932                --  subsequent small clause that affects the size). We can
933                --  check the size if a small clause has already been given.
934
935                if not Is_Ordinary_Fixed_Point_Type (U_Ent)
936                  or else Has_Small_Clause (U_Ent)
937                then
938                   Check_Size (Expr, Etyp, Size, Biased);
939                   Set_Has_Biased_Representation (U_Ent, Biased);
940                end if;
941
942                --  For types set RM_Size and Esize if possible
943
944                if Is_Type (U_Ent) then
945                   Set_RM_Size (U_Ent, Size);
946
947                   --  For scalar types, increase Object_Size to power of 2,
948                   --  but not less than a storage unit in any case (i.e.,
949                   --  normally this means it will be byte addressable).
950
951                   if Is_Scalar_Type (U_Ent) then
952                      if Size <= System_Storage_Unit then
953                         Init_Esize (U_Ent, System_Storage_Unit);
954                      elsif Size <= 16 then
955                         Init_Esize (U_Ent, 16);
956                      elsif Size <= 32 then
957                         Init_Esize (U_Ent, 32);
958                      else
959                         Set_Esize  (U_Ent, (Size + 63) / 64 * 64);
960                      end if;
961
962                   --  For all other types, object size = value size. The
963                   --  backend will adjust as needed.
964
965                   else
966                      Set_Esize (U_Ent, Size);
967                   end if;
968
969                   Alignment_Check_For_Esize_Change (U_Ent);
970
971                --  For objects, set Esize only
972
973                else
974                   if Is_Elementary_Type (Etyp) then
975                      if Size /= System_Storage_Unit
976                           and then
977                         Size /= System_Storage_Unit * 2
978                           and then
979                         Size /= System_Storage_Unit * 4
980                            and then
981                         Size /= System_Storage_Unit * 8
982                      then
983                         Error_Msg_Uint_1 := UI_From_Int (System_Storage_Unit);
984                         Error_Msg_N
985                           ("size for primitive object must be a power of 2"
986                             & " and at least ^", N);
987                      end if;
988                   end if;
989
990                   Set_Esize (U_Ent, Size);
991                end if;
992
993                Set_Has_Size_Clause (U_Ent);
994             end if;
995          end Size;
996
997          -----------
998          -- Small --
999          -----------
1000
1001          --  Small attribute definition clause
1002
1003          when Attribute_Small => Small : declare
1004             Implicit_Base : constant Entity_Id := Base_Type (U_Ent);
1005             Small         : Ureal;
1006
1007          begin
1008             Analyze_And_Resolve (Expr, Any_Real);
1009
1010             if Etype (Expr) = Any_Type then
1011                return;
1012
1013             elsif not Is_Static_Expression (Expr) then
1014                Flag_Non_Static_Expr
1015                  ("small requires static expression!", Expr);
1016                return;
1017
1018             else
1019                Small := Expr_Value_R (Expr);
1020
1021                if Small <= Ureal_0 then
1022                   Error_Msg_N ("small value must be greater than zero", Expr);
1023                   return;
1024                end if;
1025
1026             end if;
1027
1028             if not Is_Ordinary_Fixed_Point_Type (U_Ent) then
1029                Error_Msg_N
1030                  ("small requires an ordinary fixed point type", Nam);
1031
1032             elsif Has_Small_Clause (U_Ent) then
1033                Error_Msg_N ("small already given for &", Nam);
1034
1035             elsif Small > Delta_Value (U_Ent) then
1036                Error_Msg_N
1037                  ("small value must not be greater then delta value", Nam);
1038
1039             else
1040                Set_Small_Value (U_Ent, Small);
1041                Set_Small_Value (Implicit_Base, Small);
1042                Set_Has_Small_Clause (U_Ent);
1043                Set_Has_Small_Clause (Implicit_Base);
1044                Set_Has_Non_Standard_Rep (Implicit_Base);
1045             end if;
1046          end Small;
1047
1048          ------------------
1049          -- Storage_Size --
1050          ------------------
1051
1052          --  Storage_Size attribute definition clause
1053
1054          when Attribute_Storage_Size => Storage_Size : declare
1055             Btype : constant Entity_Id := Base_Type (U_Ent);
1056             Sprag : Node_Id;
1057
1058          begin
1059             if Is_Task_Type (U_Ent) then
1060                Check_Restriction (No_Obsolescent_Features, N);
1061
1062                if Warn_On_Obsolescent_Feature then
1063                   Error_Msg_N
1064                     ("storage size clause for task is an " &
1065                      "obsolescent feature ('R'M 'J.9)?", N);
1066                   Error_Msg_N
1067                     ("\use Storage_Size pragma instead?", N);
1068                end if;
1069
1070                FOnly := True;
1071             end if;
1072
1073             if not Is_Access_Type (U_Ent)
1074               and then Ekind (U_Ent) /= E_Task_Type
1075             then
1076                Error_Msg_N ("storage size cannot be given for &", Nam);
1077
1078             elsif Is_Access_Type (U_Ent) and Is_Derived_Type (U_Ent) then
1079                Error_Msg_N
1080                  ("storage size cannot be given for a derived access type",
1081                   Nam);
1082
1083             elsif Has_Storage_Size_Clause (Btype) then
1084                Error_Msg_N ("storage size already given for &", Nam);
1085
1086             else
1087                Analyze_And_Resolve (Expr, Any_Integer);
1088
1089                if Is_Access_Type (U_Ent) then
1090
1091                   if Present (Associated_Storage_Pool (U_Ent)) then
1092                      Error_Msg_N ("storage pool already given for &", Nam);
1093                      return;
1094                   end if;
1095
1096                   if Compile_Time_Known_Value (Expr)
1097                     and then Expr_Value (Expr) = 0
1098                   then
1099                      Set_No_Pool_Assigned (Btype);
1100                   end if;
1101
1102                else -- Is_Task_Type (U_Ent)
1103                   Sprag := Get_Rep_Pragma (Btype, Name_Storage_Size);
1104
1105                   if Present (Sprag) then
1106                      Error_Msg_Sloc := Sloc (Sprag);
1107                      Error_Msg_N
1108                        ("Storage_Size already specified#", Nam);
1109                      return;
1110                   end if;
1111                end if;
1112
1113                Set_Has_Storage_Size_Clause (Btype);
1114             end if;
1115          end Storage_Size;
1116
1117          ------------------
1118          -- Storage_Pool --
1119          ------------------
1120
1121          --  Storage_Pool attribute definition clause
1122
1123          when Attribute_Storage_Pool => Storage_Pool : declare
1124             Pool : Entity_Id;
1125             T    : Entity_Id;
1126
1127          begin
1128             if Ekind (U_Ent) /= E_Access_Type
1129               and then Ekind (U_Ent) /= E_General_Access_Type
1130             then
1131                Error_Msg_N (
1132                  "storage pool can only be given for access types", Nam);
1133                return;
1134
1135             elsif Is_Derived_Type (U_Ent) then
1136                Error_Msg_N
1137                  ("storage pool cannot be given for a derived access type",
1138                   Nam);
1139
1140             elsif Has_Storage_Size_Clause (U_Ent) then
1141                Error_Msg_N ("storage size already given for &", Nam);
1142                return;
1143
1144             elsif Present (Associated_Storage_Pool (U_Ent)) then
1145                Error_Msg_N ("storage pool already given for &", Nam);
1146                return;
1147             end if;
1148
1149             Analyze_And_Resolve
1150               (Expr, Class_Wide_Type (RTE (RE_Root_Storage_Pool)));
1151
1152             if Nkind (Expr) = N_Type_Conversion then
1153                T := Etype (Expression (Expr));
1154             else
1155                T := Etype (Expr);
1156             end if;
1157
1158             --  The Stack_Bounded_Pool is used internally for implementing
1159             --  access types with a Storage_Size. Since it only work
1160             --  properly when used on one specific type, we need to check
1161             --  that it is not highjacked improperly:
1162             --    type T is access Integer;
1163             --    for T'Storage_Size use n;
1164             --    type Q is access Float;
1165             --    for Q'Storage_Size use T'Storage_Size; -- incorrect
1166
1167             if Base_Type (T) = RTE (RE_Stack_Bounded_Pool) then
1168                Error_Msg_N ("non-sharable internal Pool", Expr);
1169                return;
1170             end if;
1171
1172             --  If the argument is a name that is not an entity name, then
1173             --  we construct a renaming operation to define an entity of
1174             --  type storage pool.
1175
1176             if not Is_Entity_Name (Expr)
1177               and then Is_Object_Reference (Expr)
1178             then
1179                Pool :=
1180                  Make_Defining_Identifier (Loc,
1181                    Chars => New_Internal_Name ('P'));
1182
1183                declare
1184                   Rnode : constant Node_Id :=
1185                             Make_Object_Renaming_Declaration (Loc,
1186                               Defining_Identifier => Pool,
1187                               Subtype_Mark        =>
1188                                 New_Occurrence_Of (Etype (Expr), Loc),
1189                               Name => Expr);
1190
1191                begin
1192                   Insert_Before (N, Rnode);
1193                   Analyze (Rnode);
1194                   Set_Associated_Storage_Pool (U_Ent, Pool);
1195                end;
1196
1197             elsif Is_Entity_Name (Expr) then
1198                Pool := Entity (Expr);
1199
1200                --  If pool is a renamed object, get original one. This can
1201                --  happen with an explicit renaming, and within instances.
1202
1203                while Present (Renamed_Object (Pool))
1204                  and then Is_Entity_Name (Renamed_Object (Pool))
1205                loop
1206                   Pool := Entity (Renamed_Object (Pool));
1207                end loop;
1208
1209                if Present (Renamed_Object (Pool))
1210                  and then Nkind (Renamed_Object (Pool)) = N_Type_Conversion
1211                  and then Is_Entity_Name (Expression (Renamed_Object (Pool)))
1212                then
1213                   Pool := Entity (Expression (Renamed_Object (Pool)));
1214                end if;
1215
1216                Set_Associated_Storage_Pool (U_Ent, Pool);
1217
1218             elsif Nkind (Expr) = N_Type_Conversion
1219               and then Is_Entity_Name (Expression (Expr))
1220               and then Nkind (Original_Node (Expr)) = N_Attribute_Reference
1221             then
1222                Pool := Entity (Expression (Expr));
1223                Set_Associated_Storage_Pool (U_Ent, Pool);
1224
1225             else
1226                Error_Msg_N ("incorrect reference to a Storage Pool", Expr);
1227                return;
1228             end if;
1229          end Storage_Pool;
1230
1231          -----------------
1232          -- Stream_Size --
1233          -----------------
1234
1235          when Attribute_Stream_Size => Stream_Size : declare
1236             Size : constant Uint := Static_Integer (Expr);
1237
1238          begin
1239             if Has_Stream_Size_Clause (U_Ent) then
1240                Error_Msg_N ("Stream_Size already given for &", Nam);
1241
1242             elsif Is_Elementary_Type (U_Ent) then
1243                if Size /= System_Storage_Unit
1244                     and then
1245                   Size /= System_Storage_Unit * 2
1246                     and then
1247                   Size /= System_Storage_Unit * 4
1248                      and then
1249                   Size /= System_Storage_Unit * 8
1250                then
1251                   Error_Msg_Uint_1 := UI_From_Int (System_Storage_Unit);
1252                   Error_Msg_N
1253                     ("stream size for elementary type must be a"
1254                        & " power of 2 and at least ^", N);
1255
1256                elsif RM_Size (U_Ent) > Size then
1257                   Error_Msg_Uint_1 := RM_Size (U_Ent);
1258                   Error_Msg_N
1259                     ("stream size for elementary type must be a"
1260                        & " power of 2 and at least ^", N);
1261                end if;
1262
1263                Set_Has_Stream_Size_Clause (U_Ent);
1264
1265             else
1266                Error_Msg_N ("Stream_Size cannot be given for &", Nam);
1267             end if;
1268          end Stream_Size;
1269
1270          ----------------
1271          -- Value_Size --
1272          ----------------
1273
1274          --  Value_Size attribute definition clause
1275
1276          when Attribute_Value_Size => Value_Size : declare
1277             Size   : constant Uint := Static_Integer (Expr);
1278             Biased : Boolean;
1279
1280          begin
1281             if not Is_Type (U_Ent) then
1282                Error_Msg_N ("Value_Size cannot be given for &", Nam);
1283
1284             elsif Present
1285                    (Get_Attribute_Definition_Clause
1286                      (U_Ent, Attribute_Value_Size))
1287             then
1288                Error_Msg_N ("Value_Size already given for &", Nam);
1289
1290             else
1291                if Is_Elementary_Type (U_Ent) then
1292                   Check_Size (Expr, U_Ent, Size, Biased);
1293                   Set_Has_Biased_Representation (U_Ent, Biased);
1294                end if;
1295
1296                Set_RM_Size (U_Ent, Size);
1297             end if;
1298          end Value_Size;
1299
1300          -----------
1301          -- Write --
1302          -----------
1303
1304          when Attribute_Write =>
1305             Analyze_Stream_TSS_Definition (TSS_Stream_Write);
1306             Set_Has_Specified_Stream_Write (Ent);
1307
1308          --  All other attributes cannot be set
1309
1310          when others =>
1311             Error_Msg_N
1312               ("attribute& cannot be set with definition clause", N);
1313       end case;
1314
1315       --  The test for the type being frozen must be performed after
1316       --  any expression the clause has been analyzed since the expression
1317       --  itself might cause freezing that makes the clause illegal.
1318
1319       if Rep_Item_Too_Late (U_Ent, N, FOnly) then
1320          return;
1321       end if;
1322    end Analyze_Attribute_Definition_Clause;
1323
1324    ----------------------------
1325    -- Analyze_Code_Statement --
1326    ----------------------------
1327
1328    procedure Analyze_Code_Statement (N : Node_Id) is
1329       HSS   : constant Node_Id   := Parent (N);
1330       SBody : constant Node_Id   := Parent (HSS);
1331       Subp  : constant Entity_Id := Current_Scope;
1332       Stmt  : Node_Id;
1333       Decl  : Node_Id;
1334       StmtO : Node_Id;
1335       DeclO : Node_Id;
1336
1337    begin
1338       --  Analyze and check we get right type, note that this implements the
1339       --  requirement (RM 13.8(1)) that Machine_Code be with'ed, since that
1340       --  is the only way that Asm_Insn could possibly be visible.
1341
1342       Analyze_And_Resolve (Expression (N));
1343
1344       if Etype (Expression (N)) = Any_Type then
1345          return;
1346       elsif Etype (Expression (N)) /= RTE (RE_Asm_Insn) then
1347          Error_Msg_N ("incorrect type for code statement", N);
1348          return;
1349       end if;
1350
1351       --  Make sure we appear in the handled statement sequence of a
1352       --  subprogram (RM 13.8(3)).
1353
1354       if Nkind (HSS) /= N_Handled_Sequence_Of_Statements
1355         or else Nkind (SBody) /= N_Subprogram_Body
1356       then
1357          Error_Msg_N
1358            ("code statement can only appear in body of subprogram", N);
1359          return;
1360       end if;
1361
1362       --  Do remaining checks (RM 13.8(3)) if not already done
1363
1364       if not Is_Machine_Code_Subprogram (Subp) then
1365          Set_Is_Machine_Code_Subprogram (Subp);
1366
1367          --  No exception handlers allowed
1368
1369          if Present (Exception_Handlers (HSS)) then
1370             Error_Msg_N
1371               ("exception handlers not permitted in machine code subprogram",
1372                First (Exception_Handlers (HSS)));
1373          end if;
1374
1375          --  No declarations other than use clauses and pragmas (we allow
1376          --  certain internally generated declarations as well).
1377
1378          Decl := First (Declarations (SBody));
1379          while Present (Decl) loop
1380             DeclO := Original_Node (Decl);
1381             if Comes_From_Source (DeclO)
1382               and then Nkind (DeclO) /= N_Pragma
1383               and then Nkind (DeclO) /= N_Use_Package_Clause
1384               and then Nkind (DeclO) /= N_Use_Type_Clause
1385               and then Nkind (DeclO) /= N_Implicit_Label_Declaration
1386             then
1387                Error_Msg_N
1388                  ("this declaration not allowed in machine code subprogram",
1389                   DeclO);
1390             end if;
1391
1392             Next (Decl);
1393          end loop;
1394
1395          --  No statements other than code statements, pragmas, and labels.
1396          --  Again we allow certain internally generated statements.
1397
1398          Stmt := First (Statements (HSS));
1399          while Present (Stmt) loop
1400             StmtO := Original_Node (Stmt);
1401             if Comes_From_Source (StmtO)
1402               and then Nkind (StmtO) /= N_Pragma
1403               and then Nkind (StmtO) /= N_Label
1404               and then Nkind (StmtO) /= N_Code_Statement
1405             then
1406                Error_Msg_N
1407                  ("this statement is not allowed in machine code subprogram",
1408                   StmtO);
1409             end if;
1410
1411             Next (Stmt);
1412          end loop;
1413       end if;
1414    end Analyze_Code_Statement;
1415
1416    -----------------------------------------------
1417    -- Analyze_Enumeration_Representation_Clause --
1418    -----------------------------------------------
1419
1420    procedure Analyze_Enumeration_Representation_Clause (N : Node_Id) is
1421       Ident    : constant Node_Id    := Identifier (N);
1422       Aggr     : constant Node_Id    := Array_Aggregate (N);
1423       Enumtype : Entity_Id;
1424       Elit     : Entity_Id;
1425       Expr     : Node_Id;
1426       Assoc    : Node_Id;
1427       Choice   : Node_Id;
1428       Val      : Uint;
1429       Err      : Boolean := False;
1430
1431       Lo  : constant Uint := Expr_Value (Type_Low_Bound (Universal_Integer));
1432       Hi  : constant Uint := Expr_Value (Type_High_Bound (Universal_Integer));
1433       Min : Uint;
1434       Max : Uint;
1435
1436    begin
1437       --  First some basic error checks
1438
1439       Find_Type (Ident);
1440       Enumtype := Entity (Ident);
1441
1442       if Enumtype = Any_Type
1443         or else Rep_Item_Too_Early (Enumtype, N)
1444       then
1445          return;
1446       else
1447          Enumtype := Underlying_Type (Enumtype);
1448       end if;
1449
1450       if not Is_Enumeration_Type (Enumtype) then
1451          Error_Msg_NE
1452            ("enumeration type required, found}",
1453             Ident, First_Subtype (Enumtype));
1454          return;
1455       end if;
1456
1457       --  Ignore rep clause on generic actual type. This will already have
1458       --  been flagged on the template as an error, and this is the safest
1459       --  way to ensure we don't get a junk cascaded message in the instance.
1460
1461       if Is_Generic_Actual_Type (Enumtype) then
1462          return;
1463
1464       --  Type must be in current scope
1465
1466       elsif Scope (Enumtype) /= Current_Scope then
1467          Error_Msg_N ("type must be declared in this scope", Ident);
1468          return;
1469
1470       --  Type must be a first subtype
1471
1472       elsif not Is_First_Subtype (Enumtype) then
1473          Error_Msg_N ("cannot give enumeration rep clause for subtype", N);
1474          return;
1475
1476       --  Ignore duplicate rep clause
1477
1478       elsif Has_Enumeration_Rep_Clause (Enumtype) then
1479          Error_Msg_N ("duplicate enumeration rep clause ignored", N);
1480          return;
1481
1482       --  Don't allow rep clause for standard [wide_[wide_]]character
1483
1484       elsif Root_Type (Enumtype) = Standard_Character
1485         or else Root_Type (Enumtype) = Standard_Wide_Character
1486         or else Root_Type (Enumtype) = Standard_Wide_Wide_Character
1487       then
1488          Error_Msg_N ("enumeration rep clause not allowed for this type", N);
1489          return;
1490
1491       --  All tests passed, so set rep clause in place
1492
1493       else
1494          Set_Has_Enumeration_Rep_Clause (Enumtype);
1495          Set_Has_Enumeration_Rep_Clause (Base_Type (Enumtype));
1496       end if;
1497
1498       --  Now we process the aggregate. Note that we don't use the normal
1499       --  aggregate code for this purpose, because we don't want any of the
1500       --  normal expansion activities, and a number of special semantic
1501       --  rules apply (including the component type being any integer type)
1502
1503       --  Badent signals that we found some incorrect entries processing
1504       --  the list. The final checks for completeness and ordering are
1505       --  skipped in this case.
1506
1507       Elit := First_Literal (Enumtype);
1508
1509       --  First the positional entries if any
1510
1511       if Present (Expressions (Aggr)) then
1512          Expr := First (Expressions (Aggr));
1513          while Present (Expr) loop
1514             if No (Elit) then
1515                Error_Msg_N ("too many entries in aggregate", Expr);
1516                return;
1517             end if;
1518
1519             Val := Static_Integer (Expr);
1520
1521             if Val = No_Uint then
1522                Err := True;
1523
1524             elsif Val < Lo or else Hi < Val then
1525                Error_Msg_N ("value outside permitted range", Expr);
1526                Err := True;
1527             end if;
1528
1529             Set_Enumeration_Rep (Elit, Val);
1530             Set_Enumeration_Rep_Expr (Elit, Expr);
1531             Next (Expr);
1532             Next (Elit);
1533          end loop;
1534       end if;
1535
1536       --  Now process the named entries if present
1537
1538       if Present (Component_Associations (Aggr)) then
1539          Assoc := First (Component_Associations (Aggr));
1540          while Present (Assoc) loop
1541             Choice := First (Choices (Assoc));
1542
1543             if Present (Next (Choice)) then
1544                Error_Msg_N
1545                  ("multiple choice not allowed here", Next (Choice));
1546                Err := True;
1547             end if;
1548
1549             if Nkind (Choice) = N_Others_Choice then
1550                Error_Msg_N ("others choice not allowed here", Choice);
1551                Err := True;
1552
1553             elsif Nkind (Choice) = N_Range then
1554                --  ??? should allow zero/one element range here
1555                Error_Msg_N ("range not allowed here", Choice);
1556                Err := True;
1557
1558             else
1559                Analyze_And_Resolve (Choice, Enumtype);
1560
1561                if Is_Entity_Name (Choice)
1562                  and then Is_Type (Entity (Choice))
1563                then
1564                   Error_Msg_N ("subtype name not allowed here", Choice);
1565                   Err := True;
1566                   --  ??? should allow static subtype with zero/one entry
1567
1568                elsif Etype (Choice) = Base_Type (Enumtype) then
1569                   if not Is_Static_Expression (Choice) then
1570                      Flag_Non_Static_Expr
1571                        ("non-static expression used for choice!", Choice);
1572                      Err := True;
1573
1574                   else
1575                      Elit := Expr_Value_E (Choice);
1576
1577                      if Present (Enumeration_Rep_Expr (Elit)) then
1578                         Error_Msg_Sloc := Sloc (Enumeration_Rep_Expr (Elit));
1579                         Error_Msg_NE
1580                           ("representation for& previously given#",
1581                            Choice, Elit);
1582                         Err := True;
1583                      end if;
1584
1585                      Set_Enumeration_Rep_Expr (Elit, Choice);
1586
1587                      Expr := Expression (Assoc);
1588                      Val := Static_Integer (Expr);
1589
1590                      if Val = No_Uint then
1591                         Err := True;
1592
1593                      elsif Val < Lo or else Hi < Val then
1594                         Error_Msg_N ("value outside permitted range", Expr);
1595                         Err := True;
1596                      end if;
1597
1598                      Set_Enumeration_Rep (Elit, Val);
1599                   end if;
1600                end if;
1601             end if;
1602
1603             Next (Assoc);
1604          end loop;
1605       end if;
1606
1607       --  Aggregate is fully processed. Now we check that a full set of
1608       --  representations was given, and that they are in range and in order.
1609       --  These checks are only done if no other errors occurred.
1610
1611       if not Err then
1612          Min  := No_Uint;
1613          Max  := No_Uint;
1614
1615          Elit := First_Literal (Enumtype);
1616          while Present (Elit) loop
1617             if No (Enumeration_Rep_Expr (Elit)) then
1618                Error_Msg_NE ("missing representation for&!", N, Elit);
1619
1620             else
1621                Val := Enumeration_Rep (Elit);
1622
1623                if Min = No_Uint then
1624                   Min := Val;
1625                end if;
1626
1627                if Val /= No_Uint then
1628                   if Max /= No_Uint and then Val <= Max then
1629                      Error_Msg_NE
1630                        ("enumeration value for& not ordered!",
1631                                        Enumeration_Rep_Expr (Elit), Elit);
1632                   end if;
1633
1634                   Max := Val;
1635                end if;
1636
1637                --  If there is at least one literal whose representation
1638                --  is not equal to the Pos value, then note that this
1639                --  enumeration type has a non-standard representation.
1640
1641                if Val /= Enumeration_Pos (Elit) then
1642                   Set_Has_Non_Standard_Rep (Base_Type (Enumtype));
1643                end if;
1644             end if;
1645
1646             Next (Elit);
1647          end loop;
1648
1649          --  Now set proper size information
1650
1651          declare
1652             Minsize : Uint := UI_From_Int (Minimum_Size (Enumtype));
1653
1654          begin
1655             if Has_Size_Clause (Enumtype) then
1656                if Esize (Enumtype) >= Minsize then
1657                   null;
1658
1659                else
1660                   Minsize :=
1661                     UI_From_Int (Minimum_Size (Enumtype, Biased => True));
1662
1663                   if Esize (Enumtype) < Minsize then
1664                      Error_Msg_N ("previously given size is too small", N);
1665
1666                   else
1667                      Set_Has_Biased_Representation (Enumtype);
1668                   end if;
1669                end if;
1670
1671             else
1672                Set_RM_Size    (Enumtype, Minsize);
1673                Set_Enum_Esize (Enumtype);
1674             end if;
1675
1676             Set_RM_Size   (Base_Type (Enumtype), RM_Size   (Enumtype));
1677             Set_Esize     (Base_Type (Enumtype), Esize     (Enumtype));
1678             Set_Alignment (Base_Type (Enumtype), Alignment (Enumtype));
1679          end;
1680       end if;
1681
1682       --  We repeat the too late test in case it froze itself!
1683
1684       if Rep_Item_Too_Late (Enumtype, N) then
1685          null;
1686       end if;
1687    end Analyze_Enumeration_Representation_Clause;
1688
1689    ----------------------------
1690    -- Analyze_Free_Statement --
1691    ----------------------------
1692
1693    procedure Analyze_Free_Statement (N : Node_Id) is
1694    begin
1695       Analyze (Expression (N));
1696    end Analyze_Free_Statement;
1697
1698    ------------------------------------------
1699    -- Analyze_Record_Representation_Clause --
1700    ------------------------------------------
1701
1702    procedure Analyze_Record_Representation_Clause (N : Node_Id) is
1703       Loc     : constant Source_Ptr := Sloc (N);
1704       Ident   : constant Node_Id    := Identifier (N);
1705       Rectype : Entity_Id;
1706       Fent    : Entity_Id;
1707       CC      : Node_Id;
1708       Posit   : Uint;
1709       Fbit    : Uint;
1710       Lbit    : Uint;
1711       Hbit    : Uint := Uint_0;
1712       Comp    : Entity_Id;
1713       Ocomp   : Entity_Id;
1714       Biased  : Boolean;
1715
1716       Max_Bit_So_Far : Uint;
1717       --  Records the maximum bit position so far. If all field positions
1718       --  are monotonically increasing, then we can skip the circuit for
1719       --  checking for overlap, since no overlap is possible.
1720
1721       Overlap_Check_Required : Boolean;
1722       --  Used to keep track of whether or not an overlap check is required
1723
1724       Ccount : Natural := 0;
1725       --  Number of component clauses in record rep clause
1726
1727    begin
1728       Find_Type (Ident);
1729       Rectype := Entity (Ident);
1730
1731       if Rectype = Any_Type
1732         or else Rep_Item_Too_Early (Rectype, N)
1733       then
1734          return;
1735       else
1736          Rectype := Underlying_Type (Rectype);
1737       end if;
1738
1739       --  First some basic error checks
1740
1741       if not Is_Record_Type (Rectype) then
1742          Error_Msg_NE
1743            ("record type required, found}", Ident, First_Subtype (Rectype));
1744          return;
1745
1746       elsif Is_Unchecked_Union (Rectype) then
1747          Error_Msg_N
1748            ("record rep clause not allowed for Unchecked_Union", N);
1749
1750       elsif Scope (Rectype) /= Current_Scope then
1751          Error_Msg_N ("type must be declared in this scope", N);
1752          return;
1753
1754       elsif not Is_First_Subtype (Rectype) then
1755          Error_Msg_N ("cannot give record rep clause for subtype", N);
1756          return;
1757
1758       elsif Has_Record_Rep_Clause (Rectype) then
1759          Error_Msg_N ("duplicate record rep clause ignored", N);
1760          return;
1761
1762       elsif Rep_Item_Too_Late (Rectype, N) then
1763          return;
1764       end if;
1765
1766       if Present (Mod_Clause (N)) then
1767          declare
1768             Loc     : constant Source_Ptr := Sloc (N);
1769             M       : constant Node_Id := Mod_Clause (N);
1770             P       : constant List_Id := Pragmas_Before (M);
1771             AtM_Nod : Node_Id;
1772
1773             Mod_Val : Uint;
1774             pragma Warnings (Off, Mod_Val);
1775
1776          begin
1777             Check_Restriction (No_Obsolescent_Features, Mod_Clause (N));
1778
1779             if Warn_On_Obsolescent_Feature then
1780                Error_Msg_N
1781                  ("mod clause is an obsolescent feature ('R'M 'J.8)?", N);
1782                Error_Msg_N
1783                  ("\use alignment attribute definition clause instead?", N);
1784             end if;
1785
1786             if Present (P) then
1787                Analyze_List (P);
1788             end if;
1789
1790             --  In ASIS_Mode mode, expansion is disabled, but we must
1791             --  convert the Mod clause into an alignment clause anyway, so
1792             --  that the back-end can compute and back-annotate properly the
1793             --  size and alignment of types that may include this record.
1794
1795             if Operating_Mode = Check_Semantics
1796               and then ASIS_Mode
1797             then
1798                AtM_Nod :=
1799                  Make_Attribute_Definition_Clause (Loc,
1800                    Name       => New_Reference_To (Base_Type (Rectype), Loc),
1801                    Chars      => Name_Alignment,
1802                    Expression => Relocate_Node (Expression (M)));
1803
1804                Set_From_At_Mod (AtM_Nod);
1805                Insert_After (N, AtM_Nod);
1806                Mod_Val := Get_Alignment_Value (Expression (AtM_Nod));
1807                Set_Mod_Clause (N, Empty);
1808
1809             else
1810                --  Get the alignment value to perform error checking
1811
1812                Mod_Val := Get_Alignment_Value (Expression (M));
1813
1814             end if;
1815          end;
1816       end if;
1817
1818       --  Clear any existing component clauses for the type (this happens
1819       --  with derived types, where we are now overriding the original)
1820
1821       Fent := First_Entity (Rectype);
1822
1823       Comp := Fent;
1824       while Present (Comp) loop
1825          if Ekind (Comp) = E_Component
1826            or else Ekind (Comp) = E_Discriminant
1827          then
1828             Set_Component_Clause (Comp, Empty);
1829          end if;
1830
1831          Next_Entity (Comp);
1832       end loop;
1833
1834       --  All done if no component clauses
1835
1836       CC := First (Component_Clauses (N));
1837
1838       if No (CC) then
1839          return;
1840       end if;
1841
1842       --  If a tag is present, then create a component clause that places
1843       --  it at the start of the record (otherwise gigi may place it after
1844       --  other fields that have rep clauses).
1845
1846       if Nkind (Fent) = N_Defining_Identifier
1847         and then Chars (Fent) = Name_uTag
1848       then
1849          Set_Component_Bit_Offset    (Fent, Uint_0);
1850          Set_Normalized_Position     (Fent, Uint_0);
1851          Set_Normalized_First_Bit    (Fent, Uint_0);
1852          Set_Normalized_Position_Max (Fent, Uint_0);
1853          Init_Esize                  (Fent, System_Address_Size);
1854
1855          Set_Component_Clause    (Fent,
1856            Make_Component_Clause (Loc,
1857              Component_Name =>
1858                Make_Identifier (Loc,
1859                  Chars => Name_uTag),
1860
1861              Position  =>
1862                Make_Integer_Literal (Loc,
1863                  Intval => Uint_0),
1864
1865              First_Bit =>
1866                Make_Integer_Literal (Loc,
1867                  Intval => Uint_0),
1868
1869              Last_Bit  =>
1870                Make_Integer_Literal (Loc,
1871                  UI_From_Int (System_Address_Size))));
1872
1873          Ccount := Ccount + 1;
1874       end if;
1875
1876       --  A representation like this applies to the base type
1877
1878       Set_Has_Record_Rep_Clause (Base_Type (Rectype));
1879       Set_Has_Non_Standard_Rep  (Base_Type (Rectype));
1880       Set_Has_Specified_Layout  (Base_Type (Rectype));
1881
1882       Max_Bit_So_Far := Uint_Minus_1;
1883       Overlap_Check_Required := False;
1884
1885       --  Process the component clauses
1886
1887       while Present (CC) loop
1888
1889          --  If pragma, just analyze it
1890
1891          if Nkind (CC) = N_Pragma then
1892             Analyze (CC);
1893
1894          --  Processing for real component clause
1895
1896          else
1897             Ccount := Ccount + 1;
1898             Posit := Static_Integer (Position  (CC));
1899             Fbit  := Static_Integer (First_Bit (CC));
1900             Lbit  := Static_Integer (Last_Bit  (CC));
1901
1902             if Posit /= No_Uint
1903               and then Fbit /= No_Uint
1904               and then Lbit /= No_Uint
1905             then
1906                if Posit < 0 then
1907                   Error_Msg_N
1908                     ("position cannot be negative", Position (CC));
1909
1910                elsif Fbit < 0 then
1911                   Error_Msg_N
1912                     ("first bit cannot be negative", First_Bit (CC));
1913
1914                --  Values look OK, so find the corresponding record component
1915                --  Even though the syntax allows an attribute reference for
1916                --  implementation-defined components, GNAT does not allow the
1917                --  tag to get an explicit position.
1918
1919                elsif Nkind (Component_Name (CC)) = N_Attribute_Reference then
1920                   if Attribute_Name (Component_Name (CC)) = Name_Tag then
1921                      Error_Msg_N ("position of tag cannot be specified", CC);
1922                   else
1923                      Error_Msg_N ("illegal component name", CC);
1924                   end if;
1925
1926                else
1927                   Comp := First_Entity (Rectype);
1928                   while Present (Comp) loop
1929                      exit when Chars (Comp) = Chars (Component_Name (CC));
1930                      Next_Entity (Comp);
1931                   end loop;
1932
1933                   if No (Comp) then
1934
1935                      --  Maybe component of base type that is absent from
1936                      --  statically constrained first subtype.
1937
1938                      Comp := First_Entity (Base_Type (Rectype));
1939                      while Present (Comp) loop
1940                         exit when Chars (Comp) = Chars (Component_Name (CC));
1941                         Next_Entity (Comp);
1942                      end loop;
1943                   end if;
1944
1945                   if No (Comp) then
1946                      Error_Msg_N
1947                        ("component clause is for non-existent field", CC);
1948
1949                   elsif Present (Component_Clause (Comp)) then
1950                      Error_Msg_Sloc := Sloc (Component_Clause (Comp));
1951                      Error_Msg_N
1952                        ("component clause previously given#", CC);
1953
1954                   else
1955                      --  Update Fbit and Lbit to the actual bit number
1956
1957                      Fbit := Fbit + UI_From_Int (SSU) * Posit;
1958                      Lbit := Lbit + UI_From_Int (SSU) * Posit;
1959
1960                      if Fbit <= Max_Bit_So_Far then
1961                         Overlap_Check_Required := True;
1962                      else
1963                         Max_Bit_So_Far := Lbit;
1964                      end if;
1965
1966                      if Has_Size_Clause (Rectype)
1967                        and then Esize (Rectype) <= Lbit
1968                      then
1969                         Error_Msg_N
1970                           ("bit number out of range of specified size",
1971                            Last_Bit (CC));
1972                      else
1973                         Set_Component_Clause     (Comp, CC);
1974                         Set_Component_Bit_Offset (Comp, Fbit);
1975                         Set_Esize                (Comp, 1 + (Lbit - Fbit));
1976                         Set_Normalized_First_Bit (Comp, Fbit mod SSU);
1977                         Set_Normalized_Position  (Comp, Fbit / SSU);
1978
1979                         Set_Normalized_Position_Max
1980                           (Fent, Normalized_Position (Fent));
1981
1982                         if Is_Tagged_Type (Rectype)
1983                           and then Fbit < System_Address_Size
1984                         then
1985                            Error_Msg_NE
1986                              ("component overlaps tag field of&",
1987                               CC, Rectype);
1988                         end if;
1989
1990                         --  This information is also set in the corresponding
1991                         --  component of the base type, found by accessing the
1992                         --  Original_Record_Component link if it is present.
1993
1994                         Ocomp := Original_Record_Component (Comp);
1995
1996                         if Hbit < Lbit then
1997                            Hbit := Lbit;
1998                         end if;
1999
2000                         Check_Size
2001                           (Component_Name (CC),
2002                            Etype (Comp),
2003                            Esize (Comp),
2004                            Biased);
2005
2006                         Set_Has_Biased_Representation (Comp, Biased);
2007
2008                         if Present (Ocomp) then
2009                            Set_Component_Clause     (Ocomp, CC);
2010                            Set_Component_Bit_Offset (Ocomp, Fbit);
2011                            Set_Normalized_First_Bit (Ocomp, Fbit mod SSU);
2012                            Set_Normalized_Position  (Ocomp, Fbit / SSU);
2013                            Set_Esize                (Ocomp, 1 + (Lbit - Fbit));
2014
2015                            Set_Normalized_Position_Max
2016                              (Ocomp, Normalized_Position (Ocomp));
2017
2018                            Set_Has_Biased_Representation
2019                              (Ocomp, Has_Biased_Representation (Comp));
2020                         end if;
2021
2022                         if Esize (Comp) < 0 then
2023                            Error_Msg_N ("component size is negative", CC);
2024                         end if;
2025                      end if;
2026                   end if;
2027                end if;
2028             end if;
2029          end if;
2030
2031          Next (CC);
2032       end loop;
2033
2034       --  Now that we have processed all the component clauses, check for
2035       --  overlap. We have to leave this till last, since the components
2036       --  can appear in any arbitrary order in the representation clause.
2037
2038       --  We do not need this check if all specified ranges were monotonic,
2039       --  as recorded by Overlap_Check_Required being False at this stage.
2040
2041       --  This first section checks if there are any overlapping entries
2042       --  at all. It does this by sorting all entries and then seeing if
2043       --  there are any overlaps. If there are none, then that is decisive,
2044       --  but if there are overlaps, they may still be OK (they may result
2045       --  from fields in different variants).
2046
2047       if Overlap_Check_Required then
2048          Overlap_Check1 : declare
2049
2050             OC_Fbit : array (0 .. Ccount) of Uint;
2051             --  First-bit values for component clauses, the value is the
2052             --  offset of the first bit of the field from start of record.
2053             --  The zero entry is for use in sorting.
2054
2055             OC_Lbit : array (0 .. Ccount) of Uint;
2056             --  Last-bit values for component clauses, the value is the
2057             --  offset of the last bit of the field from start of record.
2058             --  The zero entry is for use in sorting.
2059
2060             OC_Count : Natural := 0;
2061             --  Count of entries in OC_Fbit and OC_Lbit
2062
2063             function OC_Lt (Op1, Op2 : Natural) return Boolean;
2064             --  Compare routine for Sort (See GNAT.Heap_Sort_A)
2065
2066             procedure OC_Move (From : Natural; To : Natural);
2067             --  Move routine for Sort (see GNAT.Heap_Sort_A)
2068
2069             function OC_Lt (Op1, Op2 : Natural) return Boolean is
2070             begin
2071                return OC_Fbit (Op1) < OC_Fbit (Op2);
2072             end OC_Lt;
2073
2074             procedure OC_Move (From : Natural; To : Natural) is
2075             begin
2076                OC_Fbit (To) := OC_Fbit (From);
2077                OC_Lbit (To) := OC_Lbit (From);
2078             end OC_Move;
2079
2080          begin
2081             CC := First (Component_Clauses (N));
2082             while Present (CC) loop
2083                if Nkind (CC) /= N_Pragma then
2084                   Posit := Static_Integer (Position  (CC));
2085                   Fbit  := Static_Integer (First_Bit (CC));
2086                   Lbit  := Static_Integer (Last_Bit  (CC));
2087
2088                   if Posit /= No_Uint
2089                     and then Fbit /= No_Uint
2090                     and then Lbit /= No_Uint
2091                   then
2092                      OC_Count := OC_Count + 1;
2093                      Posit := Posit * SSU;
2094                      OC_Fbit (OC_Count) := Fbit + Posit;
2095                      OC_Lbit (OC_Count) := Lbit + Posit;
2096                   end if;
2097                end if;
2098
2099                Next (CC);
2100             end loop;
2101
2102             Sort
2103               (OC_Count,
2104                OC_Move'Unrestricted_Access,
2105                OC_Lt'Unrestricted_Access);
2106
2107             Overlap_Check_Required := False;
2108             for J in 1 .. OC_Count - 1 loop
2109                if OC_Lbit (J) >= OC_Fbit (J + 1) then
2110                   Overlap_Check_Required := True;
2111                   exit;
2112                end if;
2113             end loop;
2114          end Overlap_Check1;
2115       end if;
2116
2117       --  If Overlap_Check_Required is still True, then we have to do
2118       --  the full scale overlap check, since we have at least two fields
2119       --  that do overlap, and we need to know if that is OK since they
2120       --  are in the same variant, or whether we have a definite problem
2121
2122       if Overlap_Check_Required then
2123          Overlap_Check2 : declare
2124             C1_Ent, C2_Ent : Entity_Id;
2125             --  Entities of components being checked for overlap
2126
2127             Clist : Node_Id;
2128             --  Component_List node whose Component_Items are being checked
2129
2130             Citem : Node_Id;
2131             --  Component declaration for component being checked
2132
2133          begin
2134             C1_Ent := First_Entity (Base_Type (Rectype));
2135
2136             --  Loop through all components in record. For each component check
2137             --  for overlap with any of the preceding elements on the component
2138             --  list containing the component, and also, if the component is in
2139             --  a variant, check against components outside the case structure.
2140             --  This latter test is repeated recursively up the variant tree.
2141
2142             Main_Component_Loop : while Present (C1_Ent) loop
2143                if Ekind (C1_Ent) /= E_Component
2144                  and then Ekind (C1_Ent) /= E_Discriminant
2145                then
2146                   goto Continue_Main_Component_Loop;
2147                end if;
2148
2149                --  Skip overlap check if entity has no declaration node. This
2150                --  happens with discriminants in constrained derived types.
2151                --  Probably we are missing some checks as a result, but that
2152                --  does not seem terribly serious ???
2153
2154                if No (Declaration_Node (C1_Ent)) then
2155                   goto Continue_Main_Component_Loop;
2156                end if;
2157
2158                Clist := Parent (List_Containing (Declaration_Node (C1_Ent)));
2159
2160                --  Loop through component lists that need checking. Check the
2161                --  current component list and all lists in variants above us.
2162
2163                Component_List_Loop : loop
2164
2165                   --  If derived type definition, go to full declaration
2166                   --  If at outer level, check discriminants if there are any
2167
2168                   if Nkind (Clist) = N_Derived_Type_Definition then
2169                      Clist := Parent (Clist);
2170                   end if;
2171
2172                   --  Outer level of record definition, check discriminants
2173
2174                   if Nkind (Clist) = N_Full_Type_Declaration
2175                     or else Nkind (Clist) = N_Private_Type_Declaration
2176                   then
2177                      if Has_Discriminants (Defining_Identifier (Clist)) then
2178                         C2_Ent :=
2179                           First_Discriminant (Defining_Identifier (Clist));
2180
2181                         while Present (C2_Ent) loop
2182                            exit when C1_Ent = C2_Ent;
2183                            Check_Component_Overlap (C1_Ent, C2_Ent);
2184                            Next_Discriminant (C2_Ent);
2185                         end loop;
2186                      end if;
2187
2188                   --  Record extension case
2189
2190                   elsif Nkind (Clist) = N_Derived_Type_Definition then
2191                      Clist := Empty;
2192
2193                   --  Otherwise check one component list
2194
2195                   else
2196                      Citem := First (Component_Items (Clist));
2197
2198                      while Present (Citem) loop
2199                         if Nkind (Citem) = N_Component_Declaration then
2200                            C2_Ent := Defining_Identifier (Citem);
2201                            exit when C1_Ent = C2_Ent;
2202                            Check_Component_Overlap (C1_Ent, C2_Ent);
2203                         end if;
2204
2205                         Next (Citem);
2206                      end loop;
2207                   end if;
2208
2209                   --  Check for variants above us (the parent of the Clist can
2210                   --  be a variant, in which case its parent is a variant part,
2211                   --  and the parent of the variant part is a component list
2212                   --  whose components must all be checked against the current
2213                   --  component for overlap.
2214
2215                   if Nkind (Parent (Clist)) = N_Variant then
2216                      Clist := Parent (Parent (Parent (Clist)));
2217
2218                   --  Check for possible discriminant part in record, this is
2219                   --  treated essentially as another level in the recursion.
2220                   --  For this case we have the parent of the component list
2221                   --  is the record definition, and its parent is the full
2222                   --  type declaration which contains the discriminant
2223                   --  specifications.
2224
2225                   elsif Nkind (Parent (Clist)) = N_Record_Definition then
2226                      Clist := Parent (Parent ((Clist)));
2227
2228                   --  If neither of these two cases, we are at the top of
2229                   --  the tree
2230
2231                   else
2232                      exit Component_List_Loop;
2233                   end if;
2234                end loop Component_List_Loop;
2235
2236                <<Continue_Main_Component_Loop>>
2237                   Next_Entity (C1_Ent);
2238
2239             end loop Main_Component_Loop;
2240          end Overlap_Check2;
2241       end if;
2242
2243       --  For records that have component clauses for all components, and
2244       --  whose size is less than or equal to 32, we need to know the size
2245       --  in the front end to activate possible packed array processing
2246       --  where the component type is a record.
2247
2248       --  At this stage Hbit + 1 represents the first unused bit from all
2249       --  the component clauses processed, so if the component clauses are
2250       --  complete, then this is the length of the record.
2251
2252       --  For records longer than System.Storage_Unit, and for those where
2253       --  not all components have component clauses, the back end determines
2254       --  the length (it may for example be appopriate to round up the size
2255       --  to some convenient boundary, based on alignment considerations etc).
2256
2257       if Unknown_RM_Size (Rectype)
2258         and then Hbit + 1 <= 32
2259       then
2260          --  Nothing to do if at least one component with no component clause
2261
2262          Comp := First_Entity (Rectype);
2263          while Present (Comp) loop
2264             if Ekind (Comp) = E_Component
2265               or else Ekind (Comp) = E_Discriminant
2266             then
2267                if No (Component_Clause (Comp)) then
2268                   return;
2269                end if;
2270             end if;
2271
2272             Next_Entity (Comp);
2273          end loop;
2274
2275          --  If we fall out of loop, all components have component clauses
2276          --  and so we can set the size to the maximum value.
2277
2278          Set_RM_Size (Rectype, Hbit + 1);
2279       end if;
2280    end Analyze_Record_Representation_Clause;
2281
2282    -----------------------------
2283    -- Check_Component_Overlap --
2284    -----------------------------
2285
2286    procedure Check_Component_Overlap (C1_Ent, C2_Ent : Entity_Id) is
2287    begin
2288       if Present (Component_Clause (C1_Ent))
2289         and then Present (Component_Clause (C2_Ent))
2290       then
2291          --  Exclude odd case where we have two tag fields in the same
2292          --  record, both at location zero. This seems a bit strange,
2293          --  but it seems to happen in some circumstances ???
2294
2295          if Chars (C1_Ent) = Name_uTag
2296            and then Chars (C2_Ent) = Name_uTag
2297          then
2298             return;
2299          end if;
2300
2301          --  Here we check if the two fields overlap
2302
2303          declare
2304             S1 : constant Uint := Component_Bit_Offset (C1_Ent);
2305             S2 : constant Uint := Component_Bit_Offset (C2_Ent);
2306             E1 : constant Uint := S1 + Esize (C1_Ent);
2307             E2 : constant Uint := S2 + Esize (C2_Ent);
2308
2309          begin
2310             if E2 <= S1 or else E1 <= S2 then
2311                null;
2312             else
2313                Error_Msg_Node_2 :=
2314                  Component_Name (Component_Clause (C2_Ent));
2315                Error_Msg_Sloc := Sloc (Error_Msg_Node_2);
2316                Error_Msg_Node_1 :=
2317                  Component_Name (Component_Clause (C1_Ent));
2318                Error_Msg_N
2319                  ("component& overlaps & #",
2320                   Component_Name (Component_Clause (C1_Ent)));
2321             end if;
2322          end;
2323       end if;
2324    end Check_Component_Overlap;
2325
2326    -----------------------------------
2327    -- Check_Constant_Address_Clause --
2328    -----------------------------------
2329
2330    procedure Check_Constant_Address_Clause
2331      (Expr  : Node_Id;
2332       U_Ent : Entity_Id)
2333    is
2334       procedure Check_At_Constant_Address (Nod : Node_Id);
2335       --  Checks that the given node N represents a name whose 'Address
2336       --  is constant (in the same sense as OK_Constant_Address_Clause,
2337       --  i.e. the address value is the same at the point of declaration
2338       --  of U_Ent and at the time of elaboration of the address clause.
2339
2340       procedure Check_Expr_Constants (Nod : Node_Id);
2341       --  Checks that Nod meets the requirements for a constant address
2342       --  clause in the sense of the enclosing procedure.
2343
2344       procedure Check_List_Constants (Lst : List_Id);
2345       --  Check that all elements of list Lst meet the requirements for a
2346       --  constant address clause in the sense of the enclosing procedure.
2347
2348       -------------------------------
2349       -- Check_At_Constant_Address --
2350       -------------------------------
2351
2352       procedure Check_At_Constant_Address (Nod : Node_Id) is
2353       begin
2354          if Is_Entity_Name (Nod) then
2355             if Present (Address_Clause (Entity ((Nod)))) then
2356                Error_Msg_NE
2357                  ("invalid address clause for initialized object &!",
2358                            Nod, U_Ent);
2359                Error_Msg_NE
2360                  ("address for& cannot" &
2361                     " depend on another address clause! ('R'M 13.1(22))!",
2362                   Nod, U_Ent);
2363
2364             elsif In_Same_Source_Unit (Entity (Nod), U_Ent)
2365               and then Sloc (U_Ent) < Sloc (Entity (Nod))
2366             then
2367                Error_Msg_NE
2368                  ("invalid address clause for initialized object &!",
2369                   Nod, U_Ent);
2370                Error_Msg_Name_1 := Chars (Entity (Nod));
2371                Error_Msg_Name_2 := Chars (U_Ent);
2372                Error_Msg_N
2373                  ("\% must be defined before % ('R'M 13.1(22))!",
2374                   Nod);
2375             end if;
2376
2377          elsif Nkind (Nod) = N_Selected_Component then
2378             declare
2379                T : constant Entity_Id := Etype (Prefix (Nod));
2380
2381             begin
2382                if (Is_Record_Type (T)
2383                     and then Has_Discriminants (T))
2384                  or else
2385                   (Is_Access_Type (T)
2386                      and then Is_Record_Type (Designated_Type (T))
2387                      and then Has_Discriminants (Designated_Type (T)))
2388                then
2389                   Error_Msg_NE
2390                     ("invalid address clause for initialized object &!",
2391                      Nod, U_Ent);
2392                   Error_Msg_N
2393                     ("\address cannot depend on component" &
2394                      " of discriminated record ('R'M 13.1(22))!",
2395                      Nod);
2396                else
2397                   Check_At_Constant_Address (Prefix (Nod));
2398                end if;
2399             end;
2400
2401          elsif Nkind (Nod) = N_Indexed_Component then
2402             Check_At_Constant_Address (Prefix (Nod));
2403             Check_List_Constants (Expressions (Nod));
2404
2405          else
2406             Check_Expr_Constants (Nod);
2407          end if;
2408       end Check_At_Constant_Address;
2409
2410       --------------------------
2411       -- Check_Expr_Constants --
2412       --------------------------
2413
2414       procedure Check_Expr_Constants (Nod : Node_Id) is
2415          Loc_U_Ent : constant Source_Ptr := Sloc (U_Ent);
2416          Ent       : Entity_Id           := Empty;
2417
2418       begin
2419          if Nkind (Nod) in N_Has_Etype
2420            and then Etype (Nod) = Any_Type
2421          then
2422             return;
2423          end if;
2424
2425          case Nkind (Nod) is
2426             when N_Empty | N_Error =>
2427                return;
2428
2429             when N_Identifier | N_Expanded_Name =>
2430                Ent := Entity (Nod);
2431
2432                --  We need to look at the original node if it is different
2433                --  from the node, since we may have rewritten things and
2434                --  substituted an identifier representing the rewrite.
2435
2436                if Original_Node (Nod) /= Nod then
2437                   Check_Expr_Constants (Original_Node (Nod));
2438
2439                   --  If the node is an object declaration without initial
2440                   --  value, some code has been expanded, and the expression
2441                   --  is not constant, even if the constituents might be
2442                   --  acceptable, as in  A'Address + offset.
2443
2444                   if Ekind (Ent) = E_Variable
2445                     and then Nkind (Declaration_Node (Ent))
2446                       = N_Object_Declaration
2447                     and then
2448                       No (Expression (Declaration_Node (Ent)))
2449                   then
2450                      Error_Msg_NE
2451                        ("invalid address clause for initialized object &!",
2452                         Nod, U_Ent);
2453
2454                   --  If entity is constant, it may be the result of expanding
2455                   --  a check. We must verify that its declaration appears
2456                   --  before the object in question, else we also reject the
2457                   --  address clause.
2458
2459                   elsif Ekind (Ent) = E_Constant
2460                     and then In_Same_Source_Unit (Ent, U_Ent)
2461                     and then Sloc (Ent) > Loc_U_Ent
2462                   then
2463                      Error_Msg_NE
2464                        ("invalid address clause for initialized object &!",
2465                         Nod, U_Ent);
2466                   end if;
2467
2468                   return;
2469                end if;
2470
2471                --  Otherwise look at the identifier and see if it is OK
2472
2473                if Ekind (Ent) = E_Named_Integer
2474                     or else
2475                   Ekind (Ent) = E_Named_Real
2476                     or else
2477                   Is_Type (Ent)
2478                then
2479                   return;
2480
2481                elsif
2482                   Ekind (Ent) = E_Constant
2483                     or else
2484                   Ekind (Ent) = E_In_Parameter
2485                then
2486                   --  This is the case where we must have Ent defined
2487                   --  before U_Ent. Clearly if they are in different
2488                   --  units this requirement is met since the unit
2489                   --  containing Ent is already processed.
2490
2491                   if not In_Same_Source_Unit (Ent, U_Ent) then
2492                      return;
2493
2494                   --  Otherwise location of Ent must be before the
2495                   --  location of U_Ent, that's what prior defined means.
2496
2497                   elsif Sloc (Ent) < Loc_U_Ent then
2498                      return;
2499
2500                   else
2501                      Error_Msg_NE
2502                        ("invalid address clause for initialized object &!",
2503                         Nod, U_Ent);
2504                      Error_Msg_Name_1 := Chars (Ent);
2505                      Error_Msg_Name_2 := Chars (U_Ent);
2506                      Error_Msg_N
2507                        ("\% must be defined before % ('R'M 13.1(22))!",
2508                         Nod);
2509                   end if;
2510
2511                elsif Nkind (Original_Node (Nod)) = N_Function_Call then
2512                   Check_Expr_Constants (Original_Node (Nod));
2513
2514                else
2515                   Error_Msg_NE
2516                     ("invalid address clause for initialized object &!",
2517                      Nod, U_Ent);
2518
2519                   if Comes_From_Source (Ent) then
2520                      Error_Msg_Name_1 := Chars (Ent);
2521                      Error_Msg_N
2522                        ("\reference to variable% not allowed"
2523                           & " ('R'M 13.1(22))!", Nod);
2524                   else
2525                      Error_Msg_N
2526                        ("non-static expression not allowed"
2527                           & " ('R'M 13.1(22))!", Nod);
2528                   end if;
2529                end if;
2530
2531             when N_Integer_Literal   =>
2532
2533                --  If this is a rewritten unchecked conversion, in a system
2534                --  where Address is an integer type, always use the base type
2535                --  for a literal value. This is user-friendly and prevents
2536                --  order-of-elaboration issues with instances of unchecked
2537                --  conversion.
2538
2539                if Nkind (Original_Node (Nod)) = N_Function_Call then
2540                   Set_Etype (Nod, Base_Type (Etype (Nod)));
2541                end if;
2542
2543             when N_Real_Literal      |
2544                  N_String_Literal    |
2545                  N_Character_Literal =>
2546                return;
2547
2548             when N_Range =>
2549                Check_Expr_Constants (Low_Bound (Nod));
2550                Check_Expr_Constants (High_Bound (Nod));
2551
2552             when N_Explicit_Dereference =>
2553                Check_Expr_Constants (Prefix (Nod));
2554
2555             when N_Indexed_Component =>
2556                Check_Expr_Constants (Prefix (Nod));
2557                Check_List_Constants (Expressions (Nod));
2558
2559             when N_Slice =>
2560                Check_Expr_Constants (Prefix (Nod));
2561                Check_Expr_Constants (Discrete_Range (Nod));
2562
2563             when N_Selected_Component =>
2564                Check_Expr_Constants (Prefix (Nod));
2565
2566             when N_Attribute_Reference =>
2567
2568                if Attribute_Name (Nod) = Name_Address
2569                    or else
2570                   Attribute_Name (Nod) = Name_Access
2571                     or else
2572                   Attribute_Name (Nod) = Name_Unchecked_Access
2573                     or else
2574                   Attribute_Name (Nod) = Name_Unrestricted_Access
2575                then
2576                   Check_At_Constant_Address (Prefix (Nod));
2577
2578                else
2579                   Check_Expr_Constants (Prefix (Nod));
2580                   Check_List_Constants (Expressions (Nod));
2581                end if;
2582
2583             when N_Aggregate =>
2584                Check_List_Constants (Component_Associations (Nod));
2585                Check_List_Constants (Expressions (Nod));
2586
2587             when N_Component_Association =>
2588                Check_Expr_Constants (Expression (Nod));
2589
2590             when N_Extension_Aggregate =>
2591                Check_Expr_Constants (Ancestor_Part (Nod));
2592                Check_List_Constants (Component_Associations (Nod));
2593                Check_List_Constants (Expressions (Nod));
2594
2595             when N_Null =>
2596                return;
2597
2598             when N_Binary_Op | N_And_Then | N_Or_Else | N_In | N_Not_In =>
2599                Check_Expr_Constants (Left_Opnd (Nod));
2600                Check_Expr_Constants (Right_Opnd (Nod));
2601
2602             when N_Unary_Op =>
2603                Check_Expr_Constants (Right_Opnd (Nod));
2604
2605             when N_Type_Conversion           |
2606                  N_Qualified_Expression      |
2607                  N_Allocator                 =>
2608                Check_Expr_Constants (Expression (Nod));
2609
2610             when N_Unchecked_Type_Conversion =>
2611                Check_Expr_Constants (Expression (Nod));
2612
2613                --  If this is a rewritten unchecked conversion, subtypes
2614                --  in this node are those created within the instance.
2615                --  To avoid order of elaboration issues, replace them
2616                --  with their base types. Note that address clauses can
2617                --  cause order of elaboration problems because they are
2618                --  elaborated by the back-end at the point of definition,
2619                --  and may mention entities declared in between (as long
2620                --  as everything is static). It is user-friendly to allow
2621                --  unchecked conversions in this context.
2622
2623                if Nkind (Original_Node (Nod)) = N_Function_Call then
2624                   Set_Etype (Expression (Nod),
2625                     Base_Type (Etype (Expression (Nod))));
2626                   Set_Etype (Nod, Base_Type (Etype (Nod)));
2627                end if;
2628
2629             when N_Function_Call =>
2630                if not Is_Pure (Entity (Name (Nod))) then
2631                   Error_Msg_NE
2632                     ("invalid address clause for initialized object &!",
2633                      Nod, U_Ent);
2634
2635                   Error_Msg_NE
2636                     ("\function & is not pure ('R'M 13.1(22))!",
2637                      Nod, Entity (Name (Nod)));
2638
2639                else
2640                   Check_List_Constants (Parameter_Associations (Nod));
2641                end if;
2642
2643             when N_Parameter_Association =>
2644                Check_Expr_Constants (Explicit_Actual_Parameter (Nod));
2645
2646             when others =>
2647                Error_Msg_NE
2648                  ("invalid address clause for initialized object &!",
2649                   Nod, U_Ent);
2650                Error_Msg_NE
2651                  ("\must be constant defined before& ('R'M 13.1(22))!",
2652                   Nod, U_Ent);
2653          end case;
2654       end Check_Expr_Constants;
2655
2656       --------------------------
2657       -- Check_List_Constants --
2658       --------------------------
2659
2660       procedure Check_List_Constants (Lst : List_Id) is
2661          Nod1 : Node_Id;
2662
2663       begin
2664          if Present (Lst) then
2665             Nod1 := First (Lst);
2666             while Present (Nod1) loop
2667                Check_Expr_Constants (Nod1);
2668                Next (Nod1);
2669             end loop;
2670          end if;
2671       end Check_List_Constants;
2672
2673    --  Start of processing for Check_Constant_Address_Clause
2674
2675    begin
2676       Check_Expr_Constants (Expr);
2677    end Check_Constant_Address_Clause;
2678
2679    ----------------
2680    -- Check_Size --
2681    ----------------
2682
2683    procedure Check_Size
2684      (N      : Node_Id;
2685       T      : Entity_Id;
2686       Siz    : Uint;
2687       Biased : out Boolean)
2688    is
2689       UT : constant Entity_Id := Underlying_Type (T);
2690       M  : Uint;
2691
2692    begin
2693       Biased := False;
2694
2695       --  Dismiss cases for generic types or types with previous errors
2696
2697       if No (UT)
2698         or else UT = Any_Type
2699         or else Is_Generic_Type (UT)
2700         or else Is_Generic_Type (Root_Type (UT))
2701       then
2702          return;
2703
2704       --  Check case of bit packed array
2705
2706       elsif Is_Array_Type (UT)
2707         and then Known_Static_Component_Size (UT)
2708         and then Is_Bit_Packed_Array (UT)
2709       then
2710          declare
2711             Asiz : Uint;
2712             Indx : Node_Id;
2713             Ityp : Entity_Id;
2714
2715          begin
2716             Asiz := Component_Size (UT);
2717             Indx := First_Index (UT);
2718             loop
2719                Ityp := Etype (Indx);
2720
2721                --  If non-static bound, then we are not in the business of
2722                --  trying to check the length, and indeed an error will be
2723                --  issued elsewhere, since sizes of non-static array types
2724                --  cannot be set implicitly or explicitly.
2725
2726                if not Is_Static_Subtype (Ityp) then
2727                   return;
2728                end if;
2729
2730                --  Otherwise accumulate next dimension
2731
2732                Asiz := Asiz * (Expr_Value (Type_High_Bound (Ityp)) -
2733                                Expr_Value (Type_Low_Bound  (Ityp)) +
2734                                Uint_1);
2735
2736                Next_Index (Indx);
2737                exit when No (Indx);
2738             end loop;
2739
2740             if Asiz <= Siz then
2741                return;
2742             else
2743                Error_Msg_Uint_1 := Asiz;
2744                Error_Msg_NE
2745                  ("size for& too small, minimum allowed is ^", N, T);
2746                Set_Esize   (T, Asiz);
2747                Set_RM_Size (T, Asiz);
2748             end if;
2749          end;
2750
2751       --  All other composite types are ignored
2752
2753       elsif Is_Composite_Type (UT) then
2754          return;
2755
2756       --  For fixed-point types, don't check minimum if type is not frozen,
2757       --  since we don't know all the characteristics of the type that can
2758       --  affect the size (e.g. a specified small) till freeze time.
2759
2760       elsif Is_Fixed_Point_Type (UT)
2761         and then not Is_Frozen (UT)
2762       then
2763          null;
2764
2765       --  Cases for which a minimum check is required
2766
2767       else
2768          --  Ignore if specified size is correct for the type
2769
2770          if Known_Esize (UT) and then Siz = Esize (UT) then
2771             return;
2772          end if;
2773
2774          --  Otherwise get minimum size
2775
2776          M := UI_From_Int (Minimum_Size (UT));
2777
2778          if Siz < M then
2779
2780             --  Size is less than minimum size, but one possibility remains
2781             --  that we can manage with the new size if we bias the type
2782
2783             M := UI_From_Int (Minimum_Size (UT, Biased => True));
2784
2785             if Siz < M then
2786                Error_Msg_Uint_1 := M;
2787                Error_Msg_NE
2788                  ("size for& too small, minimum allowed is ^", N, T);
2789                Set_Esize (T, M);
2790                Set_RM_Size (T, M);
2791             else
2792                Biased := True;
2793             end if;
2794          end if;
2795       end if;
2796    end Check_Size;
2797
2798    -------------------------
2799    -- Get_Alignment_Value --
2800    -------------------------
2801
2802    function Get_Alignment_Value (Expr : Node_Id) return Uint is
2803       Align : constant Uint := Static_Integer (Expr);
2804
2805    begin
2806       if Align = No_Uint then
2807          return No_Uint;
2808
2809       elsif Align <= 0 then
2810          Error_Msg_N ("alignment value must be positive", Expr);
2811          return No_Uint;
2812
2813       else
2814          for J in Int range 0 .. 64 loop
2815             declare
2816                M : constant Uint := Uint_2 ** J;
2817
2818             begin
2819                exit when M = Align;
2820
2821                if M > Align then
2822                   Error_Msg_N
2823                     ("alignment value must be power of 2", Expr);
2824                   return No_Uint;
2825                end if;
2826             end;
2827          end loop;
2828
2829          return Align;
2830       end if;
2831    end Get_Alignment_Value;
2832
2833    ----------------
2834    -- Initialize --
2835    ----------------
2836
2837    procedure Initialize is
2838    begin
2839       Unchecked_Conversions.Init;
2840    end Initialize;
2841
2842    -------------------------
2843    -- Is_Operational_Item --
2844    -------------------------
2845
2846    function Is_Operational_Item (N : Node_Id) return Boolean is
2847    begin
2848       if Nkind (N) /= N_Attribute_Definition_Clause then
2849          return False;
2850       else
2851          declare
2852             Id    : constant Attribute_Id := Get_Attribute_Id (Chars (N));
2853
2854          begin
2855             return Id = Attribute_Input
2856               or else Id = Attribute_Output
2857               or else Id = Attribute_Read
2858               or else Id = Attribute_Write
2859               or else Id = Attribute_External_Tag;
2860          end;
2861       end if;
2862    end Is_Operational_Item;
2863
2864    --------------------------------------
2865    -- Mark_Aliased_Address_As_Volatile --
2866    --------------------------------------
2867
2868    procedure Mark_Aliased_Address_As_Volatile (N : Node_Id) is
2869       Ent : constant Entity_Id := Address_Aliased_Entity (N);
2870
2871    begin
2872       if Present (Ent) then
2873          Set_Treat_As_Volatile (Ent);
2874       end if;
2875    end Mark_Aliased_Address_As_Volatile;
2876
2877    ------------------
2878    -- Minimum_Size --
2879    ------------------
2880
2881    function Minimum_Size
2882      (T      : Entity_Id;
2883       Biased : Boolean := False) return Nat
2884    is
2885       Lo     : Uint    := No_Uint;
2886       Hi     : Uint    := No_Uint;
2887       LoR    : Ureal   := No_Ureal;
2888       HiR    : Ureal   := No_Ureal;
2889       LoSet  : Boolean := False;
2890       HiSet  : Boolean := False;
2891       B      : Uint;
2892       S      : Nat;
2893       Ancest : Entity_Id;
2894       R_Typ  : constant Entity_Id := Root_Type (T);
2895
2896    begin
2897       --  If bad type, return 0
2898
2899       if T = Any_Type then
2900          return 0;
2901
2902       --  For generic types, just return zero. There cannot be any legitimate
2903       --  need to know such a size, but this routine may be called with a
2904       --  generic type as part of normal processing.
2905
2906       elsif Is_Generic_Type (R_Typ)
2907         or else R_Typ = Any_Type
2908       then
2909          return 0;
2910
2911          --  Access types. Normally an access type cannot have a size smaller
2912          --  than the size of System.Address. The exception is on VMS, where
2913          --  we have short and long addresses, and it is possible for an access
2914          --  type to have a short address size (and thus be less than the size
2915          --  of System.Address itself). We simply skip the check for VMS, and
2916          --  leave the back end to do the check.
2917
2918       elsif Is_Access_Type (T) then
2919          if OpenVMS_On_Target then
2920             return 0;
2921          else
2922             return System_Address_Size;
2923          end if;
2924
2925       --  Floating-point types
2926
2927       elsif Is_Floating_Point_Type (T) then
2928          return UI_To_Int (Esize (R_Typ));
2929
2930       --  Discrete types
2931
2932       elsif Is_Discrete_Type (T) then
2933
2934          --  The following loop is looking for the nearest compile time
2935          --  known bounds following the ancestor subtype chain. The idea
2936          --  is to find the most restrictive known bounds information.
2937
2938          Ancest := T;
2939          loop
2940             if Ancest = Any_Type or else Etype (Ancest) = Any_Type then
2941                return 0;
2942             end if;
2943
2944             if not LoSet then
2945                if Compile_Time_Known_Value (Type_Low_Bound (Ancest)) then
2946                   Lo := Expr_Rep_Value (Type_Low_Bound (Ancest));
2947                   LoSet := True;
2948                   exit when HiSet;
2949                end if;
2950             end if;
2951
2952             if not HiSet then
2953                if Compile_Time_Known_Value (Type_High_Bound (Ancest)) then
2954                   Hi := Expr_Rep_Value (Type_High_Bound (Ancest));
2955                   HiSet := True;
2956                   exit when LoSet;
2957                end if;
2958             end if;
2959
2960             Ancest := Ancestor_Subtype (Ancest);
2961
2962             if No (Ancest) then
2963                Ancest := Base_Type (T);
2964
2965                if Is_Generic_Type (Ancest) then
2966                   return 0;
2967                end if;
2968             end if;
2969          end loop;
2970
2971       --  Fixed-point types. We can't simply use Expr_Value to get the
2972       --  Corresponding_Integer_Value values of the bounds, since these
2973       --  do not get set till the type is frozen, and this routine can
2974       --  be called before the type is frozen. Similarly the test for
2975       --  bounds being static needs to include the case where we have
2976       --  unanalyzed real literals for the same reason.
2977
2978       elsif Is_Fixed_Point_Type (T) then
2979
2980          --  The following loop is looking for the nearest compile time
2981          --  known bounds following the ancestor subtype chain. The idea
2982          --  is to find the most restrictive known bounds information.
2983
2984          Ancest := T;
2985          loop
2986             if Ancest = Any_Type or else Etype (Ancest) = Any_Type then
2987                return 0;
2988             end if;
2989
2990             if not LoSet then
2991                if Nkind (Type_Low_Bound (Ancest)) = N_Real_Literal
2992                  or else Compile_Time_Known_Value (Type_Low_Bound (Ancest))
2993                then
2994                   LoR := Expr_Value_R (Type_Low_Bound (Ancest));
2995                   LoSet := True;
2996                   exit when HiSet;
2997                end if;
2998             end if;
2999
3000             if not HiSet then
3001                if Nkind (Type_High_Bound (Ancest)) = N_Real_Literal
3002                  or else Compile_Time_Known_Value (Type_High_Bound (Ancest))
3003                then
3004                   HiR := Expr_Value_R (Type_High_Bound (Ancest));
3005                   HiSet := True;
3006                   exit when LoSet;
3007                end if;
3008             end if;
3009
3010             Ancest := Ancestor_Subtype (Ancest);
3011
3012             if No (Ancest) then
3013                Ancest := Base_Type (T);
3014
3015                if Is_Generic_Type (Ancest) then
3016                   return 0;
3017                end if;
3018             end if;
3019          end loop;
3020
3021          Lo := UR_To_Uint (LoR / Small_Value (T));
3022          Hi := UR_To_Uint (HiR / Small_Value (T));
3023
3024       --  No other types allowed
3025
3026       else
3027          raise Program_Error;
3028       end if;
3029
3030       --  Fall through with Hi and Lo set. Deal with biased case
3031
3032       if (Biased and then not Is_Fixed_Point_Type (T))
3033         or else Has_Biased_Representation (T)
3034       then
3035          Hi := Hi - Lo;
3036          Lo := Uint_0;
3037       end if;
3038
3039       --  Signed case. Note that we consider types like range 1 .. -1 to be
3040       --  signed for the purpose of computing the size, since the bounds
3041       --  have to be accomodated in the base type.
3042
3043       if Lo < 0 or else Hi < 0 then
3044          S := 1;
3045          B := Uint_1;
3046
3047          --  S = size, B = 2 ** (size - 1) (can accommodate -B .. +(B - 1))
3048          --  Note that we accommodate the case where the bounds cross. This
3049          --  can happen either because of the way the bounds are declared
3050          --  or because of the algorithm in Freeze_Fixed_Point_Type.
3051
3052          while Lo < -B
3053            or else Hi < -B
3054            or else Lo >= B
3055            or else Hi >= B
3056          loop
3057             B := Uint_2 ** S;
3058             S := S + 1;
3059          end loop;
3060
3061       --  Unsigned case
3062
3063       else
3064          --  If both bounds are positive, make sure that both are represen-
3065          --  table in the case where the bounds are crossed. This can happen
3066          --  either because of the way the bounds are declared, or because of
3067          --  the algorithm in Freeze_Fixed_Point_Type.
3068
3069          if Lo > Hi then
3070             Hi := Lo;
3071          end if;
3072
3073          --  S = size, (can accommodate 0 .. (2**size - 1))
3074
3075          S := 0;
3076          while Hi >= Uint_2 ** S loop
3077             S := S + 1;
3078          end loop;
3079       end if;
3080
3081       return S;
3082    end Minimum_Size;
3083
3084    -------------------------
3085    -- New_Stream_Function --
3086    -------------------------
3087
3088    procedure New_Stream_Function
3089      (N    : Node_Id;
3090       Ent  : Entity_Id;
3091       Subp : Entity_Id;
3092       Nam  : TSS_Name_Type)
3093    is
3094       Loc       : constant Source_Ptr := Sloc (N);
3095       Sname     : constant Name_Id    := Make_TSS_Name (Base_Type (Ent), Nam);
3096       Subp_Id   : Entity_Id;
3097       Subp_Decl : Node_Id;
3098       F         : Entity_Id;
3099       Etyp      : Entity_Id;
3100
3101       function Build_Spec return Node_Id;
3102       --  Used for declaration and renaming declaration, so that this is
3103       --  treated as a renaming_as_body.
3104
3105       ----------------
3106       -- Build_Spec --
3107       ----------------
3108
3109       function Build_Spec return Node_Id is
3110       begin
3111          Subp_Id := Make_Defining_Identifier (Loc, Sname);
3112
3113          return
3114            Make_Function_Specification (Loc,
3115              Defining_Unit_Name => Subp_Id,
3116              Parameter_Specifications =>
3117                New_List (
3118                  Make_Parameter_Specification (Loc,
3119                    Defining_Identifier =>
3120                      Make_Defining_Identifier (Loc, Name_S),
3121                    Parameter_Type =>
3122                      Make_Access_Definition (Loc,
3123                        Subtype_Mark =>
3124                          New_Reference_To (
3125                            Designated_Type (Etype (F)), Loc)))),
3126
3127              Subtype_Mark =>
3128                New_Reference_To (Etyp, Loc));
3129       end Build_Spec;
3130
3131    --  Start of processing for New_Stream_Function
3132
3133    begin
3134       F    := First_Formal (Subp);
3135       Etyp := Etype (Subp);
3136
3137       if not Is_Tagged_Type (Ent) then
3138          Subp_Decl :=
3139            Make_Subprogram_Declaration (Loc,
3140              Specification => Build_Spec);
3141          Insert_Action (N, Subp_Decl);
3142       end if;
3143
3144       Subp_Decl :=
3145         Make_Subprogram_Renaming_Declaration (Loc,
3146           Specification => Build_Spec,
3147           Name => New_Reference_To (Subp, Loc));
3148
3149       if Is_Tagged_Type (Ent) then
3150          Set_TSS (Base_Type (Ent), Subp_Id);
3151       else
3152          Insert_Action (N, Subp_Decl);
3153          Copy_TSS (Subp_Id, Base_Type (Ent));
3154       end if;
3155    end New_Stream_Function;
3156
3157    --------------------------
3158    -- New_Stream_Procedure --
3159    --------------------------
3160
3161    procedure New_Stream_Procedure
3162      (N     : Node_Id;
3163       Ent   : Entity_Id;
3164       Subp  : Entity_Id;
3165       Nam   : TSS_Name_Type;
3166       Out_P : Boolean := False)
3167    is
3168       Loc       : constant Source_Ptr := Sloc (N);
3169       Sname     : constant Name_Id    := Make_TSS_Name (Base_Type (Ent), Nam);
3170       Subp_Id   : Entity_Id;
3171       Subp_Decl : Node_Id;
3172       F         : Entity_Id;
3173       Etyp      : Entity_Id;
3174
3175       function Build_Spec return Node_Id;
3176       --  Used for declaration and renaming declaration, so that this is
3177       --  treated as a renaming_as_body.
3178
3179       ----------------
3180       -- Build_Spec --
3181       ----------------
3182
3183       function Build_Spec return Node_Id is
3184       begin
3185          Subp_Id := Make_Defining_Identifier (Loc, Sname);
3186
3187          return
3188            Make_Procedure_Specification (Loc,
3189              Defining_Unit_Name => Subp_Id,
3190              Parameter_Specifications =>
3191                New_List (
3192                  Make_Parameter_Specification (Loc,
3193                    Defining_Identifier =>
3194                      Make_Defining_Identifier (Loc, Name_S),
3195                    Parameter_Type =>
3196                      Make_Access_Definition (Loc,
3197                        Subtype_Mark =>
3198                          New_Reference_To (
3199                            Designated_Type (Etype (F)), Loc))),
3200
3201                  Make_Parameter_Specification (Loc,
3202                    Defining_Identifier =>
3203                      Make_Defining_Identifier (Loc, Name_V),
3204                    Out_Present => Out_P,
3205                    Parameter_Type =>
3206                      New_Reference_To (Etyp, Loc))));
3207       end Build_Spec;
3208
3209       --  Start of processing for New_Stream_Procedure
3210
3211    begin
3212       F        := First_Formal (Subp);
3213       Etyp     := Etype (Next_Formal (F));
3214
3215       if not Is_Tagged_Type (Ent) then
3216          Subp_Decl :=
3217            Make_Subprogram_Declaration (Loc,
3218              Specification => Build_Spec);
3219          Insert_Action (N, Subp_Decl);
3220       end if;
3221
3222       Subp_Decl :=
3223         Make_Subprogram_Renaming_Declaration (Loc,
3224           Specification => Build_Spec,
3225           Name => New_Reference_To (Subp, Loc));
3226
3227       if Is_Tagged_Type (Ent) then
3228          Set_TSS (Base_Type (Ent), Subp_Id);
3229       else
3230          Insert_Action (N, Subp_Decl);
3231          Copy_TSS (Subp_Id, Base_Type (Ent));
3232       end if;
3233    end New_Stream_Procedure;
3234
3235    ------------------------
3236    -- Rep_Item_Too_Early --
3237    ------------------------
3238
3239    function Rep_Item_Too_Early (T : Entity_Id; N : Node_Id) return Boolean is
3240    begin
3241       --  Cannot apply rep items that are not operational items
3242       --  to generic types
3243
3244       if Is_Operational_Item (N) then
3245          return False;
3246
3247       elsif Is_Type (T)
3248         and then Is_Generic_Type (Root_Type (T))
3249       then
3250          Error_Msg_N
3251            ("representation item not allowed for generic type", N);
3252          return True;
3253       end if;
3254
3255       --  Otherwise check for incompleted type
3256
3257       if Is_Incomplete_Or_Private_Type (T)
3258         and then No (Underlying_Type (T))
3259       then
3260          Error_Msg_N
3261            ("representation item must be after full type declaration", N);
3262          return True;
3263
3264       --  If the type has incompleted components, a representation clause is
3265       --  illegal but stream attributes and Convention pragmas are correct.
3266
3267       elsif Has_Private_Component (T) then
3268          if Nkind (N) = N_Pragma then
3269             return False;
3270          else
3271             Error_Msg_N
3272               ("representation item must appear after type is fully defined",
3273                 N);
3274             return True;
3275          end if;
3276       else
3277          return False;
3278       end if;
3279    end Rep_Item_Too_Early;
3280
3281    -----------------------
3282    -- Rep_Item_Too_Late --
3283    -----------------------
3284
3285    function Rep_Item_Too_Late
3286      (T     : Entity_Id;
3287       N     : Node_Id;
3288       FOnly : Boolean := False) return Boolean
3289    is
3290       S           : Entity_Id;
3291       Parent_Type : Entity_Id;
3292
3293       procedure Too_Late;
3294       --  Output the too late message. Note that this is not considered a
3295       --  serious error, since the effect is simply that we ignore the
3296       --  representation clause in this case.
3297
3298       --------------
3299       -- Too_Late --
3300       --------------
3301
3302       procedure Too_Late is
3303       begin
3304          Error_Msg_N ("|representation item appears too late!", N);
3305       end Too_Late;
3306
3307    --  Start of processing for Rep_Item_Too_Late
3308
3309    begin
3310       --  First make sure entity is not frozen (RM 13.1(9)). Exclude imported
3311       --  types, which may be frozen if they appear in a representation clause
3312       --  for a local type.
3313
3314       if Is_Frozen (T)
3315         and then not From_With_Type (T)
3316       then
3317          Too_Late;
3318          S := First_Subtype (T);
3319
3320          if Present (Freeze_Node (S)) then
3321             Error_Msg_NE
3322               ("?no more representation items for }!", Freeze_Node (S), S);
3323          end if;
3324
3325          return True;
3326
3327       --  Check for case of non-tagged derived type whose parent either has
3328       --  primitive operations, or is a by reference type (RM 13.1(10)).
3329
3330       elsif Is_Type (T)
3331         and then not FOnly
3332         and then Is_Derived_Type (T)
3333         and then not Is_Tagged_Type (T)
3334       then
3335          Parent_Type := Etype (Base_Type (T));
3336
3337          if Has_Primitive_Operations (Parent_Type) then
3338             Too_Late;
3339             Error_Msg_NE
3340               ("primitive operations already defined for&!", N, Parent_Type);
3341             return True;
3342
3343          elsif Is_By_Reference_Type (Parent_Type) then
3344             Too_Late;
3345             Error_Msg_NE
3346               ("parent type & is a by reference type!", N, Parent_Type);
3347             return True;
3348          end if;
3349       end if;
3350
3351       --  No error, link item into head of chain of rep items for the entity
3352
3353       Record_Rep_Item (T, N);
3354       return False;
3355    end Rep_Item_Too_Late;
3356
3357    -------------------------
3358    -- Same_Representation --
3359    -------------------------
3360
3361    function Same_Representation (Typ1, Typ2 : Entity_Id) return Boolean is
3362       T1 : constant Entity_Id := Underlying_Type (Typ1);
3363       T2 : constant Entity_Id := Underlying_Type (Typ2);
3364
3365    begin
3366       --  A quick check, if base types are the same, then we definitely have
3367       --  the same representation, because the subtype specific representation
3368       --  attributes (Size and Alignment) do not affect representation from
3369       --  the point of view of this test.
3370
3371       if Base_Type (T1) = Base_Type (T2) then
3372          return True;
3373
3374       elsif Is_Private_Type (Base_Type (T2))
3375         and then Base_Type (T1) = Full_View (Base_Type (T2))
3376       then
3377          return True;
3378       end if;
3379
3380       --  Tagged types never have differing representations
3381
3382       if Is_Tagged_Type (T1) then
3383          return True;
3384       end if;
3385
3386       --  Representations are definitely different if conventions differ
3387
3388       if Convention (T1) /= Convention (T2) then
3389          return False;
3390       end if;
3391
3392       --  Representations are different if component alignments differ
3393
3394       if (Is_Record_Type (T1) or else Is_Array_Type (T1))
3395         and then
3396          (Is_Record_Type (T2) or else Is_Array_Type (T2))
3397         and then Component_Alignment (T1) /= Component_Alignment (T2)
3398       then
3399          return False;
3400       end if;
3401
3402       --  For arrays, the only real issue is component size. If we know the
3403       --  component size for both arrays, and it is the same, then that's
3404       --  good enough to know we don't have a change of representation.
3405
3406       if Is_Array_Type (T1) then
3407          if Known_Component_Size (T1)
3408            and then Known_Component_Size (T2)
3409            and then Component_Size (T1) = Component_Size (T2)
3410          then
3411             return True;
3412          end if;
3413       end if;
3414
3415       --  Types definitely have same representation if neither has non-standard
3416       --  representation since default representations are always consistent.
3417       --  If only one has non-standard representation, and the other does not,
3418       --  then we consider that they do not have the same representation. They
3419       --  might, but there is no way of telling early enough.
3420
3421       if Has_Non_Standard_Rep (T1) then
3422          if not Has_Non_Standard_Rep (T2) then
3423             return False;
3424          end if;
3425       else
3426          return not Has_Non_Standard_Rep (T2);
3427       end if;
3428
3429       --  Here the two types both have non-standard representation, and we
3430       --  need to determine if they have the same non-standard representation
3431
3432       --  For arrays, we simply need to test if the component sizes are the
3433       --  same. Pragma Pack is reflected in modified component sizes, so this
3434       --  check also deals with pragma Pack.
3435
3436       if Is_Array_Type (T1) then
3437          return Component_Size (T1) = Component_Size (T2);
3438
3439       --  Tagged types always have the same representation, because it is not
3440       --  possible to specify different representations for common fields.
3441
3442       elsif Is_Tagged_Type (T1) then
3443          return True;
3444
3445       --  Case of record types
3446
3447       elsif Is_Record_Type (T1) then
3448
3449          --  Packed status must conform
3450
3451          if Is_Packed (T1) /= Is_Packed (T2) then
3452             return False;
3453
3454          --  Otherwise we must check components. Typ2 maybe a constrained
3455          --  subtype with fewer components, so we compare the components
3456          --  of the base types.
3457
3458          else
3459             Record_Case : declare
3460                CD1, CD2 : Entity_Id;
3461
3462                function Same_Rep return Boolean;
3463                --  CD1 and CD2 are either components or discriminants. This
3464                --  function tests whether the two have the same representation
3465
3466                --------------
3467                -- Same_Rep --
3468                --------------
3469
3470                function Same_Rep return Boolean is
3471                begin
3472                   if No (Component_Clause (CD1)) then
3473                      return No (Component_Clause (CD2));
3474
3475                   else
3476                      return
3477                         Present (Component_Clause (CD2))
3478                           and then
3479                         Component_Bit_Offset (CD1) = Component_Bit_Offset (CD2)
3480                           and then
3481                         Esize (CD1) = Esize (CD2);
3482                   end if;
3483                end Same_Rep;
3484
3485             --  Start processing for Record_Case
3486
3487             begin
3488                if Has_Discriminants (T1) then
3489                   CD1 := First_Discriminant (T1);
3490                   CD2 := First_Discriminant (T2);
3491
3492                   --  The number of discriminants may be different if the
3493                   --  derived type has fewer (constrained by values). The
3494                   --  invisible discriminants retain the representation of
3495                   --  the original, so the discrepancy does not per se
3496                   --  indicate a different representation.
3497
3498                   while Present (CD1)
3499                     and then Present (CD2)
3500                   loop
3501                      if not Same_Rep then
3502                         return False;
3503                      else
3504                         Next_Discriminant (CD1);
3505                         Next_Discriminant (CD2);
3506                      end if;
3507                   end loop;
3508                end if;
3509
3510                CD1 := First_Component (Underlying_Type (Base_Type (T1)));
3511                CD2 := First_Component (Underlying_Type (Base_Type (T2)));
3512
3513                while Present (CD1) loop
3514                   if not Same_Rep then
3515                      return False;
3516                   else
3517                      Next_Component (CD1);
3518                      Next_Component (CD2);
3519                   end if;
3520                end loop;
3521
3522                return True;
3523             end Record_Case;
3524          end if;
3525
3526       --  For enumeration types, we must check each literal to see if the
3527       --  representation is the same. Note that we do not permit enumeration
3528       --  reprsentation clauses for Character and Wide_Character, so these
3529       --  cases were already dealt with.
3530
3531       elsif Is_Enumeration_Type (T1) then
3532
3533          Enumeration_Case : declare
3534             L1, L2 : Entity_Id;
3535
3536          begin
3537             L1 := First_Literal (T1);
3538             L2 := First_Literal (T2);
3539
3540             while Present (L1) loop
3541                if Enumeration_Rep (L1) /= Enumeration_Rep (L2) then
3542                   return False;
3543                else
3544                   Next_Literal (L1);
3545                   Next_Literal (L2);
3546                end if;
3547             end loop;
3548
3549             return True;
3550
3551          end Enumeration_Case;
3552
3553       --  Any other types have the same representation for these purposes
3554
3555       else
3556          return True;
3557       end if;
3558    end Same_Representation;
3559
3560    --------------------
3561    -- Set_Enum_Esize --
3562    --------------------
3563
3564    procedure Set_Enum_Esize (T : Entity_Id) is
3565       Lo : Uint;
3566       Hi : Uint;
3567       Sz : Nat;
3568
3569    begin
3570       Init_Alignment (T);
3571
3572       --  Find the minimum standard size (8,16,32,64) that fits
3573
3574       Lo := Enumeration_Rep (Entity (Type_Low_Bound (T)));
3575       Hi := Enumeration_Rep (Entity (Type_High_Bound (T)));
3576
3577       if Lo < 0 then
3578          if Lo >= -Uint_2**07 and then Hi < Uint_2**07 then
3579             Sz := Standard_Character_Size;  -- May be > 8 on some targets
3580
3581          elsif Lo >= -Uint_2**15 and then Hi < Uint_2**15 then
3582             Sz := 16;
3583
3584          elsif Lo >= -Uint_2**31 and then Hi < Uint_2**31 then
3585             Sz := 32;
3586
3587          else pragma Assert (Lo >= -Uint_2**63 and then Hi < Uint_2**63);
3588             Sz := 64;
3589          end if;
3590
3591       else
3592          if Hi < Uint_2**08 then
3593             Sz := Standard_Character_Size;  -- May be > 8 on some targets
3594
3595          elsif Hi < Uint_2**16 then
3596             Sz := 16;
3597
3598          elsif Hi < Uint_2**32 then
3599             Sz := 32;
3600
3601          else pragma Assert (Hi < Uint_2**63);
3602             Sz := 64;
3603          end if;
3604       end if;
3605
3606       --  That minimum is the proper size unless we have a foreign convention
3607       --  and the size required is 32 or less, in which case we bump the size
3608       --  up to 32. This is required for C and C++ and seems reasonable for
3609       --  all other foreign conventions.
3610
3611       if Has_Foreign_Convention (T)
3612         and then Esize (T) < Standard_Integer_Size
3613       then
3614          Init_Esize (T, Standard_Integer_Size);
3615
3616       else
3617          Init_Esize (T, Sz);
3618       end if;
3619    end Set_Enum_Esize;
3620
3621    -----------------------------------
3622    -- Validate_Unchecked_Conversion --
3623    -----------------------------------
3624
3625    procedure Validate_Unchecked_Conversion
3626      (N        : Node_Id;
3627       Act_Unit : Entity_Id)
3628    is
3629       Source : Entity_Id;
3630       Target : Entity_Id;
3631       Vnode  : Node_Id;
3632
3633    begin
3634       --  Obtain source and target types. Note that we call Ancestor_Subtype
3635       --  here because the processing for generic instantiation always makes
3636       --  subtypes, and we want the original frozen actual types.
3637
3638       --  If we are dealing with private types, then do the check on their
3639       --  fully declared counterparts if the full declarations have been
3640       --  encountered (they don't have to be visible, but they must exist!)
3641
3642       Source := Ancestor_Subtype (Etype (First_Formal (Act_Unit)));
3643
3644       if Is_Private_Type (Source)
3645         and then Present (Underlying_Type (Source))
3646       then
3647          Source := Underlying_Type (Source);
3648       end if;
3649
3650       Target := Ancestor_Subtype (Etype (Act_Unit));
3651
3652       --  If either type is generic, the instantiation happens within a
3653       --  generic unit, and there is nothing to check. The proper check
3654       --  will happen when the enclosing generic is instantiated.
3655
3656       if Is_Generic_Type (Source) or else Is_Generic_Type (Target) then
3657          return;
3658       end if;
3659
3660       if Is_Private_Type (Target)
3661         and then Present (Underlying_Type (Target))
3662       then
3663          Target := Underlying_Type (Target);
3664       end if;
3665
3666       --  Source may be unconstrained array, but not target
3667
3668       if Is_Array_Type (Target)
3669         and then not Is_Constrained (Target)
3670       then
3671          Error_Msg_N
3672            ("unchecked conversion to unconstrained array not allowed", N);
3673          return;
3674       end if;
3675
3676       --  Make entry in unchecked conversion table for later processing
3677       --  by Validate_Unchecked_Conversions, which will check sizes and
3678       --  alignments (using values set by the back-end where possible).
3679       --  This is only done if the appropriate warning is active
3680
3681       if Warn_On_Unchecked_Conversion then
3682          Unchecked_Conversions.Append
3683            (New_Val => UC_Entry'
3684               (Enode  => N,
3685                Source => Source,
3686                Target => Target));
3687
3688          --  If both sizes are known statically now, then back end annotation
3689          --  is not required to do a proper check but if either size is not
3690          --  known statically, then we need the annotation.
3691
3692          if Known_Static_RM_Size (Source)
3693            and then Known_Static_RM_Size (Target)
3694          then
3695             null;
3696          else
3697             Back_Annotate_Rep_Info := True;
3698          end if;
3699       end if;
3700
3701       --  If unchecked conversion to access type, and access type is
3702       --  declared in the same unit as the unchecked conversion, then
3703       --  set the No_Strict_Aliasing flag (no strict aliasing is
3704       --  implicit in this situation).
3705
3706       if Is_Access_Type (Target) and then
3707         In_Same_Source_Unit (Target, N)
3708       then
3709          Set_No_Strict_Aliasing (Implementation_Base_Type (Target));
3710       end if;
3711
3712       --  Generate N_Validate_Unchecked_Conversion node for back end in
3713       --  case the back end needs to perform special validation checks.
3714
3715       --  Shouldn't this be in exp_ch13, since the check only gets done
3716       --  if we have full expansion and the back end is called ???
3717
3718       Vnode :=
3719         Make_Validate_Unchecked_Conversion (Sloc (N));
3720       Set_Source_Type (Vnode, Source);
3721       Set_Target_Type (Vnode, Target);
3722
3723       --  If the unchecked conversion node is in a list, just insert before
3724       --  it. If not we have some strange case, not worth bothering about.
3725
3726       if Is_List_Member (N) then
3727          Insert_After (N, Vnode);
3728       end if;
3729    end Validate_Unchecked_Conversion;
3730
3731    ------------------------------------
3732    -- Validate_Unchecked_Conversions --
3733    ------------------------------------
3734
3735    procedure Validate_Unchecked_Conversions is
3736    begin
3737       for N in Unchecked_Conversions.First .. Unchecked_Conversions.Last loop
3738          declare
3739             T : UC_Entry renames Unchecked_Conversions.Table (N);
3740
3741             Enode  : constant Node_Id   := T.Enode;
3742             Source : constant Entity_Id := T.Source;
3743             Target : constant Entity_Id := T.Target;
3744
3745             Source_Siz    : Uint;
3746             Target_Siz    : Uint;
3747
3748          begin
3749             --  This validation check, which warns if we have unequal sizes
3750             --  for unchecked conversion, and thus potentially implementation
3751             --  dependent semantics, is one of the few occasions on which we
3752             --  use the official RM size instead of Esize. See description
3753             --  in Einfo "Handling of Type'Size Values" for details.
3754
3755             if Serious_Errors_Detected = 0
3756               and then Known_Static_RM_Size (Source)
3757               and then Known_Static_RM_Size (Target)
3758             then
3759                Source_Siz := RM_Size (Source);
3760                Target_Siz := RM_Size (Target);
3761
3762                if Source_Siz /= Target_Siz then
3763                   Error_Msg_N
3764                     ("types for unchecked conversion have different sizes?",
3765                      Enode);
3766
3767                   if All_Errors_Mode then
3768                      Error_Msg_Name_1 := Chars (Source);
3769                      Error_Msg_Uint_1 := Source_Siz;
3770                      Error_Msg_Name_2 := Chars (Target);
3771                      Error_Msg_Uint_2 := Target_Siz;
3772                      Error_Msg_N
3773                        ("\size of % is ^, size of % is ^?", Enode);
3774
3775                      Error_Msg_Uint_1 := UI_Abs (Source_Siz - Target_Siz);
3776
3777                      if Is_Discrete_Type (Source)
3778                        and then Is_Discrete_Type (Target)
3779                      then
3780                         if Source_Siz > Target_Siz then
3781                            Error_Msg_N
3782                              ("\^ high order bits of source will be ignored?",
3783                               Enode);
3784
3785                         elsif Is_Unsigned_Type (Source) then
3786                            Error_Msg_N
3787                              ("\source will be extended with ^ high order " &
3788                               "zero bits?", Enode);
3789
3790                         else
3791                            Error_Msg_N
3792                              ("\source will be extended with ^ high order " &
3793                               "sign bits?",
3794                               Enode);
3795                         end if;
3796
3797                      elsif Source_Siz < Target_Siz then
3798                         if Is_Discrete_Type (Target) then
3799                            if Bytes_Big_Endian then
3800                               Error_Msg_N
3801                                 ("\target value will include ^ undefined " &
3802                                  "low order bits?",
3803                                  Enode);
3804                            else
3805                               Error_Msg_N
3806                                 ("\target value will include ^ undefined " &
3807                                  "high order bits?",
3808                                  Enode);
3809                            end if;
3810
3811                         else
3812                            Error_Msg_N
3813                              ("\^ trailing bits of target value will be " &
3814                               "undefined?", Enode);
3815                         end if;
3816
3817                      else pragma Assert (Source_Siz > Target_Siz);
3818                         Error_Msg_N
3819                           ("\^ trailing bits of source will be ignored?",
3820                            Enode);
3821                      end if;
3822                   end if;
3823                end if;
3824             end if;
3825
3826             --  If both types are access types, we need to check the alignment.
3827             --  If the alignment of both is specified, we can do it here.
3828
3829             if Serious_Errors_Detected = 0
3830               and then Ekind (Source) in Access_Kind
3831               and then Ekind (Target) in Access_Kind
3832               and then Target_Strict_Alignment
3833               and then Present (Designated_Type (Source))
3834               and then Present (Designated_Type (Target))
3835             then
3836                declare
3837                   D_Source : constant Entity_Id := Designated_Type (Source);
3838                   D_Target : constant Entity_Id := Designated_Type (Target);
3839
3840                begin
3841                   if Known_Alignment (D_Source)
3842                     and then Known_Alignment (D_Target)
3843                   then
3844                      declare
3845                         Source_Align : constant Uint := Alignment (D_Source);
3846                         Target_Align : constant Uint := Alignment (D_Target);
3847
3848                      begin
3849                         if Source_Align < Target_Align
3850                           and then not Is_Tagged_Type (D_Source)
3851                         then
3852                            Error_Msg_Uint_1 := Target_Align;
3853                            Error_Msg_Uint_2 := Source_Align;
3854                            Error_Msg_Node_2 := D_Source;
3855                            Error_Msg_NE
3856                              ("alignment of & (^) is stricter than " &
3857                               "alignment of & (^)?", Enode, D_Target);
3858
3859                            if All_Errors_Mode then
3860                               Error_Msg_N
3861                                 ("\resulting access value may have invalid " &
3862                                  "alignment?", Enode);
3863                            end if;
3864                         end if;
3865                      end;
3866                   end if;
3867                end;
3868             end if;
3869          end;
3870       end loop;
3871    end Validate_Unchecked_Conversions;
3872
3873 end Sem_Ch13;