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