OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [ada/] [sem_ch13.adb] - Blame information for rev 749

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 706 jeremybenn
------------------------------------------------------------------------------
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-2012, 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 3,  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 COPYING3.  If not, go to --
19
-- http://www.gnu.org/licenses for a complete copy of the license.          --
20
--                                                                          --
21
-- GNAT was originally developed  by the GNAT team at  New York University. --
22
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
23
--                                                                          --
24
------------------------------------------------------------------------------
25
 
26
with Aspects;  use Aspects;
27
with Atree;    use Atree;
28
with Checks;   use Checks;
29
with Einfo;    use Einfo;
30
with Elists;   use Elists;
31
with Errout;   use Errout;
32
with Exp_Disp; use Exp_Disp;
33
with Exp_Tss;  use Exp_Tss;
34
with Exp_Util; use Exp_Util;
35
with Lib;      use Lib;
36
with Lib.Xref; use Lib.Xref;
37
with Namet;    use Namet;
38
with Nlists;   use Nlists;
39
with Nmake;    use Nmake;
40
with Opt;      use Opt;
41
with Restrict; use Restrict;
42
with Rident;   use Rident;
43
with Rtsfind;  use Rtsfind;
44
with Sem;      use Sem;
45
with Sem_Aux;  use Sem_Aux;
46
with Sem_Ch3;  use Sem_Ch3;
47
with Sem_Ch6;  use Sem_Ch6;
48
with Sem_Ch8;  use Sem_Ch8;
49
with Sem_Dim;  use Sem_Dim;
50
with Sem_Eval; use Sem_Eval;
51
with Sem_Res;  use Sem_Res;
52
with Sem_Type; use Sem_Type;
53
with Sem_Util; use Sem_Util;
54
with Sem_Warn; use Sem_Warn;
55
with Sinput;   use Sinput;
56
with Snames;   use Snames;
57
with Stand;    use Stand;
58
with Sinfo;    use Sinfo;
59
with Stringt;  use Stringt;
60
with Targparm; use Targparm;
61
with Ttypes;   use Ttypes;
62
with Tbuild;   use Tbuild;
63
with Urealp;   use Urealp;
64
with Warnsw;   use Warnsw;
65
 
66
with GNAT.Heap_Sort_G;
67
 
68
package body Sem_Ch13 is
69
 
70
   SSU : constant Pos := System_Storage_Unit;
71
   --  Convenient short hand for commonly used constant
72
 
73
   -----------------------
74
   -- Local Subprograms --
75
   -----------------------
76
 
77
   procedure Alignment_Check_For_Size_Change (Typ : Entity_Id; Size : Uint);
78
   --  This routine is called after setting one of the sizes of type entity
79
   --  Typ to Size. The purpose is to deal with the situation of a derived
80
   --  type whose inherited alignment is no longer appropriate for the new
81
   --  size value. In this case, we reset the Alignment to unknown.
82
 
83
   procedure Build_Predicate_Function (Typ : Entity_Id; N : Node_Id);
84
   --  If Typ has predicates (indicated by Has_Predicates being set for Typ,
85
   --  then either there are pragma Invariant entries on the rep chain for the
86
   --  type (note that Predicate aspects are converted to pragma Predicate), or
87
   --  there are inherited aspects from a parent type, or ancestor subtypes.
88
   --  This procedure builds the spec and body for the Predicate function that
89
   --  tests these predicates. N is the freeze node for the type. The spec of
90
   --  the function is inserted before the freeze node, and the body of the
91
   --  function is inserted after the freeze node.
92
 
93
   procedure Build_Static_Predicate
94
     (Typ  : Entity_Id;
95
      Expr : Node_Id;
96
      Nam  : Name_Id);
97
   --  Given a predicated type Typ, where Typ is a discrete static subtype,
98
   --  whose predicate expression is Expr, tests if Expr is a static predicate,
99
   --  and if so, builds the predicate range list. Nam is the name of the one
100
   --  argument to the predicate function. Occurrences of the type name in the
101
   --  predicate expression have been replaced by identifier references to this
102
   --  name, which is unique, so any identifier with Chars matching Nam must be
103
   --  a reference to the type. If the predicate is non-static, this procedure
104
   --  returns doing nothing. If the predicate is static, then the predicate
105
   --  list is stored in Static_Predicate (Typ), and the Expr is rewritten as
106
   --  a canonicalized membership operation.
107
 
108
   function Get_Alignment_Value (Expr : Node_Id) return Uint;
109
   --  Given the expression for an alignment value, returns the corresponding
110
   --  Uint value. If the value is inappropriate, then error messages are
111
   --  posted as required, and a value of No_Uint is returned.
112
 
113
   function Is_Operational_Item (N : Node_Id) return Boolean;
114
   --  A specification for a stream attribute is allowed before the full type
115
   --  is declared, as explained in AI-00137 and the corrigendum. Attributes
116
   --  that do not specify a representation characteristic are operational
117
   --  attributes.
118
 
119
   procedure New_Stream_Subprogram
120
     (N    : Node_Id;
121
      Ent  : Entity_Id;
122
      Subp : Entity_Id;
123
      Nam  : TSS_Name_Type);
124
   --  Create a subprogram renaming of a given stream attribute to the
125
   --  designated subprogram and then in the tagged case, provide this as a
126
   --  primitive operation, or in the non-tagged case make an appropriate TSS
127
   --  entry. This is more properly an expansion activity than just semantics,
128
   --  but the presence of user-defined stream functions for limited types is a
129
   --  legality check, which is why this takes place here rather than in
130
   --  exp_ch13, where it was previously. Nam indicates the name of the TSS
131
   --  function to be generated.
132
   --
133
   --  To avoid elaboration anomalies with freeze nodes, for untagged types
134
   --  we generate both a subprogram declaration and a subprogram renaming
135
   --  declaration, so that the attribute specification is handled as a
136
   --  renaming_as_body. For tagged types, the specification is one of the
137
   --  primitive specs.
138
 
139
   generic
140
      with procedure Replace_Type_Reference (N : Node_Id);
141
   procedure Replace_Type_References_Generic (N : Node_Id; TName : Name_Id);
142
   --  This is used to scan an expression for a predicate or invariant aspect
143
   --  replacing occurrences of the name TName (the name of the subtype to
144
   --  which the aspect applies) with appropriate references to the parameter
145
   --  of the predicate function or invariant procedure. The procedure passed
146
   --  as a generic parameter does the actual replacement of node N, which is
147
   --  either a simple direct reference to TName, or a selected component that
148
   --  represents an appropriately qualified occurrence of TName.
149
 
150
   procedure Set_Biased
151
     (E      : Entity_Id;
152
      N      : Node_Id;
153
      Msg    : String;
154
      Biased : Boolean := True);
155
   --  If Biased is True, sets Has_Biased_Representation flag for E, and
156
   --  outputs a warning message at node N if Warn_On_Biased_Representation is
157
   --  is True. This warning inserts the string Msg to describe the construct
158
   --  causing biasing.
159
 
160
   ----------------------------------------------
161
   -- Table for Validate_Unchecked_Conversions --
162
   ----------------------------------------------
163
 
164
   --  The following table collects unchecked conversions for validation.
165
   --  Entries are made by Validate_Unchecked_Conversion and then the call
166
   --  to Validate_Unchecked_Conversions does the actual error checking and
167
   --  posting of warnings. The reason for this delayed processing is to take
168
   --  advantage of back-annotations of size and alignment values performed by
169
   --  the back end.
170
 
171
   --  Note: the reason we store a Source_Ptr value instead of a Node_Id is
172
   --  that by the time Validate_Unchecked_Conversions is called, Sprint will
173
   --  already have modified all Sloc values if the -gnatD option is set.
174
 
175
   type UC_Entry is record
176
      Eloc   : Source_Ptr; -- node used for posting warnings
177
      Source : Entity_Id;  -- source type for unchecked conversion
178
      Target : Entity_Id;  -- target type for unchecked conversion
179
   end record;
180
 
181
   package Unchecked_Conversions is new Table.Table (
182
     Table_Component_Type => UC_Entry,
183
     Table_Index_Type     => Int,
184
     Table_Low_Bound      => 1,
185
     Table_Initial        => 50,
186
     Table_Increment      => 200,
187
     Table_Name           => "Unchecked_Conversions");
188
 
189
   ----------------------------------------
190
   -- Table for Validate_Address_Clauses --
191
   ----------------------------------------
192
 
193
   --  If an address clause has the form
194
 
195
   --    for X'Address use Expr
196
 
197
   --  where Expr is of the form Y'Address or recursively is a reference to a
198
   --  constant of either of these forms, and X and Y are entities of objects,
199
   --  then if Y has a smaller alignment than X, that merits a warning about
200
   --  possible bad alignment. The following table collects address clauses of
201
   --  this kind. We put these in a table so that they can be checked after the
202
   --  back end has completed annotation of the alignments of objects, since we
203
   --  can catch more cases that way.
204
 
205
   type Address_Clause_Check_Record is record
206
      N : Node_Id;
207
      --  The address clause
208
 
209
      X : Entity_Id;
210
      --  The entity of the object overlaying Y
211
 
212
      Y : Entity_Id;
213
      --  The entity of the object being overlaid
214
 
215
      Off : Boolean;
216
      --  Whether the address is offset within Y
217
   end record;
218
 
219
   package Address_Clause_Checks is new Table.Table (
220
     Table_Component_Type => Address_Clause_Check_Record,
221
     Table_Index_Type     => Int,
222
     Table_Low_Bound      => 1,
223
     Table_Initial        => 20,
224
     Table_Increment      => 200,
225
     Table_Name           => "Address_Clause_Checks");
226
 
227
   -----------------------------------------
228
   -- Adjust_Record_For_Reverse_Bit_Order --
229
   -----------------------------------------
230
 
231
   procedure Adjust_Record_For_Reverse_Bit_Order (R : Entity_Id) is
232
      Comp : Node_Id;
233
      CC   : Node_Id;
234
 
235
   begin
236
      --  Processing depends on version of Ada
237
 
238
      --  For Ada 95, we just renumber bits within a storage unit. We do the
239
      --  same for Ada 83 mode, since we recognize the Bit_Order attribute in
240
      --  Ada 83, and are free to add this extension.
241
 
242
      if Ada_Version < Ada_2005 then
243
         Comp := First_Component_Or_Discriminant (R);
244
         while Present (Comp) loop
245
            CC := Component_Clause (Comp);
246
 
247
            --  If component clause is present, then deal with the non-default
248
            --  bit order case for Ada 95 mode.
249
 
250
            --  We only do this processing for the base type, and in fact that
251
            --  is important, since otherwise if there are record subtypes, we
252
            --  could reverse the bits once for each subtype, which is wrong.
253
 
254
            if Present (CC)
255
              and then Ekind (R) = E_Record_Type
256
            then
257
               declare
258
                  CFB : constant Uint    := Component_Bit_Offset (Comp);
259
                  CSZ : constant Uint    := Esize (Comp);
260
                  CLC : constant Node_Id := Component_Clause (Comp);
261
                  Pos : constant Node_Id := Position (CLC);
262
                  FB  : constant Node_Id := First_Bit (CLC);
263
 
264
                  Storage_Unit_Offset : constant Uint :=
265
                                          CFB / System_Storage_Unit;
266
 
267
                  Start_Bit : constant Uint :=
268
                                CFB mod System_Storage_Unit;
269
 
270
               begin
271
                  --  Cases where field goes over storage unit boundary
272
 
273
                  if Start_Bit + CSZ > System_Storage_Unit then
274
 
275
                     --  Allow multi-byte field but generate warning
276
 
277
                     if Start_Bit mod System_Storage_Unit = 0
278
                       and then CSZ mod System_Storage_Unit = 0
279
                     then
280
                        Error_Msg_N
281
                          ("multi-byte field specified with non-standard"
282
                           & " Bit_Order?", CLC);
283
 
284
                        if Bytes_Big_Endian then
285
                           Error_Msg_N
286
                             ("bytes are not reversed "
287
                              & "(component is big-endian)?", CLC);
288
                        else
289
                           Error_Msg_N
290
                             ("bytes are not reversed "
291
                              & "(component is little-endian)?", CLC);
292
                        end if;
293
 
294
                        --  Do not allow non-contiguous field
295
 
296
                     else
297
                        Error_Msg_N
298
                          ("attempt to specify non-contiguous field "
299
                           & "not permitted", CLC);
300
                        Error_Msg_N
301
                          ("\caused by non-standard Bit_Order "
302
                           & "specified", CLC);
303
                        Error_Msg_N
304
                          ("\consider possibility of using "
305
                           & "Ada 2005 mode here", CLC);
306
                     end if;
307
 
308
                  --  Case where field fits in one storage unit
309
 
310
                  else
311
                     --  Give warning if suspicious component clause
312
 
313
                     if Intval (FB) >= System_Storage_Unit
314
                       and then Warn_On_Reverse_Bit_Order
315
                     then
316
                        Error_Msg_N
317
                          ("?Bit_Order clause does not affect " &
318
                           "byte ordering", Pos);
319
                        Error_Msg_Uint_1 :=
320
                          Intval (Pos) + Intval (FB) /
321
                          System_Storage_Unit;
322
                        Error_Msg_N
323
                          ("?position normalized to ^ before bit " &
324
                           "order interpreted", Pos);
325
                     end if;
326
 
327
                     --  Here is where we fix up the Component_Bit_Offset value
328
                     --  to account for the reverse bit order. Some examples of
329
                     --  what needs to be done are:
330
 
331
                     --    First_Bit .. Last_Bit     Component_Bit_Offset
332
                     --      old          new          old       new
333
 
334
                     --     0 .. 0       7 .. 7         0         7
335
                     --     0 .. 1       6 .. 7         0         6
336
                     --     0 .. 2       5 .. 7         0         5
337
                     --     0 .. 7       0 .. 7         0         4
338
 
339
                     --     1 .. 1       6 .. 6         1         6
340
                     --     1 .. 4       3 .. 6         1         3
341
                     --     4 .. 7       0 .. 3         4         0
342
 
343
                     --  The rule is that the first bit is is obtained by
344
                     --  subtracting the old ending bit from storage_unit - 1.
345
 
346
                     Set_Component_Bit_Offset
347
                       (Comp,
348
                        (Storage_Unit_Offset * System_Storage_Unit) +
349
                          (System_Storage_Unit - 1) -
350
                          (Start_Bit + CSZ - 1));
351
 
352
                     Set_Normalized_First_Bit
353
                       (Comp,
354
                        Component_Bit_Offset (Comp) mod
355
                          System_Storage_Unit);
356
                  end if;
357
               end;
358
            end if;
359
 
360
            Next_Component_Or_Discriminant (Comp);
361
         end loop;
362
 
363
      --  For Ada 2005, we do machine scalar processing, as fully described In
364
      --  AI-133. This involves gathering all components which start at the
365
      --  same byte offset and processing them together. Same approach is still
366
      --  valid in later versions including Ada 2012.
367
 
368
      else
369
         declare
370
            Max_Machine_Scalar_Size : constant Uint :=
371
                                        UI_From_Int
372
                                          (Standard_Long_Long_Integer_Size);
373
            --  We use this as the maximum machine scalar size
374
 
375
            Num_CC : Natural;
376
            SSU    : constant Uint := UI_From_Int (System_Storage_Unit);
377
 
378
         begin
379
            --  This first loop through components does two things. First it
380
            --  deals with the case of components with component clauses whose
381
            --  length is greater than the maximum machine scalar size (either
382
            --  accepting them or rejecting as needed). Second, it counts the
383
            --  number of components with component clauses whose length does
384
            --  not exceed this maximum for later processing.
385
 
386
            Num_CC := 0;
387
            Comp   := First_Component_Or_Discriminant (R);
388
            while Present (Comp) loop
389
               CC := Component_Clause (Comp);
390
 
391
               if Present (CC) then
392
                  declare
393
                     Fbit : constant Uint :=
394
                              Static_Integer (First_Bit (CC));
395
                     Lbit : constant Uint :=
396
                              Static_Integer (Last_Bit (CC));
397
 
398
                  begin
399
                     --  Case of component with last bit >= max machine scalar
400
 
401
                     if Lbit >= Max_Machine_Scalar_Size then
402
 
403
                        --  This is allowed only if first bit is zero, and
404
                        --  last bit + 1 is a multiple of storage unit size.
405
 
406
                        if Fbit = 0 and then (Lbit + 1) mod SSU = 0 then
407
 
408
                           --  This is the case to give a warning if enabled
409
 
410
                           if Warn_On_Reverse_Bit_Order then
411
                              Error_Msg_N
412
                                ("multi-byte field specified with "
413
                                 & "  non-standard Bit_Order?", CC);
414
 
415
                              if Bytes_Big_Endian then
416
                                 Error_Msg_N
417
                                   ("\bytes are not reversed "
418
                                    & "(component is big-endian)?", CC);
419
                              else
420
                                 Error_Msg_N
421
                                   ("\bytes are not reversed "
422
                                    & "(component is little-endian)?", CC);
423
                              end if;
424
                           end if;
425
 
426
                        --  Give error message for RM 13.4.1(10) violation
427
 
428
                        else
429
                           Error_Msg_FE
430
                             ("machine scalar rules not followed for&",
431
                              First_Bit (CC), Comp);
432
 
433
                           Error_Msg_Uint_1 := Lbit;
434
                           Error_Msg_Uint_2 := Max_Machine_Scalar_Size;
435
                           Error_Msg_F
436
                             ("\last bit (^) exceeds maximum machine "
437
                              & "scalar size (^)",
438
                              First_Bit (CC));
439
 
440
                           if (Lbit + 1) mod SSU /= 0 then
441
                              Error_Msg_Uint_1 := SSU;
442
                              Error_Msg_F
443
                                ("\and is not a multiple of Storage_Unit (^) "
444
                                 & "(RM 13.4.1(10))",
445
                                 First_Bit (CC));
446
 
447
                           else
448
                              Error_Msg_Uint_1 := Fbit;
449
                              Error_Msg_F
450
                                ("\and first bit (^) is non-zero "
451
                                 & "(RM 13.4.1(10))",
452
                                 First_Bit (CC));
453
                           end if;
454
                        end if;
455
 
456
                     --  OK case of machine scalar related component clause,
457
                     --  For now, just count them.
458
 
459
                     else
460
                        Num_CC := Num_CC + 1;
461
                     end if;
462
                  end;
463
               end if;
464
 
465
               Next_Component_Or_Discriminant (Comp);
466
            end loop;
467
 
468
            --  We need to sort the component clauses on the basis of the
469
            --  Position values in the clause, so we can group clauses with
470
            --  the same Position. together to determine the relevant machine
471
            --  scalar size.
472
 
473
            Sort_CC : declare
474
               Comps : array (0 .. Num_CC) of Entity_Id;
475
               --  Array to collect component and discriminant entities. The
476
               --  data starts at index 1, the 0'th entry is for the sort
477
               --  routine.
478
 
479
               function CP_Lt (Op1, Op2 : Natural) return Boolean;
480
               --  Compare routine for Sort
481
 
482
               procedure CP_Move (From : Natural; To : Natural);
483
               --  Move routine for Sort
484
 
485
               package Sorting is new GNAT.Heap_Sort_G (CP_Move, CP_Lt);
486
 
487
               Start : Natural;
488
               Stop  : Natural;
489
               --  Start and stop positions in the component list of the set of
490
               --  components with the same starting position (that constitute
491
               --  components in a single machine scalar).
492
 
493
               MaxL  : Uint;
494
               --  Maximum last bit value of any component in this set
495
 
496
               MSS   : Uint;
497
               --  Corresponding machine scalar size
498
 
499
               -----------
500
               -- CP_Lt --
501
               -----------
502
 
503
               function CP_Lt (Op1, Op2 : Natural) return Boolean is
504
               begin
505
                  return Position (Component_Clause (Comps (Op1))) <
506
                    Position (Component_Clause (Comps (Op2)));
507
               end CP_Lt;
508
 
509
               -------------
510
               -- CP_Move --
511
               -------------
512
 
513
               procedure CP_Move (From : Natural; To : Natural) is
514
               begin
515
                  Comps (To) := Comps (From);
516
               end CP_Move;
517
 
518
               --  Start of processing for Sort_CC
519
 
520
            begin
521
               --  Collect the machine scalar relevant component clauses
522
 
523
               Num_CC := 0;
524
               Comp   := First_Component_Or_Discriminant (R);
525
               while Present (Comp) loop
526
                  declare
527
                     CC   : constant Node_Id := Component_Clause (Comp);
528
 
529
                  begin
530
                     --  Collect only component clauses whose last bit is less
531
                     --  than machine scalar size. Any component clause whose
532
                     --  last bit exceeds this value does not take part in
533
                     --  machine scalar layout considerations. The test for
534
                     --  Error_Posted makes sure we exclude component clauses
535
                     --  for which we already posted an error.
536
 
537
                     if Present (CC)
538
                       and then not Error_Posted (Last_Bit (CC))
539
                       and then Static_Integer (Last_Bit (CC)) <
540
                                                    Max_Machine_Scalar_Size
541
                     then
542
                        Num_CC := Num_CC + 1;
543
                        Comps (Num_CC) := Comp;
544
                     end if;
545
                  end;
546
 
547
                  Next_Component_Or_Discriminant (Comp);
548
               end loop;
549
 
550
               --  Sort by ascending position number
551
 
552
               Sorting.Sort (Num_CC);
553
 
554
               --  We now have all the components whose size does not exceed
555
               --  the max machine scalar value, sorted by starting position.
556
               --  In this loop we gather groups of clauses starting at the
557
               --  same position, to process them in accordance with AI-133.
558
 
559
               Stop := 0;
560
               while Stop < Num_CC loop
561
                  Start := Stop + 1;
562
                  Stop  := Start;
563
                  MaxL  :=
564
                    Static_Integer
565
                      (Last_Bit (Component_Clause (Comps (Start))));
566
                  while Stop < Num_CC loop
567
                     if Static_Integer
568
                          (Position (Component_Clause (Comps (Stop + 1)))) =
569
                        Static_Integer
570
                          (Position (Component_Clause (Comps (Stop))))
571
                     then
572
                        Stop := Stop + 1;
573
                        MaxL :=
574
                          UI_Max
575
                            (MaxL,
576
                             Static_Integer
577
                               (Last_Bit
578
                                  (Component_Clause (Comps (Stop)))));
579
                     else
580
                        exit;
581
                     end if;
582
                  end loop;
583
 
584
                  --  Now we have a group of component clauses from Start to
585
                  --  Stop whose positions are identical, and MaxL is the
586
                  --  maximum last bit value of any of these components.
587
 
588
                  --  We need to determine the corresponding machine scalar
589
                  --  size. This loop assumes that machine scalar sizes are
590
                  --  even, and that each possible machine scalar has twice
591
                  --  as many bits as the next smaller one.
592
 
593
                  MSS := Max_Machine_Scalar_Size;
594
                  while MSS mod 2 = 0
595
                    and then (MSS / 2) >= SSU
596
                    and then (MSS / 2) > MaxL
597
                  loop
598
                     MSS := MSS / 2;
599
                  end loop;
600
 
601
                  --  Here is where we fix up the Component_Bit_Offset value
602
                  --  to account for the reverse bit order. Some examples of
603
                  --  what needs to be done for the case of a machine scalar
604
                  --  size of 8 are:
605
 
606
                  --    First_Bit .. Last_Bit     Component_Bit_Offset
607
                  --      old          new          old       new
608
 
609
                  --     0 .. 0       7 .. 7         0         7
610
                  --     0 .. 1       6 .. 7         0         6
611
                  --     0 .. 2       5 .. 7         0         5
612
                  --     0 .. 7       0 .. 7         0         4
613
 
614
                  --     1 .. 1       6 .. 6         1         6
615
                  --     1 .. 4       3 .. 6         1         3
616
                  --     4 .. 7       0 .. 3         4         0
617
 
618
                  --  The rule is that the first bit is obtained by subtracting
619
                  --  the old ending bit from machine scalar size - 1.
620
 
621
                  for C in Start .. Stop loop
622
                     declare
623
                        Comp : constant Entity_Id := Comps (C);
624
                        CC   : constant Node_Id   :=
625
                                 Component_Clause (Comp);
626
                        LB   : constant Uint :=
627
                                 Static_Integer (Last_Bit (CC));
628
                        NFB  : constant Uint := MSS - Uint_1 - LB;
629
                        NLB  : constant Uint := NFB + Esize (Comp) - 1;
630
                        Pos  : constant Uint :=
631
                                 Static_Integer (Position (CC));
632
 
633
                     begin
634
                        if Warn_On_Reverse_Bit_Order then
635
                           Error_Msg_Uint_1 := MSS;
636
                           Error_Msg_N
637
                             ("info: reverse bit order in machine " &
638
                              "scalar of length^?", First_Bit (CC));
639
                           Error_Msg_Uint_1 := NFB;
640
                           Error_Msg_Uint_2 := NLB;
641
 
642
                           if Bytes_Big_Endian then
643
                              Error_Msg_NE
644
                                ("?\info: big-endian range for "
645
                                 & "component & is ^ .. ^",
646
                                 First_Bit (CC), Comp);
647
                           else
648
                              Error_Msg_NE
649
                                ("?\info: little-endian range "
650
                                 & "for component & is ^ .. ^",
651
                                 First_Bit (CC), Comp);
652
                           end if;
653
                        end if;
654
 
655
                        Set_Component_Bit_Offset (Comp, Pos * SSU + NFB);
656
                        Set_Normalized_First_Bit (Comp, NFB mod SSU);
657
                     end;
658
                  end loop;
659
               end loop;
660
            end Sort_CC;
661
         end;
662
      end if;
663
   end Adjust_Record_For_Reverse_Bit_Order;
664
 
665
   -------------------------------------
666
   -- Alignment_Check_For_Size_Change --
667
   -------------------------------------
668
 
669
   procedure Alignment_Check_For_Size_Change (Typ : Entity_Id; Size : Uint) is
670
   begin
671
      --  If the alignment is known, and not set by a rep clause, and is
672
      --  inconsistent with the size being set, then reset it to unknown,
673
      --  we assume in this case that the size overrides the inherited
674
      --  alignment, and that the alignment must be recomputed.
675
 
676
      if Known_Alignment (Typ)
677
        and then not Has_Alignment_Clause (Typ)
678
        and then Size mod (Alignment (Typ) * SSU) /= 0
679
      then
680
         Init_Alignment (Typ);
681
      end if;
682
   end Alignment_Check_For_Size_Change;
683
 
684
   -----------------------------------
685
   -- Analyze_Aspect_Specifications --
686
   -----------------------------------
687
 
688
   procedure Analyze_Aspect_Specifications (N : Node_Id; E : Entity_Id) is
689
      Aspect : Node_Id;
690
      Aitem  : Node_Id;
691
      Ent    : Node_Id;
692
 
693
      L : constant List_Id := Aspect_Specifications (N);
694
 
695
      Ins_Node : Node_Id := N;
696
      --  Insert pragmas (except Pre/Post/Invariant/Predicate) after this node
697
 
698
      --  The general processing involves building an attribute definition
699
      --  clause or a pragma node that corresponds to the aspect. Then one
700
      --  of two things happens:
701
 
702
      --  If we are required to delay the evaluation of this aspect to the
703
      --  freeze point, we attach the corresponding pragma/attribute definition
704
      --  clause to the aspect specification node, which is then placed in the
705
      --  Rep Item chain. In this case we mark the entity by setting the flag
706
      --  Has_Delayed_Aspects and we evaluate the rep item at the freeze point.
707
 
708
      --  If no delay is required, we just insert the pragma or attribute
709
      --  after the declaration, and it will get processed by the normal
710
      --  circuit. The From_Aspect_Specification flag is set on the pragma
711
      --  or attribute definition node in either case to activate special
712
      --  processing (e.g. not traversing the list of homonyms for inline).
713
 
714
      Delay_Required : Boolean := False;
715
      --  Set True if delay is required
716
 
717
   begin
718
      pragma Assert (Present (L));
719
 
720
      --  Loop through aspects
721
 
722
      Aspect := First (L);
723
      Aspect_Loop : while Present (Aspect) loop
724
         declare
725
            Loc  : constant Source_Ptr := Sloc (Aspect);
726
            Id   : constant Node_Id    := Identifier (Aspect);
727
            Expr : constant Node_Id    := Expression (Aspect);
728
            Nam  : constant Name_Id    := Chars (Id);
729
            A_Id : constant Aspect_Id  := Get_Aspect_Id (Nam);
730
            Anod : Node_Id;
731
 
732
            Eloc : Source_Ptr := No_Location;
733
            --  Source location of expression, modified when we split PPC's. It
734
            --  is set below when Expr is present.
735
 
736
            procedure Check_False_Aspect_For_Derived_Type;
737
            --  This procedure checks for the case of a false aspect for a
738
            --  derived type, which improperly tries to cancel an aspect
739
            --  inherited from the parent;
740
 
741
            -----------------------------------------
742
            -- Check_False_Aspect_For_Derived_Type --
743
            -----------------------------------------
744
 
745
            procedure Check_False_Aspect_For_Derived_Type is
746
            begin
747
               --  We are only checking derived types
748
 
749
               if not Is_Derived_Type (E) then
750
                  return;
751
               end if;
752
 
753
               case A_Id is
754
                  when Aspect_Atomic | Aspect_Shared =>
755
                     if not Is_Atomic (E) then
756
                        return;
757
                     end if;
758
 
759
                  when Aspect_Atomic_Components =>
760
                     if not Has_Atomic_Components (E) then
761
                        return;
762
                     end if;
763
 
764
                  when Aspect_Discard_Names =>
765
                     if not Discard_Names (E) then
766
                        return;
767
                     end if;
768
 
769
                  when Aspect_Pack =>
770
                     if not Is_Packed (E) then
771
                        return;
772
                     end if;
773
 
774
                  when Aspect_Unchecked_Union =>
775
                     if not Is_Unchecked_Union (E) then
776
                        return;
777
                     end if;
778
 
779
                  when Aspect_Volatile =>
780
                     if not Is_Volatile (E) then
781
                        return;
782
                     end if;
783
 
784
                  when Aspect_Volatile_Components =>
785
                     if not Has_Volatile_Components (E) then
786
                        return;
787
                     end if;
788
 
789
                  when others =>
790
                     return;
791
               end case;
792
 
793
               --  Fall through means we are canceling an inherited aspect
794
 
795
               Error_Msg_Name_1 := Nam;
796
               Error_Msg_NE
797
                 ("derived type& inherits aspect%, cannot cancel", Expr, E);
798
            end Check_False_Aspect_For_Derived_Type;
799
 
800
         --  Start of processing for Aspect_Loop
801
 
802
         begin
803
            --  Skip aspect if already analyzed (not clear if this is needed)
804
 
805
            if Analyzed (Aspect) then
806
               goto Continue;
807
            end if;
808
 
809
            --  Set the source location of expression, used in the case of
810
            --  a failed precondition/postcondition or invariant. Note that
811
            --  the source location of the expression is not usually the best
812
            --  choice here. For example, it gets located on the last AND
813
            --  keyword in a chain of boolean expressiond AND'ed together.
814
            --  It is best to put the message on the first character of the
815
            --  assertion, which is the effect of the First_Node call here.
816
 
817
            if Present (Expr) then
818
               Eloc := Sloc (First_Node (Expr));
819
            end if;
820
 
821
            --  Check restriction No_Implementation_Aspect_Specifications
822
 
823
            if Impl_Defined_Aspects (A_Id) then
824
               Check_Restriction
825
                 (No_Implementation_Aspect_Specifications, Aspect);
826
            end if;
827
 
828
            --  Check restriction No_Specification_Of_Aspect
829
 
830
            Check_Restriction_No_Specification_Of_Aspect (Aspect);
831
 
832
            --  Analyze this aspect
833
 
834
            Set_Analyzed (Aspect);
835
            Set_Entity (Aspect, E);
836
            Ent := New_Occurrence_Of (E, Sloc (Id));
837
 
838
            --  Check for duplicate aspect. Note that the Comes_From_Source
839
            --  test allows duplicate Pre/Post's that we generate internally
840
            --  to escape being flagged here.
841
 
842
            if No_Duplicates_Allowed (A_Id) then
843
               Anod := First (L);
844
               while Anod /= Aspect loop
845
                  if Same_Aspect
846
                      (A_Id, Get_Aspect_Id (Chars (Identifier (Anod))))
847
                    and then Comes_From_Source (Aspect)
848
                  then
849
                     Error_Msg_Name_1 := Nam;
850
                     Error_Msg_Sloc := Sloc (Anod);
851
 
852
                     --  Case of same aspect specified twice
853
 
854
                     if Class_Present (Anod) = Class_Present (Aspect) then
855
                        if not Class_Present (Anod) then
856
                           Error_Msg_NE
857
                             ("aspect% for & previously given#",
858
                              Id, E);
859
                        else
860
                           Error_Msg_NE
861
                             ("aspect `%''Class` for & previously given#",
862
                              Id, E);
863
                        end if;
864
 
865
                        --  Case of Pre and Pre'Class both specified
866
 
867
                     elsif Nam = Name_Pre then
868
                        if Class_Present (Aspect) then
869
                           Error_Msg_NE
870
                             ("aspect `Pre''Class` for & is not allowed here",
871
                              Id, E);
872
                           Error_Msg_NE
873
                             ("\since aspect `Pre` previously given#",
874
                              Id, E);
875
 
876
                        else
877
                           Error_Msg_NE
878
                             ("aspect `Pre` for & is not allowed here",
879
                              Id, E);
880
                           Error_Msg_NE
881
                             ("\since aspect `Pre''Class` previously given#",
882
                              Id, E);
883
                        end if;
884
                     end if;
885
 
886
                     --  Allowed case of X and X'Class both specified
887
                  end if;
888
 
889
                  Next (Anod);
890
               end loop;
891
            end if;
892
 
893
            --  Check some general restrictions on language defined aspects
894
 
895
            if not Impl_Defined_Aspects (A_Id) then
896
               Error_Msg_Name_1 := Nam;
897
 
898
               --  Not allowed for renaming declarations
899
 
900
               if Nkind (N) in N_Renaming_Declaration then
901
                  Error_Msg_N
902
                    ("aspect % not allowed for renaming declaration",
903
                     Aspect);
904
               end if;
905
 
906
               --  Not allowed for formal type declarations
907
 
908
               if Nkind (N) = N_Formal_Type_Declaration then
909
                  Error_Msg_N
910
                    ("aspect % not allowed for formal type declaration",
911
                     Aspect);
912
               end if;
913
            end if;
914
 
915
            --  Copy expression for later processing by the procedures
916
            --  Check_Aspect_At_[Freeze_Point | End_Of_Declarations]
917
 
918
            Set_Entity (Id, New_Copy_Tree (Expr));
919
 
920
            --  Processing based on specific aspect
921
 
922
            case A_Id is
923
 
924
               --  No_Aspect should be impossible
925
 
926
               when No_Aspect =>
927
                  raise Program_Error;
928
 
929
               --  Aspects taking an optional boolean argument. For all of
930
               --  these we just create a matching pragma and insert it, if
931
               --  the expression is missing or set to True. If the expression
932
               --  is False, we can ignore the aspect with the exception that
933
               --  in the case of a derived type, we must check for an illegal
934
               --  attempt to cancel an inherited aspect.
935
 
936
               when Boolean_Aspects =>
937
                  Set_Is_Boolean_Aspect (Aspect);
938
 
939
                  if Present (Expr)
940
                    and then Is_False (Static_Boolean (Expr))
941
                  then
942
                     Check_False_Aspect_For_Derived_Type;
943
                     goto Continue;
944
                  end if;
945
 
946
                  --  If True, build corresponding pragma node
947
 
948
                  Aitem :=
949
                    Make_Pragma (Loc,
950
                      Pragma_Argument_Associations => New_List (Ent),
951
                      Pragma_Identifier            =>
952
                        Make_Identifier (Sloc (Id), Chars (Id)));
953
 
954
                  --  Never need to delay for boolean aspects
955
 
956
                  pragma Assert (not Delay_Required);
957
 
958
               --  Library unit aspects. These are boolean aspects, but we
959
               --  have to do special things with the insertion, since the
960
               --  pragma belongs inside the declarations of a package.
961
 
962
               when Library_Unit_Aspects =>
963
                  if Present (Expr)
964
                    and then Is_False (Static_Boolean (Expr))
965
                  then
966
                     goto Continue;
967
                  end if;
968
 
969
                  --  Build corresponding pragma node
970
 
971
                  Aitem :=
972
                    Make_Pragma (Loc,
973
                      Pragma_Argument_Associations => New_List (Ent),
974
                      Pragma_Identifier            =>
975
                        Make_Identifier (Sloc (Id), Chars (Id)));
976
 
977
                  --  This requires special handling in the case of a package
978
                  --  declaration, the pragma needs to be inserted in the list
979
                  --  of declarations for the associated package. There is no
980
                  --  issue of visibility delay for these aspects.
981
 
982
                  if Nkind (N) = N_Package_Declaration then
983
                     if Nkind (Parent (N)) /= N_Compilation_Unit then
984
                        Error_Msg_N
985
                          ("incorrect context for library unit aspect&", Id);
986
                     else
987
                        Prepend
988
                          (Aitem, Visible_Declarations (Specification (N)));
989
                     end if;
990
 
991
                     goto Continue;
992
                  end if;
993
 
994
                  --  If not package declaration, no delay is required
995
 
996
                  pragma Assert (not Delay_Required);
997
 
998
               --  Aspects related to container iterators. These aspects denote
999
               --  subprograms, and thus must be delayed.
1000
 
1001
               when Aspect_Constant_Indexing    |
1002
                    Aspect_Variable_Indexing    =>
1003
 
1004
                  if not Is_Type (E) or else not Is_Tagged_Type (E) then
1005
                     Error_Msg_N ("indexing applies to a tagged type", N);
1006
                  end if;
1007
 
1008
                  Aitem :=
1009
                    Make_Attribute_Definition_Clause (Loc,
1010
                      Name       => Ent,
1011
                      Chars      => Chars (Id),
1012
                      Expression => Relocate_Node (Expr));
1013
 
1014
                  Delay_Required := True;
1015
                  Set_Is_Delayed_Aspect (Aspect);
1016
 
1017
               when Aspect_Default_Iterator     |
1018
                    Aspect_Iterator_Element     =>
1019
 
1020
                  Aitem :=
1021
                    Make_Attribute_Definition_Clause (Loc,
1022
                      Name       => Ent,
1023
                      Chars      => Chars (Id),
1024
                      Expression => Relocate_Node (Expr));
1025
 
1026
                  Delay_Required := True;
1027
                  Set_Is_Delayed_Aspect (Aspect);
1028
 
1029
               when Aspect_Implicit_Dereference =>
1030
                  if not Is_Type (E)
1031
                    or else not Has_Discriminants (E)
1032
                  then
1033
                     Error_Msg_N
1034
                       ("Aspect must apply to a type with discriminants", N);
1035
                     goto Continue;
1036
 
1037
                  else
1038
                     declare
1039
                        Disc : Entity_Id;
1040
 
1041
                     begin
1042
                        Disc := First_Discriminant (E);
1043
                        while Present (Disc) loop
1044
                           if Chars (Expr) = Chars (Disc)
1045
                             and then Ekind (Etype (Disc)) =
1046
                               E_Anonymous_Access_Type
1047
                           then
1048
                              Set_Has_Implicit_Dereference (E);
1049
                              Set_Has_Implicit_Dereference (Disc);
1050
                              goto Continue;
1051
                           end if;
1052
 
1053
                           Next_Discriminant (Disc);
1054
                        end loop;
1055
 
1056
                        --  Error if no proper access discriminant.
1057
 
1058
                        Error_Msg_NE
1059
                         ("not an access discriminant of&", Expr, E);
1060
                     end;
1061
 
1062
                     goto Continue;
1063
                  end if;
1064
 
1065
               --  Aspects corresponding to attribute definition clauses
1066
 
1067
               when Aspect_Address             |
1068
                    Aspect_Alignment           |
1069
                    Aspect_Bit_Order           |
1070
                    Aspect_Component_Size      |
1071
                    Aspect_External_Tag        |
1072
                    Aspect_Input               |
1073
                    Aspect_Machine_Radix       |
1074
                    Aspect_Object_Size         |
1075
                    Aspect_Output              |
1076
                    Aspect_Read                |
1077
                    Aspect_Size                |
1078
                    Aspect_Small               |
1079
                    Aspect_Simple_Storage_Pool |
1080
                    Aspect_Storage_Pool        |
1081
                    Aspect_Storage_Size        |
1082
                    Aspect_Stream_Size         |
1083
                    Aspect_Value_Size          |
1084
                    Aspect_Write               =>
1085
 
1086
                  --  Construct the attribute definition clause
1087
 
1088
                  Aitem :=
1089
                    Make_Attribute_Definition_Clause (Loc,
1090
                      Name       => Ent,
1091
                      Chars      => Chars (Id),
1092
                      Expression => Relocate_Node (Expr));
1093
 
1094
                  --  A delay is required except in the common case where
1095
                  --  the expression is a literal, in which case it is fine
1096
                  --  to take care of it right away.
1097
 
1098
                  if Nkind_In (Expr, N_Integer_Literal, N_String_Literal) then
1099
                     pragma Assert (not Delay_Required);
1100
                     null;
1101
                  else
1102
                     Delay_Required := True;
1103
                     Set_Is_Delayed_Aspect (Aspect);
1104
                  end if;
1105
 
1106
               --  Aspects corresponding to pragmas with two arguments, where
1107
               --  the first argument is a local name referring to the entity,
1108
               --  and the second argument is the aspect definition expression
1109
               --  which is an expression that does not get analyzed.
1110
 
1111
               when Aspect_Suppress   |
1112
                    Aspect_Unsuppress =>
1113
 
1114
                  --  Construct the pragma
1115
 
1116
                  Aitem :=
1117
                    Make_Pragma (Loc,
1118
                      Pragma_Argument_Associations => New_List (
1119
                        New_Occurrence_Of (E, Loc),
1120
                        Relocate_Node (Expr)),
1121
                      Pragma_Identifier            =>
1122
                        Make_Identifier (Sloc (Id), Chars (Id)));
1123
 
1124
                  --  We don't have to play the delay game here, since the only
1125
                  --  values are check names which don't get analyzed anyway.
1126
 
1127
                  pragma Assert (not Delay_Required);
1128
 
1129
               when Aspect_Synchronization =>
1130
 
1131
                  --  The aspect corresponds to pragma Implemented.
1132
                  --  Construct the pragma
1133
 
1134
                  Aitem :=
1135
                    Make_Pragma (Loc,
1136
                      Pragma_Argument_Associations => New_List (
1137
                        New_Occurrence_Of (E, Loc),
1138
                        Relocate_Node (Expr)),
1139
                      Pragma_Identifier            =>
1140
                        Make_Identifier (Sloc (Id), Name_Implemented));
1141
 
1142
                  pragma Assert (not Delay_Required);
1143
 
1144
               --  Aspects corresponding to pragmas with two arguments, where
1145
               --  the second argument is a local name referring to the entity,
1146
               --  and the first argument is the aspect definition expression.
1147
 
1148
               when Aspect_Warnings =>
1149
 
1150
                  --  Construct the pragma
1151
 
1152
                  Aitem :=
1153
                    Make_Pragma (Loc,
1154
                      Pragma_Argument_Associations => New_List (
1155
                        Relocate_Node (Expr),
1156
                        New_Occurrence_Of (E, Loc)),
1157
                      Pragma_Identifier            =>
1158
                        Make_Identifier (Sloc (Id), Chars (Id)),
1159
                      Class_Present                => Class_Present (Aspect));
1160
 
1161
                  --  We don't have to play the delay game here, since the only
1162
                  --  values are ON/OFF which don't get analyzed anyway.
1163
 
1164
                  pragma Assert (not Delay_Required);
1165
 
1166
               --  Default_Value and Default_Component_Value aspects. These
1167
               --  are specially handled because they have no corresponding
1168
               --  pragmas or attributes.
1169
 
1170
               when Aspect_Default_Value | Aspect_Default_Component_Value =>
1171
                  Error_Msg_Name_1 := Chars (Id);
1172
 
1173
                  if not Is_Type (E) then
1174
                     Error_Msg_N ("aspect% can only apply to a type", Id);
1175
                     goto Continue;
1176
 
1177
                  elsif not Is_First_Subtype (E) then
1178
                     Error_Msg_N ("aspect% cannot apply to subtype", Id);
1179
                     goto Continue;
1180
 
1181
                  elsif A_Id = Aspect_Default_Value
1182
                    and then not Is_Scalar_Type (E)
1183
                  then
1184
                     Error_Msg_N
1185
                       ("aspect% can only be applied to scalar type", Id);
1186
                     goto Continue;
1187
 
1188
                  elsif A_Id = Aspect_Default_Component_Value then
1189
                     if not Is_Array_Type (E) then
1190
                        Error_Msg_N
1191
                          ("aspect% can only be applied to array type", Id);
1192
                        goto Continue;
1193
                     elsif not Is_Scalar_Type (Component_Type (E)) then
1194
                        Error_Msg_N
1195
                          ("aspect% requires scalar components", Id);
1196
                        goto Continue;
1197
                     end if;
1198
                  end if;
1199
 
1200
                  Aitem := Empty;
1201
                  Delay_Required := True;
1202
                  Set_Is_Delayed_Aspect (Aspect);
1203
                  Set_Has_Default_Aspect (Base_Type (Entity (Ent)));
1204
 
1205
                  if Is_Scalar_Type (E) then
1206
                     Set_Default_Aspect_Value (Entity (Ent), Expr);
1207
                  else
1208
                     Set_Default_Aspect_Component_Value (Entity (Ent), Expr);
1209
                  end if;
1210
 
1211
               when Aspect_Attach_Handler =>
1212
                  Aitem :=
1213
                    Make_Pragma (Loc,
1214
                      Pragma_Identifier            =>
1215
                        Make_Identifier (Sloc (Id), Name_Attach_Handler),
1216
                      Pragma_Argument_Associations =>
1217
                        New_List (Ent, Relocate_Node (Expr)));
1218
 
1219
                  Set_From_Aspect_Specification (Aitem, True);
1220
                  Set_Corresponding_Aspect (Aitem, Aspect);
1221
 
1222
                  pragma Assert (not Delay_Required);
1223
 
1224
               when Aspect_Priority           |
1225
                    Aspect_Interrupt_Priority |
1226
                    Aspect_Dispatching_Domain |
1227
                    Aspect_CPU                =>
1228
                  declare
1229
                     Pname : Name_Id;
1230
 
1231
                  begin
1232
                     if A_Id = Aspect_Priority then
1233
                        Pname := Name_Priority;
1234
 
1235
                     elsif A_Id = Aspect_Interrupt_Priority then
1236
                        Pname := Name_Interrupt_Priority;
1237
 
1238
                     elsif A_Id = Aspect_CPU then
1239
                        Pname := Name_CPU;
1240
 
1241
                     else
1242
                        Pname := Name_Dispatching_Domain;
1243
                     end if;
1244
 
1245
                     Aitem :=
1246
                       Make_Pragma (Loc,
1247
                           Pragma_Identifier            =>
1248
                             Make_Identifier (Sloc (Id), Pname),
1249
                           Pragma_Argument_Associations =>
1250
                             New_List
1251
                               (Make_Pragma_Argument_Association
1252
                                  (Sloc       => Sloc (Id),
1253
                                   Expression => Relocate_Node (Expr))));
1254
 
1255
                     Set_From_Aspect_Specification (Aitem, True);
1256
                     Set_Corresponding_Aspect (Aitem, Aspect);
1257
 
1258
                     pragma Assert (not Delay_Required);
1259
                  end;
1260
 
1261
               --  Aspects Pre/Post generate Precondition/Postcondition pragmas
1262
               --  with a first argument that is the expression, and a second
1263
               --  argument that is an informative message if the test fails.
1264
               --  This is inserted right after the declaration, to get the
1265
               --  required pragma placement. The processing for the pragmas
1266
               --  takes care of the required delay.
1267
 
1268
               when Pre_Post_Aspects => declare
1269
                  Pname : Name_Id;
1270
 
1271
               begin
1272
                  if A_Id = Aspect_Pre or else A_Id = Aspect_Precondition then
1273
                     Pname := Name_Precondition;
1274
                  else
1275
                     Pname := Name_Postcondition;
1276
                  end if;
1277
 
1278
                  --  If the expressions is of the form A and then B, then
1279
                  --  we generate separate Pre/Post aspects for the separate
1280
                  --  clauses. Since we allow multiple pragmas, there is no
1281
                  --  problem in allowing multiple Pre/Post aspects internally.
1282
                  --  These should be treated in reverse order (B first and
1283
                  --  A second) since they are later inserted just after N in
1284
                  --  the order they are treated. This way, the pragma for A
1285
                  --  ends up preceding the pragma for B, which may have an
1286
                  --  importance for the error raised (either constraint error
1287
                  --  or precondition error).
1288
 
1289
                  --  We do not do this for Pre'Class, since we have to put
1290
                  --  these conditions together in a complex OR expression
1291
 
1292
                  --  We do not do this in ASIS mode, as ASIS relies on the
1293
                  --  original node representing the complete expression, when
1294
                  --  retrieving it through the source aspect table.
1295
 
1296
                  if not ASIS_Mode
1297
                    and then (Pname = Name_Postcondition
1298
                               or else not Class_Present (Aspect))
1299
                  then
1300
                     while Nkind (Expr) = N_And_Then loop
1301
                        Insert_After (Aspect,
1302
                          Make_Aspect_Specification (Sloc (Left_Opnd (Expr)),
1303
                            Identifier    => Identifier (Aspect),
1304
                            Expression    => Relocate_Node (Left_Opnd (Expr)),
1305
                            Class_Present => Class_Present (Aspect),
1306
                            Split_PPC     => True));
1307
                        Rewrite (Expr, Relocate_Node (Right_Opnd (Expr)));
1308
                        Eloc := Sloc (Expr);
1309
                     end loop;
1310
                  end if;
1311
 
1312
                  --  Build the precondition/postcondition pragma
1313
 
1314
                  Aitem :=
1315
                    Make_Pragma (Loc,
1316
                      Pragma_Identifier            =>
1317
                        Make_Identifier (Sloc (Id), Pname),
1318
                      Class_Present                => Class_Present (Aspect),
1319
                      Split_PPC                    => Split_PPC (Aspect),
1320
                      Pragma_Argument_Associations => New_List (
1321
                        Make_Pragma_Argument_Association (Eloc,
1322
                          Chars      => Name_Check,
1323
                          Expression => Relocate_Node (Expr))));
1324
 
1325
                  --  Add message unless exception messages are suppressed
1326
 
1327
                  if not Opt.Exception_Locations_Suppressed then
1328
                     Append_To (Pragma_Argument_Associations (Aitem),
1329
                       Make_Pragma_Argument_Association (Eloc,
1330
                         Chars     => Name_Message,
1331
                         Expression =>
1332
                           Make_String_Literal (Eloc,
1333
                             Strval => "failed "
1334
                                       & Get_Name_String (Pname)
1335
                                       & " from "
1336
                                       & Build_Location_String (Eloc))));
1337
                  end if;
1338
 
1339
                  Set_From_Aspect_Specification (Aitem, True);
1340
                  Set_Corresponding_Aspect (Aitem, Aspect);
1341
                  Set_Is_Delayed_Aspect (Aspect);
1342
 
1343
                  --  For Pre/Post cases, insert immediately after the entity
1344
                  --  declaration, since that is the required pragma placement.
1345
                  --  Note that for these aspects, we do not have to worry
1346
                  --  about delay issues, since the pragmas themselves deal
1347
                  --  with delay of visibility for the expression analysis.
1348
 
1349
                  --  If the entity is a library-level subprogram, the pre/
1350
                  --  postconditions must be treated as late pragmas.
1351
 
1352
                  if Nkind (Parent (N)) = N_Compilation_Unit then
1353
                     Add_Global_Declaration (Aitem);
1354
                  else
1355
                     Insert_After (N, Aitem);
1356
                  end if;
1357
 
1358
                  goto Continue;
1359
               end;
1360
 
1361
               --  Invariant aspects generate a corresponding pragma with a
1362
               --  first argument that is the entity, a second argument that is
1363
               --  the expression and a third argument that is an appropriate
1364
               --  message. This is inserted right after the declaration, to
1365
               --  get the required pragma placement. The pragma processing
1366
               --  takes care of the required delay.
1367
 
1368
               when Aspect_Invariant      |
1369
                    Aspect_Type_Invariant =>
1370
 
1371
                  --  Analysis of the pragma will verify placement legality:
1372
                  --  an invariant must apply to a private type, or appear in
1373
                  --  the private part of a spec and apply to a completion.
1374
 
1375
                  --  Construct the pragma
1376
 
1377
                  Aitem :=
1378
                    Make_Pragma (Loc,
1379
                      Pragma_Argument_Associations =>
1380
                        New_List (Ent, Relocate_Node (Expr)),
1381
                      Class_Present                => Class_Present (Aspect),
1382
                      Pragma_Identifier            =>
1383
                        Make_Identifier (Sloc (Id), Name_Invariant));
1384
 
1385
                  --  Add message unless exception messages are suppressed
1386
 
1387
                  if not Opt.Exception_Locations_Suppressed then
1388
                     Append_To (Pragma_Argument_Associations (Aitem),
1389
                       Make_Pragma_Argument_Association (Eloc,
1390
                         Chars      => Name_Message,
1391
                         Expression =>
1392
                           Make_String_Literal (Eloc,
1393
                             Strval => "failed invariant from "
1394
                                       & Build_Location_String (Eloc))));
1395
                  end if;
1396
 
1397
                  Set_From_Aspect_Specification (Aitem, True);
1398
                  Set_Corresponding_Aspect (Aitem, Aspect);
1399
                  Set_Is_Delayed_Aspect (Aspect);
1400
 
1401
                  --  For Invariant case, insert immediately after the entity
1402
                  --  declaration. We do not have to worry about delay issues
1403
                  --  since the pragma processing takes care of this.
1404
 
1405
                  Insert_After (N, Aitem);
1406
                  goto Continue;
1407
 
1408
               --  Predicate aspects generate a corresponding pragma with a
1409
               --  first argument that is the entity, and the second argument
1410
               --  is the expression.
1411
 
1412
               when Aspect_Dynamic_Predicate |
1413
                    Aspect_Predicate         |
1414
                    Aspect_Static_Predicate  =>
1415
 
1416
                  --  Construct the pragma (always a pragma Predicate, with
1417
                  --  flags recording whether it is static/dynamic).
1418
 
1419
                  Aitem :=
1420
                    Make_Pragma (Loc,
1421
                      Pragma_Argument_Associations =>
1422
                        New_List (Ent, Relocate_Node (Expr)),
1423
                      Class_Present                => Class_Present (Aspect),
1424
                      Pragma_Identifier            =>
1425
                        Make_Identifier (Sloc (Id), Name_Predicate));
1426
 
1427
                  Set_From_Aspect_Specification (Aitem, True);
1428
                  Set_Corresponding_Aspect (Aitem, Aspect);
1429
 
1430
                  --  Make sure we have a freeze node (it might otherwise be
1431
                  --  missing in cases like subtype X is Y, and we would not
1432
                  --  have a place to build the predicate function).
1433
 
1434
                  --  If the type is private, indicate that its completion
1435
                  --  has a freeze node, because that is the one that will be
1436
                  --  visible at freeze time.
1437
 
1438
                  Set_Has_Predicates (E);
1439
 
1440
                  if Is_Private_Type (E)
1441
                    and then Present (Full_View (E))
1442
                  then
1443
                     Set_Has_Predicates (Full_View (E));
1444
                     Set_Has_Delayed_Aspects (Full_View (E));
1445
                     Ensure_Freeze_Node (Full_View (E));
1446
                  end if;
1447
 
1448
                  Ensure_Freeze_Node (E);
1449
                  Set_Is_Delayed_Aspect (Aspect);
1450
                  Delay_Required := True;
1451
 
1452
               when Aspect_Test_Case => declare
1453
                  Args      : List_Id;
1454
                  Comp_Expr : Node_Id;
1455
                  Comp_Assn : Node_Id;
1456
                  New_Expr  : Node_Id;
1457
 
1458
               begin
1459
                  Args := New_List;
1460
 
1461
                  if Nkind (Parent (N)) = N_Compilation_Unit then
1462
                     Error_Msg_N
1463
                       ("incorrect placement of aspect `Test_Case`", E);
1464
                     goto Continue;
1465
                  end if;
1466
 
1467
                  if Nkind (Expr) /= N_Aggregate then
1468
                     Error_Msg_NE
1469
                       ("wrong syntax for aspect `Test_Case` for &", Id, E);
1470
                     goto Continue;
1471
                  end if;
1472
 
1473
                  --  Make pragma expressions refer to the original aspect
1474
                  --  expressions through the Original_Node link. This is used
1475
                  --  in semantic analysis for ASIS mode, so that the original
1476
                  --  expression also gets analyzed.
1477
 
1478
                  Comp_Expr := First (Expressions (Expr));
1479
                  while Present (Comp_Expr) loop
1480
                     New_Expr := Relocate_Node (Comp_Expr);
1481
                     Set_Original_Node (New_Expr, Comp_Expr);
1482
                     Append
1483
                       (Make_Pragma_Argument_Association (Sloc (Comp_Expr),
1484
                          Expression => New_Expr),
1485
                       Args);
1486
                     Next (Comp_Expr);
1487
                  end loop;
1488
 
1489
                  Comp_Assn := First (Component_Associations (Expr));
1490
                  while Present (Comp_Assn) loop
1491
                     if List_Length (Choices (Comp_Assn)) /= 1
1492
                       or else
1493
                         Nkind (First (Choices (Comp_Assn))) /= N_Identifier
1494
                     then
1495
                        Error_Msg_NE
1496
                          ("wrong syntax for aspect `Test_Case` for &", Id, E);
1497
                        goto Continue;
1498
                     end if;
1499
 
1500
                     New_Expr := Relocate_Node (Expression (Comp_Assn));
1501
                     Set_Original_Node (New_Expr, Expression (Comp_Assn));
1502
                     Append (Make_Pragma_Argument_Association (
1503
                       Sloc       => Sloc (Comp_Assn),
1504
                       Chars      => Chars (First (Choices (Comp_Assn))),
1505
                       Expression => New_Expr),
1506
                       Args);
1507
                     Next (Comp_Assn);
1508
                  end loop;
1509
 
1510
                  --  Build the test-case pragma
1511
 
1512
                  Aitem :=
1513
                    Make_Pragma (Loc,
1514
                      Pragma_Identifier            =>
1515
                        Make_Identifier (Sloc (Id), Name_Test_Case),
1516
                      Pragma_Argument_Associations =>
1517
                        Args);
1518
 
1519
                  Set_From_Aspect_Specification (Aitem, True);
1520
                  Set_Corresponding_Aspect (Aitem, Aspect);
1521
                  Set_Is_Delayed_Aspect (Aspect);
1522
 
1523
                  --  Insert immediately after the entity declaration
1524
 
1525
                  Insert_After (N, Aitem);
1526
 
1527
                  goto Continue;
1528
               end;
1529
 
1530
               when Aspect_Dimension =>
1531
                  Analyze_Aspect_Dimension (N, Id, Expr);
1532
                  goto Continue;
1533
 
1534
               when Aspect_Dimension_System =>
1535
                  Analyze_Aspect_Dimension_System (N, Id, Expr);
1536
                  goto Continue;
1537
 
1538
            end case;
1539
 
1540
            --  If a delay is required, we delay the freeze (not much point in
1541
            --  delaying the aspect if we don't delay the freeze!). The pragma
1542
            --  or attribute clause if there is one is then attached to the
1543
            --  aspect specification which is placed in the rep item list.
1544
 
1545
            if Delay_Required then
1546
               if Present (Aitem) then
1547
                  Set_From_Aspect_Specification (Aitem, True);
1548
 
1549
                  if Nkind (Aitem) = N_Pragma then
1550
                     Set_Corresponding_Aspect (Aitem, Aspect);
1551
                  end if;
1552
 
1553
                  Set_Is_Delayed_Aspect (Aitem);
1554
                  Set_Aspect_Rep_Item (Aspect, Aitem);
1555
               end if;
1556
 
1557
               Ensure_Freeze_Node (E);
1558
               Set_Has_Delayed_Aspects (E);
1559
               Record_Rep_Item (E, Aspect);
1560
 
1561
            --  If no delay required, insert the pragma/clause in the tree
1562
 
1563
            else
1564
               Set_From_Aspect_Specification (Aitem, True);
1565
 
1566
               if Nkind (Aitem) = N_Pragma then
1567
                  Set_Corresponding_Aspect (Aitem, Aspect);
1568
               end if;
1569
 
1570
               --  If this is a compilation unit, we will put the pragma in
1571
               --  the Pragmas_After list of the N_Compilation_Unit_Aux node.
1572
 
1573
               if Nkind (Parent (Ins_Node)) = N_Compilation_Unit then
1574
                  declare
1575
                     Aux : constant Node_Id :=
1576
                             Aux_Decls_Node (Parent (Ins_Node));
1577
 
1578
                  begin
1579
                     pragma Assert (Nkind (Aux) = N_Compilation_Unit_Aux);
1580
 
1581
                     if No (Pragmas_After (Aux)) then
1582
                        Set_Pragmas_After (Aux, Empty_List);
1583
                     end if;
1584
 
1585
                     --  For Pre_Post put at start of list, otherwise at end
1586
 
1587
                     if A_Id in Pre_Post_Aspects then
1588
                        Prepend (Aitem, Pragmas_After (Aux));
1589
                     else
1590
                        Append (Aitem, Pragmas_After (Aux));
1591
                     end if;
1592
                  end;
1593
 
1594
               --  Here if not compilation unit case
1595
 
1596
               else
1597
                  case A_Id is
1598
 
1599
                     --  For Pre/Post cases, insert immediately after the
1600
                     --  entity declaration, since that is the required pragma
1601
                     --  placement.
1602
 
1603
                     when Pre_Post_Aspects =>
1604
                        Insert_After (N, Aitem);
1605
 
1606
                     --  For Priority aspects, insert into the task or
1607
                     --  protected definition, which we need to create if it's
1608
                     --  not there. The same applies to CPU and
1609
                     --  Dispatching_Domain but only to tasks.
1610
 
1611
                     when Aspect_Priority           |
1612
                          Aspect_Interrupt_Priority |
1613
                          Aspect_Dispatching_Domain |
1614
                          Aspect_CPU                =>
1615
                        declare
1616
                           T : Node_Id; -- the type declaration
1617
                           L : List_Id; -- list of decls of task/protected
1618
 
1619
                        begin
1620
                           if Nkind (N) = N_Object_Declaration then
1621
                              T := Parent (Etype (Defining_Identifier (N)));
1622
                           else
1623
                              T := N;
1624
                           end if;
1625
 
1626
                           if Nkind (T) = N_Protected_Type_Declaration
1627
                             and then A_Id /= Aspect_Dispatching_Domain
1628
                             and then A_Id /= Aspect_CPU
1629
                           then
1630
                              pragma Assert
1631
                                (Present (Protected_Definition (T)));
1632
 
1633
                              L := Visible_Declarations
1634
                                     (Protected_Definition (T));
1635
 
1636
                           elsif Nkind (T) = N_Task_Type_Declaration then
1637
                              if No (Task_Definition (T)) then
1638
                                 Set_Task_Definition
1639
                                   (T,
1640
                                    Make_Task_Definition
1641
                                      (Sloc (T),
1642
                                       Visible_Declarations => New_List,
1643
                                       End_Label => Empty));
1644
                              end if;
1645
 
1646
                              L := Visible_Declarations (Task_Definition (T));
1647
 
1648
                           else
1649
                              raise Program_Error;
1650
                           end if;
1651
 
1652
                           Prepend (Aitem, To => L);
1653
 
1654
                           --  Analyze rewritten pragma. Otherwise, its
1655
                           --  analysis is done too late, after the task or
1656
                           --  protected object has been created.
1657
 
1658
                           Analyze (Aitem);
1659
                        end;
1660
 
1661
                     --  For all other cases, insert in sequence
1662
 
1663
                     when others =>
1664
                        Insert_After (Ins_Node, Aitem);
1665
                        Ins_Node := Aitem;
1666
                  end case;
1667
               end if;
1668
            end if;
1669
         end;
1670
 
1671
      <<Continue>>
1672
         Next (Aspect);
1673
      end loop Aspect_Loop;
1674
   end Analyze_Aspect_Specifications;
1675
 
1676
   -----------------------
1677
   -- Analyze_At_Clause --
1678
   -----------------------
1679
 
1680
   --  An at clause is replaced by the corresponding Address attribute
1681
   --  definition clause that is the preferred approach in Ada 95.
1682
 
1683
   procedure Analyze_At_Clause (N : Node_Id) is
1684
      CS : constant Boolean := Comes_From_Source (N);
1685
 
1686
   begin
1687
      --  This is an obsolescent feature
1688
 
1689
      Check_Restriction (No_Obsolescent_Features, N);
1690
 
1691
      if Warn_On_Obsolescent_Feature then
1692
         Error_Msg_N
1693
           ("at clause is an obsolescent feature (RM J.7(2))?", N);
1694
         Error_Msg_N
1695
           ("\use address attribute definition clause instead?", N);
1696
      end if;
1697
 
1698
      --  Rewrite as address clause
1699
 
1700
      Rewrite (N,
1701
        Make_Attribute_Definition_Clause (Sloc (N),
1702
          Name  => Identifier (N),
1703
          Chars => Name_Address,
1704
          Expression => Expression (N)));
1705
 
1706
      --  We preserve Comes_From_Source, since logically the clause still
1707
      --  comes from the source program even though it is changed in form.
1708
 
1709
      Set_Comes_From_Source (N, CS);
1710
 
1711
      --  Analyze rewritten clause
1712
 
1713
      Analyze_Attribute_Definition_Clause (N);
1714
   end Analyze_At_Clause;
1715
 
1716
   -----------------------------------------
1717
   -- Analyze_Attribute_Definition_Clause --
1718
   -----------------------------------------
1719
 
1720
   procedure Analyze_Attribute_Definition_Clause (N : Node_Id) is
1721
      Loc   : constant Source_Ptr   := Sloc (N);
1722
      Nam   : constant Node_Id      := Name (N);
1723
      Attr  : constant Name_Id      := Chars (N);
1724
      Expr  : constant Node_Id      := Expression (N);
1725
      Id    : constant Attribute_Id := Get_Attribute_Id (Attr);
1726
 
1727
      Ent : Entity_Id;
1728
      --  The entity of Nam after it is analyzed. In the case of an incomplete
1729
      --  type, this is the underlying type.
1730
 
1731
      U_Ent : Entity_Id;
1732
      --  The underlying entity to which the attribute applies. Generally this
1733
      --  is the Underlying_Type of Ent, except in the case where the clause
1734
      --  applies to full view of incomplete type or private type in which case
1735
      --  U_Ent is just a copy of Ent.
1736
 
1737
      FOnly : Boolean := False;
1738
      --  Reset to True for subtype specific attribute (Alignment, Size)
1739
      --  and for stream attributes, i.e. those cases where in the call
1740
      --  to Rep_Item_Too_Late, FOnly is set True so that only the freezing
1741
      --  rules are checked. Note that the case of stream attributes is not
1742
      --  clear from the RM, but see AI95-00137. Also, the RM seems to
1743
      --  disallow Storage_Size for derived task types, but that is also
1744
      --  clearly unintentional.
1745
 
1746
      procedure Analyze_Stream_TSS_Definition (TSS_Nam : TSS_Name_Type);
1747
      --  Common processing for 'Read, 'Write, 'Input and 'Output attribute
1748
      --  definition clauses.
1749
 
1750
      function Duplicate_Clause return Boolean;
1751
      --  This routine checks if the aspect for U_Ent being given by attribute
1752
      --  definition clause N is for an aspect that has already been specified,
1753
      --  and if so gives an error message. If there is a duplicate, True is
1754
      --  returned, otherwise if there is no error, False is returned.
1755
 
1756
      procedure Check_Indexing_Functions;
1757
      --  Check that the function in Constant_Indexing or Variable_Indexing
1758
      --  attribute has the proper type structure. If the name is overloaded,
1759
      --  check that all interpretations are legal.
1760
 
1761
      procedure Check_Iterator_Functions;
1762
      --  Check that there is a single function in Default_Iterator attribute
1763
      --  has the proper type structure.
1764
 
1765
      function Check_Primitive_Function (Subp : Entity_Id) return Boolean;
1766
      --  Common legality check for the previous two
1767
 
1768
      -----------------------------------
1769
      -- Analyze_Stream_TSS_Definition --
1770
      -----------------------------------
1771
 
1772
      procedure Analyze_Stream_TSS_Definition (TSS_Nam : TSS_Name_Type) is
1773
         Subp : Entity_Id := Empty;
1774
         I    : Interp_Index;
1775
         It   : Interp;
1776
         Pnam : Entity_Id;
1777
 
1778
         Is_Read : constant Boolean := (TSS_Nam = TSS_Stream_Read);
1779
         --  True for Read attribute, false for other attributes
1780
 
1781
         function Has_Good_Profile (Subp : Entity_Id) return Boolean;
1782
         --  Return true if the entity is a subprogram with an appropriate
1783
         --  profile for the attribute being defined.
1784
 
1785
         ----------------------
1786
         -- Has_Good_Profile --
1787
         ----------------------
1788
 
1789
         function Has_Good_Profile (Subp : Entity_Id) return Boolean is
1790
            F              : Entity_Id;
1791
            Is_Function    : constant Boolean := (TSS_Nam = TSS_Stream_Input);
1792
            Expected_Ekind : constant array (Boolean) of Entity_Kind :=
1793
                               (False => E_Procedure, True => E_Function);
1794
            Typ            : Entity_Id;
1795
 
1796
         begin
1797
            if Ekind (Subp) /= Expected_Ekind (Is_Function) then
1798
               return False;
1799
            end if;
1800
 
1801
            F := First_Formal (Subp);
1802
 
1803
            if No (F)
1804
              or else Ekind (Etype (F)) /= E_Anonymous_Access_Type
1805
              or else Designated_Type (Etype (F)) /=
1806
                               Class_Wide_Type (RTE (RE_Root_Stream_Type))
1807
            then
1808
               return False;
1809
            end if;
1810
 
1811
            if not Is_Function then
1812
               Next_Formal (F);
1813
 
1814
               declare
1815
                  Expected_Mode : constant array (Boolean) of Entity_Kind :=
1816
                                    (False => E_In_Parameter,
1817
                                     True  => E_Out_Parameter);
1818
               begin
1819
                  if Parameter_Mode (F) /= Expected_Mode (Is_Read) then
1820
                     return False;
1821
                  end if;
1822
               end;
1823
 
1824
               Typ := Etype (F);
1825
 
1826
            else
1827
               Typ := Etype (Subp);
1828
            end if;
1829
 
1830
            return Base_Type (Typ) = Base_Type (Ent)
1831
              and then No (Next_Formal (F));
1832
         end Has_Good_Profile;
1833
 
1834
      --  Start of processing for Analyze_Stream_TSS_Definition
1835
 
1836
      begin
1837
         FOnly := True;
1838
 
1839
         if not Is_Type (U_Ent) then
1840
            Error_Msg_N ("local name must be a subtype", Nam);
1841
            return;
1842
         end if;
1843
 
1844
         Pnam := TSS (Base_Type (U_Ent), TSS_Nam);
1845
 
1846
         --  If Pnam is present, it can be either inherited from an ancestor
1847
         --  type (in which case it is legal to redefine it for this type), or
1848
         --  be a previous definition of the attribute for the same type (in
1849
         --  which case it is illegal).
1850
 
1851
         --  In the first case, it will have been analyzed already, and we
1852
         --  can check that its profile does not match the expected profile
1853
         --  for a stream attribute of U_Ent. In the second case, either Pnam
1854
         --  has been analyzed (and has the expected profile), or it has not
1855
         --  been analyzed yet (case of a type that has not been frozen yet
1856
         --  and for which the stream attribute has been set using Set_TSS).
1857
 
1858
         if Present (Pnam)
1859
           and then (No (First_Entity (Pnam)) or else Has_Good_Profile (Pnam))
1860
         then
1861
            Error_Msg_Sloc := Sloc (Pnam);
1862
            Error_Msg_Name_1 := Attr;
1863
            Error_Msg_N ("% attribute already defined #", Nam);
1864
            return;
1865
         end if;
1866
 
1867
         Analyze (Expr);
1868
 
1869
         if Is_Entity_Name (Expr) then
1870
            if not Is_Overloaded (Expr) then
1871
               if Has_Good_Profile (Entity (Expr)) then
1872
                  Subp := Entity (Expr);
1873
               end if;
1874
 
1875
            else
1876
               Get_First_Interp (Expr, I, It);
1877
               while Present (It.Nam) loop
1878
                  if Has_Good_Profile (It.Nam) then
1879
                     Subp := It.Nam;
1880
                     exit;
1881
                  end if;
1882
 
1883
                  Get_Next_Interp (I, It);
1884
               end loop;
1885
            end if;
1886
         end if;
1887
 
1888
         if Present (Subp) then
1889
            if Is_Abstract_Subprogram (Subp) then
1890
               Error_Msg_N ("stream subprogram must not be abstract", Expr);
1891
               return;
1892
            end if;
1893
 
1894
            Set_Entity (Expr, Subp);
1895
            Set_Etype (Expr, Etype (Subp));
1896
 
1897
            New_Stream_Subprogram (N, U_Ent, Subp, TSS_Nam);
1898
 
1899
         else
1900
            Error_Msg_Name_1 := Attr;
1901
            Error_Msg_N ("incorrect expression for% attribute", Expr);
1902
         end if;
1903
      end Analyze_Stream_TSS_Definition;
1904
 
1905
      ------------------------------
1906
      -- Check_Indexing_Functions --
1907
      ------------------------------
1908
 
1909
      procedure Check_Indexing_Functions is
1910
 
1911
         procedure Check_One_Function (Subp : Entity_Id);
1912
         --  Check one possible interpretation
1913
 
1914
         ------------------------
1915
         -- Check_One_Function --
1916
         ------------------------
1917
 
1918
         procedure Check_One_Function (Subp : Entity_Id) is
1919
            Default_Element : constant Node_Id :=
1920
                                Find_Aspect
1921
                                  (Etype (First_Formal (Subp)),
1922
                                   Aspect_Iterator_Element);
1923
 
1924
         begin
1925
            if not Check_Primitive_Function (Subp) then
1926
               Error_Msg_NE
1927
                 ("aspect Indexing requires a function that applies to type&",
1928
                   Subp, Ent);
1929
            end if;
1930
 
1931
            --  An indexing function must return either the default element of
1932
            --  the container, or a reference type.
1933
 
1934
            if Present (Default_Element) then
1935
               Analyze (Default_Element);
1936
               if Is_Entity_Name (Default_Element)
1937
                 and then Covers (Entity (Default_Element), Etype (Subp))
1938
               then
1939
                  return;
1940
               end if;
1941
            end if;
1942
 
1943
            --  Otherwise the return type must be a reference type.
1944
 
1945
            if not Has_Implicit_Dereference (Etype (Subp)) then
1946
               Error_Msg_N
1947
                 ("function for indexing must return a reference type", Subp);
1948
            end if;
1949
         end Check_One_Function;
1950
 
1951
      --  Start of processing for Check_Indexing_Functions
1952
 
1953
      begin
1954
         if In_Instance then
1955
            return;
1956
         end if;
1957
 
1958
         Analyze (Expr);
1959
 
1960
         if not Is_Overloaded (Expr) then
1961
            Check_One_Function (Entity (Expr));
1962
 
1963
         else
1964
            declare
1965
               I  : Interp_Index;
1966
               It : Interp;
1967
 
1968
            begin
1969
               Get_First_Interp (Expr, I, It);
1970
               while Present (It.Nam) loop
1971
 
1972
                  --  Note that analysis will have added the interpretation
1973
                  --  that corresponds to the dereference. We only check the
1974
                  --  subprogram itself.
1975
 
1976
                  if Is_Overloadable (It.Nam) then
1977
                     Check_One_Function (It.Nam);
1978
                  end if;
1979
 
1980
                  Get_Next_Interp (I, It);
1981
               end loop;
1982
            end;
1983
         end if;
1984
      end Check_Indexing_Functions;
1985
 
1986
      ------------------------------
1987
      -- Check_Iterator_Functions --
1988
      ------------------------------
1989
 
1990
      procedure Check_Iterator_Functions is
1991
         Default : Entity_Id;
1992
 
1993
         function Valid_Default_Iterator (Subp : Entity_Id) return Boolean;
1994
         --  Check one possible interpretation for validity
1995
 
1996
         ----------------------------
1997
         -- Valid_Default_Iterator --
1998
         ----------------------------
1999
 
2000
         function Valid_Default_Iterator (Subp : Entity_Id) return Boolean is
2001
            Formal : Entity_Id;
2002
 
2003
         begin
2004
            if not Check_Primitive_Function (Subp) then
2005
               return False;
2006
            else
2007
               Formal := First_Formal (Subp);
2008
            end if;
2009
 
2010
            --  False if any subsequent formal has no default expression
2011
 
2012
            Formal := Next_Formal (Formal);
2013
            while Present (Formal) loop
2014
               if No (Expression (Parent (Formal))) then
2015
                  return False;
2016
               end if;
2017
 
2018
               Next_Formal (Formal);
2019
            end loop;
2020
 
2021
            --  True if all subsequent formals have default expressions
2022
 
2023
            return True;
2024
         end Valid_Default_Iterator;
2025
 
2026
      --  Start of processing for Check_Iterator_Functions
2027
 
2028
      begin
2029
         Analyze (Expr);
2030
 
2031
         if not Is_Entity_Name (Expr) then
2032
            Error_Msg_N ("aspect Iterator must be a function name", Expr);
2033
         end if;
2034
 
2035
         if not Is_Overloaded (Expr) then
2036
            if not Check_Primitive_Function (Entity (Expr)) then
2037
               Error_Msg_NE
2038
                 ("aspect Indexing requires a function that applies to type&",
2039
                   Entity (Expr), Ent);
2040
            end if;
2041
 
2042
            if not Valid_Default_Iterator (Entity (Expr)) then
2043
               Error_Msg_N ("improper function for default iterator", Expr);
2044
            end if;
2045
 
2046
         else
2047
            Default := Empty;
2048
            declare
2049
               I : Interp_Index;
2050
               It : Interp;
2051
 
2052
            begin
2053
               Get_First_Interp (Expr, I, It);
2054
               while Present (It.Nam) loop
2055
                  if not Check_Primitive_Function (It.Nam)
2056
                    or else not Valid_Default_Iterator (It.Nam)
2057
                  then
2058
                     Remove_Interp (I);
2059
 
2060
                  elsif Present (Default) then
2061
                     Error_Msg_N ("default iterator must be unique", Expr);
2062
 
2063
                  else
2064
                     Default := It.Nam;
2065
                  end if;
2066
 
2067
                  Get_Next_Interp (I, It);
2068
               end loop;
2069
            end;
2070
 
2071
            if Present (Default) then
2072
               Set_Entity (Expr, Default);
2073
               Set_Is_Overloaded (Expr, False);
2074
            end if;
2075
         end if;
2076
      end Check_Iterator_Functions;
2077
 
2078
      -------------------------------
2079
      -- Check_Primitive_Function  --
2080
      -------------------------------
2081
 
2082
      function Check_Primitive_Function (Subp : Entity_Id) return Boolean is
2083
         Ctrl : Entity_Id;
2084
 
2085
      begin
2086
         if Ekind (Subp) /= E_Function then
2087
            return False;
2088
         end if;
2089
 
2090
         if No (First_Formal (Subp)) then
2091
            return False;
2092
         else
2093
            Ctrl := Etype (First_Formal (Subp));
2094
         end if;
2095
 
2096
         if Ctrl = Ent
2097
           or else Ctrl = Class_Wide_Type (Ent)
2098
           or else
2099
             (Ekind (Ctrl) = E_Anonymous_Access_Type
2100
               and then
2101
                 (Designated_Type (Ctrl) = Ent
2102
                   or else Designated_Type (Ctrl) = Class_Wide_Type (Ent)))
2103
         then
2104
            null;
2105
 
2106
         else
2107
            return False;
2108
         end if;
2109
 
2110
         return True;
2111
      end Check_Primitive_Function;
2112
 
2113
      ----------------------
2114
      -- Duplicate_Clause --
2115
      ----------------------
2116
 
2117
      function Duplicate_Clause return Boolean is
2118
         A : Node_Id;
2119
 
2120
      begin
2121
         --  Nothing to do if this attribute definition clause comes from
2122
         --  an aspect specification, since we could not be duplicating an
2123
         --  explicit clause, and we dealt with the case of duplicated aspects
2124
         --  in Analyze_Aspect_Specifications.
2125
 
2126
         if From_Aspect_Specification (N) then
2127
            return False;
2128
         end if;
2129
 
2130
         --  Otherwise current clause may duplicate previous clause or a
2131
         --  previously given aspect specification for the same aspect.
2132
 
2133
         A := Get_Rep_Item_For_Entity (U_Ent, Chars (N));
2134
 
2135
         if Present (A) then
2136
            if Entity (A) = U_Ent then
2137
               Error_Msg_Name_1 := Chars (N);
2138
               Error_Msg_Sloc := Sloc (A);
2139
               Error_Msg_NE ("aspect% for & previously given#", N, U_Ent);
2140
               return True;
2141
            end if;
2142
         end if;
2143
 
2144
         return False;
2145
      end Duplicate_Clause;
2146
 
2147
   --  Start of processing for Analyze_Attribute_Definition_Clause
2148
 
2149
   begin
2150
      --  The following code is a defense against recursion. Not clear that
2151
      --  this can happen legitimately, but perhaps some error situations
2152
      --  can cause it, and we did see this recursion during testing.
2153
 
2154
      if Analyzed (N) then
2155
         return;
2156
      else
2157
         Set_Analyzed (N, True);
2158
      end if;
2159
 
2160
      --  Ignore some selected attributes in CodePeer mode since they are not
2161
      --  relevant in this context.
2162
 
2163
      if CodePeer_Mode then
2164
         case Id is
2165
 
2166
            --  Ignore Component_Size in CodePeer mode, to avoid changing the
2167
            --  internal representation of types by implicitly packing them.
2168
 
2169
            when Attribute_Component_Size =>
2170
               Rewrite (N, Make_Null_Statement (Sloc (N)));
2171
               return;
2172
 
2173
            when others =>
2174
               null;
2175
         end case;
2176
      end if;
2177
 
2178
      --  Process Ignore_Rep_Clauses option
2179
 
2180
      if Ignore_Rep_Clauses then
2181
         case Id is
2182
 
2183
            --  The following should be ignored. They do not affect legality
2184
            --  and may be target dependent. The basic idea of -gnatI is to
2185
            --  ignore any rep clauses that may be target dependent but do not
2186
            --  affect legality (except possibly to be rejected because they
2187
            --  are incompatible with the compilation target).
2188
 
2189
            when Attribute_Alignment      |
2190
                 Attribute_Bit_Order      |
2191
                 Attribute_Component_Size |
2192
                 Attribute_Machine_Radix  |
2193
                 Attribute_Object_Size    |
2194
                 Attribute_Size           |
2195
                 Attribute_Stream_Size    |
2196
                 Attribute_Value_Size     =>
2197
               Rewrite (N, Make_Null_Statement (Sloc (N)));
2198
               return;
2199
 
2200
            --  Perhaps 'Small should not be ignored by Ignore_Rep_Clauses ???
2201
 
2202
            when Attribute_Small =>
2203
               if Ignore_Rep_Clauses then
2204
                  Rewrite (N, Make_Null_Statement (Sloc (N)));
2205
                  return;
2206
               end if;
2207
 
2208
            --  The following should not be ignored, because in the first place
2209
            --  they are reasonably portable, and should not cause problems in
2210
            --  compiling code from another target, and also they do affect
2211
            --  legality, e.g. failing to provide a stream attribute for a
2212
            --  type may make a program illegal.
2213
 
2214
            when Attribute_External_Tag        |
2215
                 Attribute_Input               |
2216
                 Attribute_Output              |
2217
                 Attribute_Read                |
2218
                 Attribute_Simple_Storage_Pool |
2219
                 Attribute_Storage_Pool        |
2220
                 Attribute_Storage_Size        |
2221
                 Attribute_Write               =>
2222
               null;
2223
 
2224
            --  Other cases are errors ("attribute& cannot be set with
2225
            --  definition clause"), which will be caught below.
2226
 
2227
            when others =>
2228
               null;
2229
         end case;
2230
      end if;
2231
 
2232
      Analyze (Nam);
2233
      Ent := Entity (Nam);
2234
 
2235
      if Rep_Item_Too_Early (Ent, N) then
2236
         return;
2237
      end if;
2238
 
2239
      --  Rep clause applies to full view of incomplete type or private type if
2240
      --  we have one (if not, this is a premature use of the type). However,
2241
      --  certain semantic checks need to be done on the specified entity (i.e.
2242
      --  the private view), so we save it in Ent.
2243
 
2244
      if Is_Private_Type (Ent)
2245
        and then Is_Derived_Type (Ent)
2246
        and then not Is_Tagged_Type (Ent)
2247
        and then No (Full_View (Ent))
2248
      then
2249
         --  If this is a private type whose completion is a derivation from
2250
         --  another private type, there is no full view, and the attribute
2251
         --  belongs to the type itself, not its underlying parent.
2252
 
2253
         U_Ent := Ent;
2254
 
2255
      elsif Ekind (Ent) = E_Incomplete_Type then
2256
 
2257
         --  The attribute applies to the full view, set the entity of the
2258
         --  attribute definition accordingly.
2259
 
2260
         Ent := Underlying_Type (Ent);
2261
         U_Ent := Ent;
2262
         Set_Entity (Nam, Ent);
2263
 
2264
      else
2265
         U_Ent := Underlying_Type (Ent);
2266
      end if;
2267
 
2268
      --  Avoid cascaded error
2269
 
2270
      if Etype (Nam) = Any_Type then
2271
         return;
2272
 
2273
      --  Must be declared in current scope
2274
 
2275
      elsif Scope (Ent) /= Current_Scope then
2276
         Error_Msg_N ("entity must be declared in this scope", Nam);
2277
         return;
2278
 
2279
      --  Must not be a source renaming (we do have some cases where the
2280
      --  expander generates a renaming, and those cases are OK, in such
2281
      --  cases any attribute applies to the renamed object as well).
2282
 
2283
      elsif Is_Object (Ent)
2284
        and then Present (Renamed_Object (Ent))
2285
      then
2286
         --  Case of renamed object from source, this is an error
2287
 
2288
         if Comes_From_Source (Renamed_Object (Ent)) then
2289
            Get_Name_String (Chars (N));
2290
            Error_Msg_Strlen := Name_Len;
2291
            Error_Msg_String (1 .. Name_Len) := Name_Buffer (1 .. Name_Len);
2292
            Error_Msg_N
2293
              ("~ clause not allowed for a renaming declaration "
2294
               & "(RM 13.1(6))", Nam);
2295
            return;
2296
 
2297
         --  For the case of a compiler generated renaming, the attribute
2298
         --  definition clause applies to the renamed object created by the
2299
         --  expander. The easiest general way to handle this is to create a
2300
         --  copy of the attribute definition clause for this object.
2301
 
2302
         else
2303
            Insert_Action (N,
2304
              Make_Attribute_Definition_Clause (Loc,
2305
                Name       =>
2306
                  New_Occurrence_Of (Entity (Renamed_Object (Ent)), Loc),
2307
                Chars      => Chars (N),
2308
                Expression => Duplicate_Subexpr (Expression (N))));
2309
         end if;
2310
 
2311
      --  If no underlying entity, use entity itself, applies to some
2312
      --  previously detected error cases ???
2313
 
2314
      elsif No (U_Ent) then
2315
         U_Ent := Ent;
2316
 
2317
      --  Cannot specify for a subtype (exception Object/Value_Size)
2318
 
2319
      elsif Is_Type (U_Ent)
2320
        and then not Is_First_Subtype (U_Ent)
2321
        and then Id /= Attribute_Object_Size
2322
        and then Id /= Attribute_Value_Size
2323
        and then not From_At_Mod (N)
2324
      then
2325
         Error_Msg_N ("cannot specify attribute for subtype", Nam);
2326
         return;
2327
      end if;
2328
 
2329
      Set_Entity (N, U_Ent);
2330
 
2331
      --  Switch on particular attribute
2332
 
2333
      case Id is
2334
 
2335
         -------------
2336
         -- Address --
2337
         -------------
2338
 
2339
         --  Address attribute definition clause
2340
 
2341
         when Attribute_Address => Address : begin
2342
 
2343
            --  A little error check, catch for X'Address use X'Address;
2344
 
2345
            if Nkind (Nam) = N_Identifier
2346
              and then Nkind (Expr) = N_Attribute_Reference
2347
              and then Attribute_Name (Expr) = Name_Address
2348
              and then Nkind (Prefix (Expr)) = N_Identifier
2349
              and then Chars (Nam) = Chars (Prefix (Expr))
2350
            then
2351
               Error_Msg_NE
2352
                 ("address for & is self-referencing", Prefix (Expr), Ent);
2353
               return;
2354
            end if;
2355
 
2356
            --  Not that special case, carry on with analysis of expression
2357
 
2358
            Analyze_And_Resolve (Expr, RTE (RE_Address));
2359
 
2360
            --  Even when ignoring rep clauses we need to indicate that the
2361
            --  entity has an address clause and thus it is legal to declare
2362
            --  it imported.
2363
 
2364
            if Ignore_Rep_Clauses then
2365
               if Ekind_In (U_Ent, E_Variable, E_Constant) then
2366
                  Record_Rep_Item (U_Ent, N);
2367
               end if;
2368
 
2369
               return;
2370
            end if;
2371
 
2372
            if Duplicate_Clause then
2373
               null;
2374
 
2375
            --  Case of address clause for subprogram
2376
 
2377
            elsif Is_Subprogram (U_Ent) then
2378
               if Has_Homonym (U_Ent) then
2379
                  Error_Msg_N
2380
                    ("address clause cannot be given " &
2381
                     "for overloaded subprogram",
2382
                     Nam);
2383
                  return;
2384
               end if;
2385
 
2386
               --  For subprograms, all address clauses are permitted, and we
2387
               --  mark the subprogram as having a deferred freeze so that Gigi
2388
               --  will not elaborate it too soon.
2389
 
2390
               --  Above needs more comments, what is too soon about???
2391
 
2392
               Set_Has_Delayed_Freeze (U_Ent);
2393
 
2394
            --  Case of address clause for entry
2395
 
2396
            elsif Ekind (U_Ent) = E_Entry then
2397
               if Nkind (Parent (N)) = N_Task_Body then
2398
                  Error_Msg_N
2399
                    ("entry address must be specified in task spec", Nam);
2400
                  return;
2401
               end if;
2402
 
2403
               --  For entries, we require a constant address
2404
 
2405
               Check_Constant_Address_Clause (Expr, U_Ent);
2406
 
2407
               --  Special checks for task types
2408
 
2409
               if Is_Task_Type (Scope (U_Ent))
2410
                 and then Comes_From_Source (Scope (U_Ent))
2411
               then
2412
                  Error_Msg_N
2413
                    ("?entry address declared for entry in task type", N);
2414
                  Error_Msg_N
2415
                    ("\?only one task can be declared of this type", N);
2416
               end if;
2417
 
2418
               --  Entry address clauses are obsolescent
2419
 
2420
               Check_Restriction (No_Obsolescent_Features, N);
2421
 
2422
               if Warn_On_Obsolescent_Feature then
2423
                  Error_Msg_N
2424
                    ("attaching interrupt to task entry is an " &
2425
                     "obsolescent feature (RM J.7.1)?", N);
2426
                  Error_Msg_N
2427
                    ("\use interrupt procedure instead?", N);
2428
               end if;
2429
 
2430
            --  Case of an address clause for a controlled object which we
2431
            --  consider to be erroneous.
2432
 
2433
            elsif Is_Controlled (Etype (U_Ent))
2434
              or else Has_Controlled_Component (Etype (U_Ent))
2435
            then
2436
               Error_Msg_NE
2437
                 ("?controlled object& must not be overlaid", Nam, U_Ent);
2438
               Error_Msg_N
2439
                 ("\?Program_Error will be raised at run time", Nam);
2440
               Insert_Action (Declaration_Node (U_Ent),
2441
                 Make_Raise_Program_Error (Loc,
2442
                   Reason => PE_Overlaid_Controlled_Object));
2443
               return;
2444
 
2445
            --  Case of address clause for a (non-controlled) object
2446
 
2447
            elsif
2448
              Ekind (U_Ent) = E_Variable
2449
                or else
2450
              Ekind (U_Ent) = E_Constant
2451
            then
2452
               declare
2453
                  Expr  : constant Node_Id := Expression (N);
2454
                  O_Ent : Entity_Id;
2455
                  Off   : Boolean;
2456
 
2457
               begin
2458
                  --  Exported variables cannot have an address clause, because
2459
                  --  this cancels the effect of the pragma Export.
2460
 
2461
                  if Is_Exported (U_Ent) then
2462
                     Error_Msg_N
2463
                       ("cannot export object with address clause", Nam);
2464
                     return;
2465
                  end if;
2466
 
2467
                  Find_Overlaid_Entity (N, O_Ent, Off);
2468
 
2469
                  --  Overlaying controlled objects is erroneous
2470
 
2471
                  if Present (O_Ent)
2472
                    and then (Has_Controlled_Component (Etype (O_Ent))
2473
                                or else Is_Controlled (Etype (O_Ent)))
2474
                  then
2475
                     Error_Msg_N
2476
                       ("?cannot overlay with controlled object", Expr);
2477
                     Error_Msg_N
2478
                       ("\?Program_Error will be raised at run time", Expr);
2479
                     Insert_Action (Declaration_Node (U_Ent),
2480
                       Make_Raise_Program_Error (Loc,
2481
                         Reason => PE_Overlaid_Controlled_Object));
2482
                     return;
2483
 
2484
                  elsif Present (O_Ent)
2485
                    and then Ekind (U_Ent) = E_Constant
2486
                    and then not Is_Constant_Object (O_Ent)
2487
                  then
2488
                     Error_Msg_N ("constant overlays a variable?", Expr);
2489
 
2490
                  --  Imported variables can have an address clause, but then
2491
                  --  the import is pretty meaningless except to suppress
2492
                  --  initializations, so we do not need such variables to
2493
                  --  be statically allocated (and in fact it causes trouble
2494
                  --  if the address clause is a local value).
2495
 
2496
                  elsif Is_Imported (U_Ent) then
2497
                     Set_Is_Statically_Allocated (U_Ent, False);
2498
                  end if;
2499
 
2500
                  --  We mark a possible modification of a variable with an
2501
                  --  address clause, since it is likely aliasing is occurring.
2502
 
2503
                  Note_Possible_Modification (Nam, Sure => False);
2504
 
2505
                  --  Here we are checking for explicit overlap of one variable
2506
                  --  by another, and if we find this then mark the overlapped
2507
                  --  variable as also being volatile to prevent unwanted
2508
                  --  optimizations. This is a significant pessimization so
2509
                  --  avoid it when there is an offset, i.e. when the object
2510
                  --  is composite; they cannot be optimized easily anyway.
2511
 
2512
                  if Present (O_Ent)
2513
                    and then Is_Object (O_Ent)
2514
                    and then not Off
2515
                  then
2516
                     Set_Treat_As_Volatile (O_Ent);
2517
                  end if;
2518
 
2519
                  --  Legality checks on the address clause for initialized
2520
                  --  objects is deferred until the freeze point, because
2521
                  --  a subsequent pragma might indicate that the object is
2522
                  --  imported and thus not initialized.
2523
 
2524
                  Set_Has_Delayed_Freeze (U_Ent);
2525
 
2526
                  --  If an initialization call has been generated for this
2527
                  --  object, it needs to be deferred to after the freeze node
2528
                  --  we have just now added, otherwise GIGI will see a
2529
                  --  reference to the variable (as actual to the IP call)
2530
                  --  before its definition.
2531
 
2532
                  declare
2533
                     Init_Call : constant Node_Id := Find_Init_Call (U_Ent, N);
2534
                  begin
2535
                     if Present (Init_Call) then
2536
                        Remove (Init_Call);
2537
                        Append_Freeze_Action (U_Ent, Init_Call);
2538
                     end if;
2539
                  end;
2540
 
2541
                  if Is_Exported (U_Ent) then
2542
                     Error_Msg_N
2543
                       ("& cannot be exported if an address clause is given",
2544
                        Nam);
2545
                     Error_Msg_N
2546
                       ("\define and export a variable " &
2547
                        "that holds its address instead",
2548
                        Nam);
2549
                  end if;
2550
 
2551
                  --  Entity has delayed freeze, so we will generate an
2552
                  --  alignment check at the freeze point unless suppressed.
2553
 
2554
                  if not Range_Checks_Suppressed (U_Ent)
2555
                    and then not Alignment_Checks_Suppressed (U_Ent)
2556
                  then
2557
                     Set_Check_Address_Alignment (N);
2558
                  end if;
2559
 
2560
                  --  Kill the size check code, since we are not allocating
2561
                  --  the variable, it is somewhere else.
2562
 
2563
                  Kill_Size_Check_Code (U_Ent);
2564
 
2565
                  --  If the address clause is of the form:
2566
 
2567
                  --    for Y'Address use X'Address
2568
 
2569
                  --  or
2570
 
2571
                  --    Const : constant Address := X'Address;
2572
                  --    ...
2573
                  --    for Y'Address use Const;
2574
 
2575
                  --  then we make an entry in the table for checking the size
2576
                  --  and alignment of the overlaying variable. We defer this
2577
                  --  check till after code generation to take full advantage
2578
                  --  of the annotation done by the back end. This entry is
2579
                  --  only made if the address clause comes from source.
2580
 
2581
                  --  If the entity has a generic type, the check will be
2582
                  --  performed in the instance if the actual type justifies
2583
                  --  it, and we do not insert the clause in the table to
2584
                  --  prevent spurious warnings.
2585
 
2586
                  if Address_Clause_Overlay_Warnings
2587
                    and then Comes_From_Source (N)
2588
                    and then Present (O_Ent)
2589
                    and then Is_Object (O_Ent)
2590
                  then
2591
                     if not Is_Generic_Type (Etype (U_Ent)) then
2592
                        Address_Clause_Checks.Append ((N, U_Ent, O_Ent, Off));
2593
                     end if;
2594
 
2595
                     --  If variable overlays a constant view, and we are
2596
                     --  warning on overlays, then mark the variable as
2597
                     --  overlaying a constant (we will give warnings later
2598
                     --  if this variable is assigned).
2599
 
2600
                     if Is_Constant_Object (O_Ent)
2601
                       and then Ekind (U_Ent) = E_Variable
2602
                     then
2603
                        Set_Overlays_Constant (U_Ent);
2604
                     end if;
2605
                  end if;
2606
               end;
2607
 
2608
            --  Not a valid entity for an address clause
2609
 
2610
            else
2611
               Error_Msg_N ("address cannot be given for &", Nam);
2612
            end if;
2613
         end Address;
2614
 
2615
         ---------------
2616
         -- Alignment --
2617
         ---------------
2618
 
2619
         --  Alignment attribute definition clause
2620
 
2621
         when Attribute_Alignment => Alignment : declare
2622
            Align     : constant Uint := Get_Alignment_Value (Expr);
2623
            Max_Align : constant Uint := UI_From_Int (Maximum_Alignment);
2624
 
2625
         begin
2626
            FOnly := True;
2627
 
2628
            if not Is_Type (U_Ent)
2629
              and then Ekind (U_Ent) /= E_Variable
2630
              and then Ekind (U_Ent) /= E_Constant
2631
            then
2632
               Error_Msg_N ("alignment cannot be given for &", Nam);
2633
 
2634
            elsif Duplicate_Clause then
2635
               null;
2636
 
2637
            elsif Align /= No_Uint then
2638
               Set_Has_Alignment_Clause (U_Ent);
2639
 
2640
               --  Tagged type case, check for attempt to set alignment to a
2641
               --  value greater than Max_Align, and reset if so.
2642
 
2643
               if Is_Tagged_Type (U_Ent) and then Align > Max_Align then
2644
                  Error_Msg_N
2645
                    ("?alignment for & set to Maximum_Aligment", Nam);
2646
                     Set_Alignment (U_Ent, Max_Align);
2647
 
2648
               --  All other cases
2649
 
2650
               else
2651
                  Set_Alignment (U_Ent, Align);
2652
               end if;
2653
 
2654
               --  For an array type, U_Ent is the first subtype. In that case,
2655
               --  also set the alignment of the anonymous base type so that
2656
               --  other subtypes (such as the itypes for aggregates of the
2657
               --  type) also receive the expected alignment.
2658
 
2659
               if Is_Array_Type (U_Ent) then
2660
                  Set_Alignment (Base_Type (U_Ent), Align);
2661
               end if;
2662
            end if;
2663
         end Alignment;
2664
 
2665
         ---------------
2666
         -- Bit_Order --
2667
         ---------------
2668
 
2669
         --  Bit_Order attribute definition clause
2670
 
2671
         when Attribute_Bit_Order => Bit_Order : declare
2672
         begin
2673
            if not Is_Record_Type (U_Ent) then
2674
               Error_Msg_N
2675
                 ("Bit_Order can only be defined for record type", Nam);
2676
 
2677
            elsif Duplicate_Clause then
2678
               null;
2679
 
2680
            else
2681
               Analyze_And_Resolve (Expr, RTE (RE_Bit_Order));
2682
 
2683
               if Etype (Expr) = Any_Type then
2684
                  return;
2685
 
2686
               elsif not Is_Static_Expression (Expr) then
2687
                  Flag_Non_Static_Expr
2688
                    ("Bit_Order requires static expression!", Expr);
2689
 
2690
               else
2691
                  if (Expr_Value (Expr) = 0) /= Bytes_Big_Endian then
2692
                     Set_Reverse_Bit_Order (U_Ent, True);
2693
                  end if;
2694
               end if;
2695
            end if;
2696
         end Bit_Order;
2697
 
2698
         --------------------
2699
         -- Component_Size --
2700
         --------------------
2701
 
2702
         --  Component_Size attribute definition clause
2703
 
2704
         when Attribute_Component_Size => Component_Size_Case : declare
2705
            Csize    : constant Uint := Static_Integer (Expr);
2706
            Ctyp     : Entity_Id;
2707
            Btype    : Entity_Id;
2708
            Biased   : Boolean;
2709
            New_Ctyp : Entity_Id;
2710
            Decl     : Node_Id;
2711
 
2712
         begin
2713
            if not Is_Array_Type (U_Ent) then
2714
               Error_Msg_N ("component size requires array type", Nam);
2715
               return;
2716
            end if;
2717
 
2718
            Btype := Base_Type (U_Ent);
2719
            Ctyp := Component_Type (Btype);
2720
 
2721
            if Duplicate_Clause then
2722
               null;
2723
 
2724
            elsif Rep_Item_Too_Early (Btype, N) then
2725
               null;
2726
 
2727
            elsif Csize /= No_Uint then
2728
               Check_Size (Expr, Ctyp, Csize, Biased);
2729
 
2730
               --  For the biased case, build a declaration for a subtype that
2731
               --  will be used to represent the biased subtype that reflects
2732
               --  the biased representation of components. We need the subtype
2733
               --  to get proper conversions on referencing elements of the
2734
               --  array. Note: component size clauses are ignored in VM mode.
2735
 
2736
               if VM_Target = No_VM then
2737
                  if Biased then
2738
                     New_Ctyp :=
2739
                       Make_Defining_Identifier (Loc,
2740
                         Chars =>
2741
                           New_External_Name (Chars (U_Ent), 'C', 0, 'T'));
2742
 
2743
                     Decl :=
2744
                       Make_Subtype_Declaration (Loc,
2745
                         Defining_Identifier => New_Ctyp,
2746
                         Subtype_Indication  =>
2747
                           New_Occurrence_Of (Component_Type (Btype), Loc));
2748
 
2749
                     Set_Parent (Decl, N);
2750
                     Analyze (Decl, Suppress => All_Checks);
2751
 
2752
                     Set_Has_Delayed_Freeze        (New_Ctyp, False);
2753
                     Set_Esize                     (New_Ctyp, Csize);
2754
                     Set_RM_Size                   (New_Ctyp, Csize);
2755
                     Init_Alignment                (New_Ctyp);
2756
                     Set_Is_Itype                  (New_Ctyp, True);
2757
                     Set_Associated_Node_For_Itype (New_Ctyp, U_Ent);
2758
 
2759
                     Set_Component_Type (Btype, New_Ctyp);
2760
                     Set_Biased (New_Ctyp, N, "component size clause");
2761
                  end if;
2762
 
2763
                  Set_Component_Size (Btype, Csize);
2764
 
2765
               --  For VM case, we ignore component size clauses
2766
 
2767
               else
2768
                  --  Give a warning unless we are in GNAT mode, in which case
2769
                  --  the warning is suppressed since it is not useful.
2770
 
2771
                  if not GNAT_Mode then
2772
                     Error_Msg_N
2773
                       ("?component size ignored in this configuration", N);
2774
                  end if;
2775
               end if;
2776
 
2777
               --  Deal with warning on overridden size
2778
 
2779
               if Warn_On_Overridden_Size
2780
                 and then Has_Size_Clause (Ctyp)
2781
                 and then RM_Size (Ctyp) /= Csize
2782
               then
2783
                  Error_Msg_NE
2784
                    ("?component size overrides size clause for&",
2785
                     N, Ctyp);
2786
               end if;
2787
 
2788
               Set_Has_Component_Size_Clause (Btype, True);
2789
               Set_Has_Non_Standard_Rep (Btype, True);
2790
            end if;
2791
         end Component_Size_Case;
2792
 
2793
         -----------------------
2794
         -- Constant_Indexing --
2795
         -----------------------
2796
 
2797
         when Attribute_Constant_Indexing =>
2798
            Check_Indexing_Functions;
2799
 
2800
         ----------------------
2801
         -- Default_Iterator --
2802
         ----------------------
2803
 
2804
         when Attribute_Default_Iterator =>  Default_Iterator : declare
2805
            Func : Entity_Id;
2806
 
2807
         begin
2808
            if not Is_Tagged_Type (U_Ent) then
2809
               Error_Msg_N
2810
                 ("aspect Default_Iterator applies to  tagged type", Nam);
2811
            end if;
2812
 
2813
            Check_Iterator_Functions;
2814
 
2815
            Analyze (Expr);
2816
 
2817
            if not Is_Entity_Name (Expr)
2818
              or else Ekind (Entity (Expr)) /= E_Function
2819
            then
2820
               Error_Msg_N ("aspect Iterator must be a function", Expr);
2821
            else
2822
               Func := Entity (Expr);
2823
            end if;
2824
 
2825
            if No (First_Formal (Func))
2826
              or else Etype (First_Formal (Func)) /= U_Ent
2827
            then
2828
               Error_Msg_NE
2829
                 ("Default Iterator must be a primitive of&", Func, U_Ent);
2830
            end if;
2831
         end Default_Iterator;
2832
 
2833
         ------------------
2834
         -- External_Tag --
2835
         ------------------
2836
 
2837
         when Attribute_External_Tag => External_Tag :
2838
         begin
2839
            if not Is_Tagged_Type (U_Ent) then
2840
               Error_Msg_N ("should be a tagged type", Nam);
2841
            end if;
2842
 
2843
            if Duplicate_Clause then
2844
               null;
2845
 
2846
            else
2847
               Analyze_And_Resolve (Expr, Standard_String);
2848
 
2849
               if not Is_Static_Expression (Expr) then
2850
                  Flag_Non_Static_Expr
2851
                    ("static string required for tag name!", Nam);
2852
               end if;
2853
 
2854
               if VM_Target = No_VM then
2855
                  Set_Has_External_Tag_Rep_Clause (U_Ent);
2856
               else
2857
                  Error_Msg_Name_1 := Attr;
2858
                  Error_Msg_N
2859
                    ("% attribute unsupported in this configuration", Nam);
2860
               end if;
2861
 
2862
               if not Is_Library_Level_Entity (U_Ent) then
2863
                  Error_Msg_NE
2864
                    ("?non-unique external tag supplied for &", N, U_Ent);
2865
                  Error_Msg_N
2866
                    ("?\same external tag applies to all subprogram calls", N);
2867
                  Error_Msg_N
2868
                    ("?\corresponding internal tag cannot be obtained", N);
2869
               end if;
2870
            end if;
2871
         end External_Tag;
2872
 
2873
         --------------------------
2874
         -- Implicit_Dereference --
2875
         --------------------------
2876
 
2877
         when Attribute_Implicit_Dereference =>
2878
 
2879
            --  Legality checks already performed at the point of
2880
            --  the type declaration, aspect is not delayed.
2881
 
2882
            null;
2883
 
2884
         -----------
2885
         -- Input --
2886
         -----------
2887
 
2888
         when Attribute_Input =>
2889
            Analyze_Stream_TSS_Definition (TSS_Stream_Input);
2890
            Set_Has_Specified_Stream_Input (Ent);
2891
 
2892
         ----------------------
2893
         -- Iterator_Element --
2894
         ----------------------
2895
 
2896
         when Attribute_Iterator_Element =>
2897
            Analyze (Expr);
2898
 
2899
            if not Is_Entity_Name (Expr)
2900
              or else not Is_Type (Entity (Expr))
2901
            then
2902
               Error_Msg_N ("aspect Iterator_Element must be a type", Expr);
2903
            end if;
2904
 
2905
         -------------------
2906
         -- Machine_Radix --
2907
         -------------------
2908
 
2909
         --  Machine radix attribute definition clause
2910
 
2911
         when Attribute_Machine_Radix => Machine_Radix : declare
2912
            Radix : constant Uint := Static_Integer (Expr);
2913
 
2914
         begin
2915
            if not Is_Decimal_Fixed_Point_Type (U_Ent) then
2916
               Error_Msg_N ("decimal fixed-point type expected for &", Nam);
2917
 
2918
            elsif Duplicate_Clause then
2919
               null;
2920
 
2921
            elsif Radix /= No_Uint then
2922
               Set_Has_Machine_Radix_Clause (U_Ent);
2923
               Set_Has_Non_Standard_Rep (Base_Type (U_Ent));
2924
 
2925
               if Radix = 2 then
2926
                  null;
2927
               elsif Radix = 10 then
2928
                  Set_Machine_Radix_10 (U_Ent);
2929
               else
2930
                  Error_Msg_N ("machine radix value must be 2 or 10", Expr);
2931
               end if;
2932
            end if;
2933
         end Machine_Radix;
2934
 
2935
         -----------------
2936
         -- Object_Size --
2937
         -----------------
2938
 
2939
         --  Object_Size attribute definition clause
2940
 
2941
         when Attribute_Object_Size => Object_Size : declare
2942
            Size : constant Uint := Static_Integer (Expr);
2943
 
2944
            Biased : Boolean;
2945
            pragma Warnings (Off, Biased);
2946
 
2947
         begin
2948
            if not Is_Type (U_Ent) then
2949
               Error_Msg_N ("Object_Size cannot be given for &", Nam);
2950
 
2951
            elsif Duplicate_Clause then
2952
               null;
2953
 
2954
            else
2955
               Check_Size (Expr, U_Ent, Size, Biased);
2956
 
2957
               if Size /= 8
2958
                    and then
2959
                  Size /= 16
2960
                    and then
2961
                  Size /= 32
2962
                    and then
2963
                  UI_Mod (Size, 64) /= 0
2964
               then
2965
                  Error_Msg_N
2966
                    ("Object_Size must be 8, 16, 32, or multiple of 64",
2967
                     Expr);
2968
               end if;
2969
 
2970
               Set_Esize (U_Ent, Size);
2971
               Set_Has_Object_Size_Clause (U_Ent);
2972
               Alignment_Check_For_Size_Change (U_Ent, Size);
2973
            end if;
2974
         end Object_Size;
2975
 
2976
         ------------
2977
         -- Output --
2978
         ------------
2979
 
2980
         when Attribute_Output =>
2981
            Analyze_Stream_TSS_Definition (TSS_Stream_Output);
2982
            Set_Has_Specified_Stream_Output (Ent);
2983
 
2984
         ----------
2985
         -- Read --
2986
         ----------
2987
 
2988
         when Attribute_Read =>
2989
            Analyze_Stream_TSS_Definition (TSS_Stream_Read);
2990
            Set_Has_Specified_Stream_Read (Ent);
2991
 
2992
         ----------
2993
         -- Size --
2994
         ----------
2995
 
2996
         --  Size attribute definition clause
2997
 
2998
         when Attribute_Size => Size : declare
2999
            Size   : constant Uint := Static_Integer (Expr);
3000
            Etyp   : Entity_Id;
3001
            Biased : Boolean;
3002
 
3003
         begin
3004
            FOnly := True;
3005
 
3006
            if Duplicate_Clause then
3007
               null;
3008
 
3009
            elsif not Is_Type (U_Ent)
3010
              and then Ekind (U_Ent) /= E_Variable
3011
              and then Ekind (U_Ent) /= E_Constant
3012
            then
3013
               Error_Msg_N ("size cannot be given for &", Nam);
3014
 
3015
            elsif Is_Array_Type (U_Ent)
3016
              and then not Is_Constrained (U_Ent)
3017
            then
3018
               Error_Msg_N
3019
                 ("size cannot be given for unconstrained array", Nam);
3020
 
3021
            elsif Size /= No_Uint then
3022
               if VM_Target /= No_VM and then not GNAT_Mode then
3023
 
3024
                  --  Size clause is not handled properly on VM targets.
3025
                  --  Display a warning unless we are in GNAT mode, in which
3026
                  --  case this is useless.
3027
 
3028
                  Error_Msg_N
3029
                    ("?size clauses are ignored in this configuration", N);
3030
               end if;
3031
 
3032
               if Is_Type (U_Ent) then
3033
                  Etyp := U_Ent;
3034
               else
3035
                  Etyp := Etype (U_Ent);
3036
               end if;
3037
 
3038
               --  Check size, note that Gigi is in charge of checking that the
3039
               --  size of an array or record type is OK. Also we do not check
3040
               --  the size in the ordinary fixed-point case, since it is too
3041
               --  early to do so (there may be subsequent small clause that
3042
               --  affects the size). We can check the size if a small clause
3043
               --  has already been given.
3044
 
3045
               if not Is_Ordinary_Fixed_Point_Type (U_Ent)
3046
                 or else Has_Small_Clause (U_Ent)
3047
               then
3048
                  Check_Size (Expr, Etyp, Size, Biased);
3049
                  Set_Biased (U_Ent, N, "size clause", Biased);
3050
               end if;
3051
 
3052
               --  For types set RM_Size and Esize if possible
3053
 
3054
               if Is_Type (U_Ent) then
3055
                  Set_RM_Size (U_Ent, Size);
3056
 
3057
                  --  For elementary types, increase Object_Size to power of 2,
3058
                  --  but not less than a storage unit in any case (normally
3059
                  --  this means it will be byte addressable).
3060
 
3061
                  --  For all other types, nothing else to do, we leave Esize
3062
                  --  (object size) unset, the back end will set it from the
3063
                  --  size and alignment in an appropriate manner.
3064
 
3065
                  --  In both cases, we check whether the alignment must be
3066
                  --  reset in the wake of the size change.
3067
 
3068
                  if Is_Elementary_Type (U_Ent) then
3069
                     if Size <= System_Storage_Unit then
3070
                        Init_Esize (U_Ent, System_Storage_Unit);
3071
                     elsif Size <= 16 then
3072
                        Init_Esize (U_Ent, 16);
3073
                     elsif Size <= 32 then
3074
                        Init_Esize (U_Ent, 32);
3075
                     else
3076
                        Set_Esize  (U_Ent, (Size + 63) / 64 * 64);
3077
                     end if;
3078
 
3079
                     Alignment_Check_For_Size_Change (U_Ent, Esize (U_Ent));
3080
                  else
3081
                     Alignment_Check_For_Size_Change (U_Ent, Size);
3082
                  end if;
3083
 
3084
               --  For objects, set Esize only
3085
 
3086
               else
3087
                  if Is_Elementary_Type (Etyp) then
3088
                     if Size /= System_Storage_Unit
3089
                          and then
3090
                        Size /= System_Storage_Unit * 2
3091
                          and then
3092
                        Size /= System_Storage_Unit * 4
3093
                           and then
3094
                        Size /= System_Storage_Unit * 8
3095
                     then
3096
                        Error_Msg_Uint_1 := UI_From_Int (System_Storage_Unit);
3097
                        Error_Msg_Uint_2 := Error_Msg_Uint_1 * 8;
3098
                        Error_Msg_N
3099
                          ("size for primitive object must be a power of 2"
3100
                            & " in the range ^-^", N);
3101
                     end if;
3102
                  end if;
3103
 
3104
                  Set_Esize (U_Ent, Size);
3105
               end if;
3106
 
3107
               Set_Has_Size_Clause (U_Ent);
3108
            end if;
3109
         end Size;
3110
 
3111
         -----------
3112
         -- Small --
3113
         -----------
3114
 
3115
         --  Small attribute definition clause
3116
 
3117
         when Attribute_Small => Small : declare
3118
            Implicit_Base : constant Entity_Id := Base_Type (U_Ent);
3119
            Small         : Ureal;
3120
 
3121
         begin
3122
            Analyze_And_Resolve (Expr, Any_Real);
3123
 
3124
            if Etype (Expr) = Any_Type then
3125
               return;
3126
 
3127
            elsif not Is_Static_Expression (Expr) then
3128
               Flag_Non_Static_Expr
3129
                 ("small requires static expression!", Expr);
3130
               return;
3131
 
3132
            else
3133
               Small := Expr_Value_R (Expr);
3134
 
3135
               if Small <= Ureal_0 then
3136
                  Error_Msg_N ("small value must be greater than zero", Expr);
3137
                  return;
3138
               end if;
3139
 
3140
            end if;
3141
 
3142
            if not Is_Ordinary_Fixed_Point_Type (U_Ent) then
3143
               Error_Msg_N
3144
                 ("small requires an ordinary fixed point type", Nam);
3145
 
3146
            elsif Has_Small_Clause (U_Ent) then
3147
               Error_Msg_N ("small already given for &", Nam);
3148
 
3149
            elsif Small > Delta_Value (U_Ent) then
3150
               Error_Msg_N
3151
                 ("small value must not be greater then delta value", Nam);
3152
 
3153
            else
3154
               Set_Small_Value (U_Ent, Small);
3155
               Set_Small_Value (Implicit_Base, Small);
3156
               Set_Has_Small_Clause (U_Ent);
3157
               Set_Has_Small_Clause (Implicit_Base);
3158
               Set_Has_Non_Standard_Rep (Implicit_Base);
3159
            end if;
3160
         end Small;
3161
 
3162
         ------------------
3163
         -- Storage_Pool --
3164
         ------------------
3165
 
3166
         --  Storage_Pool attribute definition clause
3167
 
3168
         when Attribute_Storage_Pool | Attribute_Simple_Storage_Pool => declare
3169
            Pool : Entity_Id;
3170
            T    : Entity_Id;
3171
 
3172
         begin
3173
            if Ekind (U_Ent) = E_Access_Subprogram_Type then
3174
               Error_Msg_N
3175
                 ("storage pool cannot be given for access-to-subprogram type",
3176
                  Nam);
3177
               return;
3178
 
3179
            elsif not
3180
              Ekind_In (U_Ent, E_Access_Type, E_General_Access_Type)
3181
            then
3182
               Error_Msg_N
3183
                 ("storage pool can only be given for access types", Nam);
3184
               return;
3185
 
3186
            elsif Is_Derived_Type (U_Ent) then
3187
               Error_Msg_N
3188
                 ("storage pool cannot be given for a derived access type",
3189
                  Nam);
3190
 
3191
            elsif Duplicate_Clause then
3192
               return;
3193
 
3194
            elsif Present (Associated_Storage_Pool (U_Ent)) then
3195
               Error_Msg_N ("storage pool already given for &", Nam);
3196
               return;
3197
            end if;
3198
 
3199
            if Id = Attribute_Storage_Pool then
3200
               Analyze_And_Resolve
3201
                 (Expr, Class_Wide_Type (RTE (RE_Root_Storage_Pool)));
3202
 
3203
            --  In the Simple_Storage_Pool case, we allow a variable of any
3204
            --  simple storage pool type, so we Resolve without imposing an
3205
            --  expected type.
3206
 
3207
            else
3208
               Analyze_And_Resolve (Expr);
3209
 
3210
               if not Present (Get_Rep_Pragma
3211
                                 (Etype (Expr), Name_Simple_Storage_Pool_Type))
3212
               then
3213
                  Error_Msg_N
3214
                    ("expression must be of a simple storage pool type", Expr);
3215
               end if;
3216
            end if;
3217
 
3218
            if not Denotes_Variable (Expr) then
3219
               Error_Msg_N ("storage pool must be a variable", Expr);
3220
               return;
3221
            end if;
3222
 
3223
            if Nkind (Expr) = N_Type_Conversion then
3224
               T := Etype (Expression (Expr));
3225
            else
3226
               T := Etype (Expr);
3227
            end if;
3228
 
3229
            --  The Stack_Bounded_Pool is used internally for implementing
3230
            --  access types with a Storage_Size. Since it only work properly
3231
            --  when used on one specific type, we need to check that it is not
3232
            --  hijacked improperly:
3233
 
3234
            --    type T is access Integer;
3235
            --    for T'Storage_Size use n;
3236
            --    type Q is access Float;
3237
            --    for Q'Storage_Size use T'Storage_Size; -- incorrect
3238
 
3239
            if RTE_Available (RE_Stack_Bounded_Pool)
3240
              and then Base_Type (T) = RTE (RE_Stack_Bounded_Pool)
3241
            then
3242
               Error_Msg_N ("non-shareable internal Pool", Expr);
3243
               return;
3244
            end if;
3245
 
3246
            --  If the argument is a name that is not an entity name, then
3247
            --  we construct a renaming operation to define an entity of
3248
            --  type storage pool.
3249
 
3250
            if not Is_Entity_Name (Expr)
3251
              and then Is_Object_Reference (Expr)
3252
            then
3253
               Pool := Make_Temporary (Loc, 'P', Expr);
3254
 
3255
               declare
3256
                  Rnode : constant Node_Id :=
3257
                            Make_Object_Renaming_Declaration (Loc,
3258
                              Defining_Identifier => Pool,
3259
                              Subtype_Mark        =>
3260
                                New_Occurrence_Of (Etype (Expr), Loc),
3261
                              Name                => Expr);
3262
 
3263
               begin
3264
                  Insert_Before (N, Rnode);
3265
                  Analyze (Rnode);
3266
                  Set_Associated_Storage_Pool (U_Ent, Pool);
3267
               end;
3268
 
3269
            elsif Is_Entity_Name (Expr) then
3270
               Pool := Entity (Expr);
3271
 
3272
               --  If pool is a renamed object, get original one. This can
3273
               --  happen with an explicit renaming, and within instances.
3274
 
3275
               while Present (Renamed_Object (Pool))
3276
                 and then Is_Entity_Name (Renamed_Object (Pool))
3277
               loop
3278
                  Pool := Entity (Renamed_Object (Pool));
3279
               end loop;
3280
 
3281
               if Present (Renamed_Object (Pool))
3282
                 and then Nkind (Renamed_Object (Pool)) = N_Type_Conversion
3283
                 and then Is_Entity_Name (Expression (Renamed_Object (Pool)))
3284
               then
3285
                  Pool := Entity (Expression (Renamed_Object (Pool)));
3286
               end if;
3287
 
3288
               Set_Associated_Storage_Pool (U_Ent, Pool);
3289
 
3290
            elsif Nkind (Expr) = N_Type_Conversion
3291
              and then Is_Entity_Name (Expression (Expr))
3292
              and then Nkind (Original_Node (Expr)) = N_Attribute_Reference
3293
            then
3294
               Pool := Entity (Expression (Expr));
3295
               Set_Associated_Storage_Pool (U_Ent, Pool);
3296
 
3297
            else
3298
               Error_Msg_N ("incorrect reference to a Storage Pool", Expr);
3299
               return;
3300
            end if;
3301
         end;
3302
 
3303
         ------------------
3304
         -- Storage_Size --
3305
         ------------------
3306
 
3307
         --  Storage_Size attribute definition clause
3308
 
3309
         when Attribute_Storage_Size => Storage_Size : declare
3310
            Btype : constant Entity_Id := Base_Type (U_Ent);
3311
            Sprag : Node_Id;
3312
 
3313
         begin
3314
            if Is_Task_Type (U_Ent) then
3315
               Check_Restriction (No_Obsolescent_Features, N);
3316
 
3317
               if Warn_On_Obsolescent_Feature then
3318
                  Error_Msg_N
3319
                    ("storage size clause for task is an " &
3320
                     "obsolescent feature (RM J.9)?", N);
3321
                  Error_Msg_N ("\use Storage_Size pragma instead?", N);
3322
               end if;
3323
 
3324
               FOnly := True;
3325
            end if;
3326
 
3327
            if not Is_Access_Type (U_Ent)
3328
              and then Ekind (U_Ent) /= E_Task_Type
3329
            then
3330
               Error_Msg_N ("storage size cannot be given for &", Nam);
3331
 
3332
            elsif Is_Access_Type (U_Ent) and Is_Derived_Type (U_Ent) then
3333
               Error_Msg_N
3334
                 ("storage size cannot be given for a derived access type",
3335
                  Nam);
3336
 
3337
            elsif Duplicate_Clause then
3338
               null;
3339
 
3340
            else
3341
               Analyze_And_Resolve (Expr, Any_Integer);
3342
 
3343
               if Is_Access_Type (U_Ent) then
3344
                  if Present (Associated_Storage_Pool (U_Ent)) then
3345
                     Error_Msg_N ("storage pool already given for &", Nam);
3346
                     return;
3347
                  end if;
3348
 
3349
                  if Is_OK_Static_Expression (Expr)
3350
                    and then Expr_Value (Expr) = 0
3351
                  then
3352
                     Set_No_Pool_Assigned (Btype);
3353
                  end if;
3354
 
3355
               else -- Is_Task_Type (U_Ent)
3356
                  Sprag := Get_Rep_Pragma (Btype, Name_Storage_Size);
3357
 
3358
                  if Present (Sprag) then
3359
                     Error_Msg_Sloc := Sloc (Sprag);
3360
                     Error_Msg_N
3361
                       ("Storage_Size already specified#", Nam);
3362
                     return;
3363
                  end if;
3364
               end if;
3365
 
3366
               Set_Has_Storage_Size_Clause (Btype);
3367
            end if;
3368
         end Storage_Size;
3369
 
3370
         -----------------
3371
         -- Stream_Size --
3372
         -----------------
3373
 
3374
         when Attribute_Stream_Size => Stream_Size : declare
3375
            Size : constant Uint := Static_Integer (Expr);
3376
 
3377
         begin
3378
            if Ada_Version <= Ada_95 then
3379
               Check_Restriction (No_Implementation_Attributes, N);
3380
            end if;
3381
 
3382
            if Duplicate_Clause then
3383
               null;
3384
 
3385
            elsif Is_Elementary_Type (U_Ent) then
3386
               if Size /= System_Storage_Unit
3387
                    and then
3388
                  Size /= System_Storage_Unit * 2
3389
                    and then
3390
                  Size /= System_Storage_Unit * 4
3391
                     and then
3392
                  Size /= System_Storage_Unit * 8
3393
               then
3394
                  Error_Msg_Uint_1 := UI_From_Int (System_Storage_Unit);
3395
                  Error_Msg_N
3396
                    ("stream size for elementary type must be a"
3397
                       & " power of 2 and at least ^", N);
3398
 
3399
               elsif RM_Size (U_Ent) > Size then
3400
                  Error_Msg_Uint_1 := RM_Size (U_Ent);
3401
                  Error_Msg_N
3402
                    ("stream size for elementary type must be a"
3403
                       & " power of 2 and at least ^", N);
3404
               end if;
3405
 
3406
               Set_Has_Stream_Size_Clause (U_Ent);
3407
 
3408
            else
3409
               Error_Msg_N ("Stream_Size cannot be given for &", Nam);
3410
            end if;
3411
         end Stream_Size;
3412
 
3413
         ----------------
3414
         -- Value_Size --
3415
         ----------------
3416
 
3417
         --  Value_Size attribute definition clause
3418
 
3419
         when Attribute_Value_Size => Value_Size : declare
3420
            Size   : constant Uint := Static_Integer (Expr);
3421
            Biased : Boolean;
3422
 
3423
         begin
3424
            if not Is_Type (U_Ent) then
3425
               Error_Msg_N ("Value_Size cannot be given for &", Nam);
3426
 
3427
            elsif Duplicate_Clause then
3428
               null;
3429
 
3430
            elsif Is_Array_Type (U_Ent)
3431
              and then not Is_Constrained (U_Ent)
3432
            then
3433
               Error_Msg_N
3434
                 ("Value_Size cannot be given for unconstrained array", Nam);
3435
 
3436
            else
3437
               if Is_Elementary_Type (U_Ent) then
3438
                  Check_Size (Expr, U_Ent, Size, Biased);
3439
                  Set_Biased (U_Ent, N, "value size clause", Biased);
3440
               end if;
3441
 
3442
               Set_RM_Size (U_Ent, Size);
3443
            end if;
3444
         end Value_Size;
3445
 
3446
         -----------------------
3447
         -- Variable_Indexing --
3448
         -----------------------
3449
 
3450
         when Attribute_Variable_Indexing =>
3451
            Check_Indexing_Functions;
3452
 
3453
         -----------
3454
         -- Write --
3455
         -----------
3456
 
3457
         when Attribute_Write =>
3458
            Analyze_Stream_TSS_Definition (TSS_Stream_Write);
3459
            Set_Has_Specified_Stream_Write (Ent);
3460
 
3461
         --  All other attributes cannot be set
3462
 
3463
         when others =>
3464
            Error_Msg_N
3465
              ("attribute& cannot be set with definition clause", N);
3466
      end case;
3467
 
3468
      --  The test for the type being frozen must be performed after any
3469
      --  expression the clause has been analyzed since the expression itself
3470
      --  might cause freezing that makes the clause illegal.
3471
 
3472
      if Rep_Item_Too_Late (U_Ent, N, FOnly) then
3473
         return;
3474
      end if;
3475
   end Analyze_Attribute_Definition_Clause;
3476
 
3477
   ----------------------------
3478
   -- Analyze_Code_Statement --
3479
   ----------------------------
3480
 
3481
   procedure Analyze_Code_Statement (N : Node_Id) is
3482
      HSS   : constant Node_Id   := Parent (N);
3483
      SBody : constant Node_Id   := Parent (HSS);
3484
      Subp  : constant Entity_Id := Current_Scope;
3485
      Stmt  : Node_Id;
3486
      Decl  : Node_Id;
3487
      StmtO : Node_Id;
3488
      DeclO : Node_Id;
3489
 
3490
   begin
3491
      --  Analyze and check we get right type, note that this implements the
3492
      --  requirement (RM 13.8(1)) that Machine_Code be with'ed, since that
3493
      --  is the only way that Asm_Insn could possibly be visible.
3494
 
3495
      Analyze_And_Resolve (Expression (N));
3496
 
3497
      if Etype (Expression (N)) = Any_Type then
3498
         return;
3499
      elsif Etype (Expression (N)) /= RTE (RE_Asm_Insn) then
3500
         Error_Msg_N ("incorrect type for code statement", N);
3501
         return;
3502
      end if;
3503
 
3504
      Check_Code_Statement (N);
3505
 
3506
      --  Make sure we appear in the handled statement sequence of a
3507
      --  subprogram (RM 13.8(3)).
3508
 
3509
      if Nkind (HSS) /= N_Handled_Sequence_Of_Statements
3510
        or else Nkind (SBody) /= N_Subprogram_Body
3511
      then
3512
         Error_Msg_N
3513
           ("code statement can only appear in body of subprogram", N);
3514
         return;
3515
      end if;
3516
 
3517
      --  Do remaining checks (RM 13.8(3)) if not already done
3518
 
3519
      if not Is_Machine_Code_Subprogram (Subp) then
3520
         Set_Is_Machine_Code_Subprogram (Subp);
3521
 
3522
         --  No exception handlers allowed
3523
 
3524
         if Present (Exception_Handlers (HSS)) then
3525
            Error_Msg_N
3526
              ("exception handlers not permitted in machine code subprogram",
3527
               First (Exception_Handlers (HSS)));
3528
         end if;
3529
 
3530
         --  No declarations other than use clauses and pragmas (we allow
3531
         --  certain internally generated declarations as well).
3532
 
3533
         Decl := First (Declarations (SBody));
3534
         while Present (Decl) loop
3535
            DeclO := Original_Node (Decl);
3536
            if Comes_From_Source (DeclO)
3537
              and not Nkind_In (DeclO, N_Pragma,
3538
                                       N_Use_Package_Clause,
3539
                                       N_Use_Type_Clause,
3540
                                       N_Implicit_Label_Declaration)
3541
            then
3542
               Error_Msg_N
3543
                 ("this declaration not allowed in machine code subprogram",
3544
                  DeclO);
3545
            end if;
3546
 
3547
            Next (Decl);
3548
         end loop;
3549
 
3550
         --  No statements other than code statements, pragmas, and labels.
3551
         --  Again we allow certain internally generated statements.
3552
 
3553
         --  In Ada 2012, qualified expressions are names, and the code
3554
         --  statement is initially parsed as a procedure call.
3555
 
3556
         Stmt := First (Statements (HSS));
3557
         while Present (Stmt) loop
3558
            StmtO := Original_Node (Stmt);
3559
 
3560
            --  A procedure call transformed into a code statement is OK.
3561
 
3562
            if Ada_Version >= Ada_2012
3563
              and then Nkind (StmtO) = N_Procedure_Call_Statement
3564
              and then Nkind (Name (StmtO)) = N_Qualified_Expression
3565
            then
3566
               null;
3567
 
3568
            elsif Comes_From_Source (StmtO)
3569
              and then not Nkind_In (StmtO, N_Pragma,
3570
                                            N_Label,
3571
                                            N_Code_Statement)
3572
            then
3573
               Error_Msg_N
3574
                 ("this statement is not allowed in machine code subprogram",
3575
                  StmtO);
3576
            end if;
3577
 
3578
            Next (Stmt);
3579
         end loop;
3580
      end if;
3581
   end Analyze_Code_Statement;
3582
 
3583
   -----------------------------------------------
3584
   -- Analyze_Enumeration_Representation_Clause --
3585
   -----------------------------------------------
3586
 
3587
   procedure Analyze_Enumeration_Representation_Clause (N : Node_Id) is
3588
      Ident    : constant Node_Id    := Identifier (N);
3589
      Aggr     : constant Node_Id    := Array_Aggregate (N);
3590
      Enumtype : Entity_Id;
3591
      Elit     : Entity_Id;
3592
      Expr     : Node_Id;
3593
      Assoc    : Node_Id;
3594
      Choice   : Node_Id;
3595
      Val      : Uint;
3596
 
3597
      Err : Boolean := False;
3598
      --  Set True to avoid cascade errors and crashes on incorrect source code
3599
 
3600
      Lo : constant Uint := Expr_Value (Type_Low_Bound (Universal_Integer));
3601
      Hi : constant Uint := Expr_Value (Type_High_Bound (Universal_Integer));
3602
      --  Allowed range of universal integer (= allowed range of enum lit vals)
3603
 
3604
      Min : Uint;
3605
      Max : Uint;
3606
      --  Minimum and maximum values of entries
3607
 
3608
      Max_Node : Node_Id;
3609
      --  Pointer to node for literal providing max value
3610
 
3611
   begin
3612
      if Ignore_Rep_Clauses then
3613
         return;
3614
      end if;
3615
 
3616
      --  First some basic error checks
3617
 
3618
      Find_Type (Ident);
3619
      Enumtype := Entity (Ident);
3620
 
3621
      if Enumtype = Any_Type
3622
        or else Rep_Item_Too_Early (Enumtype, N)
3623
      then
3624
         return;
3625
      else
3626
         Enumtype := Underlying_Type (Enumtype);
3627
      end if;
3628
 
3629
      if not Is_Enumeration_Type (Enumtype) then
3630
         Error_Msg_NE
3631
           ("enumeration type required, found}",
3632
            Ident, First_Subtype (Enumtype));
3633
         return;
3634
      end if;
3635
 
3636
      --  Ignore rep clause on generic actual type. This will already have
3637
      --  been flagged on the template as an error, and this is the safest
3638
      --  way to ensure we don't get a junk cascaded message in the instance.
3639
 
3640
      if Is_Generic_Actual_Type (Enumtype) then
3641
         return;
3642
 
3643
      --  Type must be in current scope
3644
 
3645
      elsif Scope (Enumtype) /= Current_Scope then
3646
         Error_Msg_N ("type must be declared in this scope", Ident);
3647
         return;
3648
 
3649
      --  Type must be a first subtype
3650
 
3651
      elsif not Is_First_Subtype (Enumtype) then
3652
         Error_Msg_N ("cannot give enumeration rep clause for subtype", N);
3653
         return;
3654
 
3655
      --  Ignore duplicate rep clause
3656
 
3657
      elsif Has_Enumeration_Rep_Clause (Enumtype) then
3658
         Error_Msg_N ("duplicate enumeration rep clause ignored", N);
3659
         return;
3660
 
3661
      --  Don't allow rep clause for standard [wide_[wide_]]character
3662
 
3663
      elsif Is_Standard_Character_Type (Enumtype) then
3664
         Error_Msg_N ("enumeration rep clause not allowed for this type", N);
3665
         return;
3666
 
3667
      --  Check that the expression is a proper aggregate (no parentheses)
3668
 
3669
      elsif Paren_Count (Aggr) /= 0 then
3670
         Error_Msg
3671
           ("extra parentheses surrounding aggregate not allowed",
3672
            First_Sloc (Aggr));
3673
         return;
3674
 
3675
      --  All tests passed, so set rep clause in place
3676
 
3677
      else
3678
         Set_Has_Enumeration_Rep_Clause (Enumtype);
3679
         Set_Has_Enumeration_Rep_Clause (Base_Type (Enumtype));
3680
      end if;
3681
 
3682
      --  Now we process the aggregate. Note that we don't use the normal
3683
      --  aggregate code for this purpose, because we don't want any of the
3684
      --  normal expansion activities, and a number of special semantic
3685
      --  rules apply (including the component type being any integer type)
3686
 
3687
      Elit := First_Literal (Enumtype);
3688
 
3689
      --  First the positional entries if any
3690
 
3691
      if Present (Expressions (Aggr)) then
3692
         Expr := First (Expressions (Aggr));
3693
         while Present (Expr) loop
3694
            if No (Elit) then
3695
               Error_Msg_N ("too many entries in aggregate", Expr);
3696
               return;
3697
            end if;
3698
 
3699
            Val := Static_Integer (Expr);
3700
 
3701
            --  Err signals that we found some incorrect entries processing
3702
            --  the list. The final checks for completeness and ordering are
3703
            --  skipped in this case.
3704
 
3705
            if Val = No_Uint then
3706
               Err := True;
3707
            elsif Val < Lo or else Hi < Val then
3708
               Error_Msg_N ("value outside permitted range", Expr);
3709
               Err := True;
3710
            end if;
3711
 
3712
            Set_Enumeration_Rep (Elit, Val);
3713
            Set_Enumeration_Rep_Expr (Elit, Expr);
3714
            Next (Expr);
3715
            Next (Elit);
3716
         end loop;
3717
      end if;
3718
 
3719
      --  Now process the named entries if present
3720
 
3721
      if Present (Component_Associations (Aggr)) then
3722
         Assoc := First (Component_Associations (Aggr));
3723
         while Present (Assoc) loop
3724
            Choice := First (Choices (Assoc));
3725
 
3726
            if Present (Next (Choice)) then
3727
               Error_Msg_N
3728
                 ("multiple choice not allowed here", Next (Choice));
3729
               Err := True;
3730
            end if;
3731
 
3732
            if Nkind (Choice) = N_Others_Choice then
3733
               Error_Msg_N ("others choice not allowed here", Choice);
3734
               Err := True;
3735
 
3736
            elsif Nkind (Choice) = N_Range then
3737
 
3738
               --  ??? should allow zero/one element range here
3739
 
3740
               Error_Msg_N ("range not allowed here", Choice);
3741
               Err := True;
3742
 
3743
            else
3744
               Analyze_And_Resolve (Choice, Enumtype);
3745
 
3746
               if Error_Posted (Choice) then
3747
                  Err := True;
3748
               end if;
3749
 
3750
               if not Err then
3751
                  if Is_Entity_Name (Choice)
3752
                    and then Is_Type (Entity (Choice))
3753
                  then
3754
                     Error_Msg_N ("subtype name not allowed here", Choice);
3755
                     Err := True;
3756
 
3757
                     --  ??? should allow static subtype with zero/one entry
3758
 
3759
                  elsif Etype (Choice) = Base_Type (Enumtype) then
3760
                     if not Is_Static_Expression (Choice) then
3761
                        Flag_Non_Static_Expr
3762
                          ("non-static expression used for choice!", Choice);
3763
                        Err := True;
3764
 
3765
                     else
3766
                        Elit := Expr_Value_E (Choice);
3767
 
3768
                        if Present (Enumeration_Rep_Expr (Elit)) then
3769
                           Error_Msg_Sloc :=
3770
                             Sloc (Enumeration_Rep_Expr (Elit));
3771
                           Error_Msg_NE
3772
                             ("representation for& previously given#",
3773
                              Choice, Elit);
3774
                           Err := True;
3775
                        end if;
3776
 
3777
                        Set_Enumeration_Rep_Expr (Elit, Expression (Assoc));
3778
 
3779
                        Expr := Expression (Assoc);
3780
                        Val := Static_Integer (Expr);
3781
 
3782
                        if Val = No_Uint then
3783
                           Err := True;
3784
 
3785
                        elsif Val < Lo or else Hi < Val then
3786
                           Error_Msg_N ("value outside permitted range", Expr);
3787
                           Err := True;
3788
                        end if;
3789
 
3790
                        Set_Enumeration_Rep (Elit, Val);
3791
                     end if;
3792
                  end if;
3793
               end if;
3794
            end if;
3795
 
3796
            Next (Assoc);
3797
         end loop;
3798
      end if;
3799
 
3800
      --  Aggregate is fully processed. Now we check that a full set of
3801
      --  representations was given, and that they are in range and in order.
3802
      --  These checks are only done if no other errors occurred.
3803
 
3804
      if not Err then
3805
         Min  := No_Uint;
3806
         Max  := No_Uint;
3807
 
3808
         Elit := First_Literal (Enumtype);
3809
         while Present (Elit) loop
3810
            if No (Enumeration_Rep_Expr (Elit)) then
3811
               Error_Msg_NE ("missing representation for&!", N, Elit);
3812
 
3813
            else
3814
               Val := Enumeration_Rep (Elit);
3815
 
3816
               if Min = No_Uint then
3817
                  Min := Val;
3818
               end if;
3819
 
3820
               if Val /= No_Uint then
3821
                  if Max /= No_Uint and then Val <= Max then
3822
                     Error_Msg_NE
3823
                       ("enumeration value for& not ordered!",
3824
                        Enumeration_Rep_Expr (Elit), Elit);
3825
                  end if;
3826
 
3827
                  Max_Node := Enumeration_Rep_Expr (Elit);
3828
                  Max := Val;
3829
               end if;
3830
 
3831
               --  If there is at least one literal whose representation is not
3832
               --  equal to the Pos value, then note that this enumeration type
3833
               --  has a non-standard representation.
3834
 
3835
               if Val /= Enumeration_Pos (Elit) then
3836
                  Set_Has_Non_Standard_Rep (Base_Type (Enumtype));
3837
               end if;
3838
            end if;
3839
 
3840
            Next (Elit);
3841
         end loop;
3842
 
3843
         --  Now set proper size information
3844
 
3845
         declare
3846
            Minsize : Uint := UI_From_Int (Minimum_Size (Enumtype));
3847
 
3848
         begin
3849
            if Has_Size_Clause (Enumtype) then
3850
 
3851
               --  All OK, if size is OK now
3852
 
3853
               if RM_Size (Enumtype) >= Minsize then
3854
                  null;
3855
 
3856
               else
3857
                  --  Try if we can get by with biasing
3858
 
3859
                  Minsize :=
3860
                    UI_From_Int (Minimum_Size (Enumtype, Biased => True));
3861
 
3862
                  --  Error message if even biasing does not work
3863
 
3864
                  if RM_Size (Enumtype) < Minsize then
3865
                     Error_Msg_Uint_1 := RM_Size (Enumtype);
3866
                     Error_Msg_Uint_2 := Max;
3867
                     Error_Msg_N
3868
                       ("previously given size (^) is too small "
3869
                        & "for this value (^)", Max_Node);
3870
 
3871
                  --  If biasing worked, indicate that we now have biased rep
3872
 
3873
                  else
3874
                     Set_Biased
3875
                       (Enumtype, Size_Clause (Enumtype), "size clause");
3876
                  end if;
3877
               end if;
3878
 
3879
            else
3880
               Set_RM_Size    (Enumtype, Minsize);
3881
               Set_Enum_Esize (Enumtype);
3882
            end if;
3883
 
3884
            Set_RM_Size   (Base_Type (Enumtype), RM_Size   (Enumtype));
3885
            Set_Esize     (Base_Type (Enumtype), Esize     (Enumtype));
3886
            Set_Alignment (Base_Type (Enumtype), Alignment (Enumtype));
3887
         end;
3888
      end if;
3889
 
3890
      --  We repeat the too late test in case it froze itself!
3891
 
3892
      if Rep_Item_Too_Late (Enumtype, N) then
3893
         null;
3894
      end if;
3895
   end Analyze_Enumeration_Representation_Clause;
3896
 
3897
   ----------------------------
3898
   -- Analyze_Free_Statement --
3899
   ----------------------------
3900
 
3901
   procedure Analyze_Free_Statement (N : Node_Id) is
3902
   begin
3903
      Analyze (Expression (N));
3904
   end Analyze_Free_Statement;
3905
 
3906
   ---------------------------
3907
   -- Analyze_Freeze_Entity --
3908
   ---------------------------
3909
 
3910
   procedure Analyze_Freeze_Entity (N : Node_Id) is
3911
      E : constant Entity_Id := Entity (N);
3912
 
3913
   begin
3914
      --  Remember that we are processing a freezing entity. Required to
3915
      --  ensure correct decoration of internal entities associated with
3916
      --  interfaces (see New_Overloaded_Entity).
3917
 
3918
      Inside_Freezing_Actions := Inside_Freezing_Actions + 1;
3919
 
3920
      --  For tagged types covering interfaces add internal entities that link
3921
      --  the primitives of the interfaces with the primitives that cover them.
3922
      --  Note: These entities were originally generated only when generating
3923
      --  code because their main purpose was to provide support to initialize
3924
      --  the secondary dispatch tables. They are now generated also when
3925
      --  compiling with no code generation to provide ASIS the relationship
3926
      --  between interface primitives and tagged type primitives. They are
3927
      --  also used to locate primitives covering interfaces when processing
3928
      --  generics (see Derive_Subprograms).
3929
 
3930
      if Ada_Version >= Ada_2005
3931
        and then Ekind (E) = E_Record_Type
3932
        and then Is_Tagged_Type (E)
3933
        and then not Is_Interface (E)
3934
        and then Has_Interfaces (E)
3935
      then
3936
         --  This would be a good common place to call the routine that checks
3937
         --  overriding of interface primitives (and thus factorize calls to
3938
         --  Check_Abstract_Overriding located at different contexts in the
3939
         --  compiler). However, this is not possible because it causes
3940
         --  spurious errors in case of late overriding.
3941
 
3942
         Add_Internal_Interface_Entities (E);
3943
      end if;
3944
 
3945
      --  Check CPP types
3946
 
3947
      if Ekind (E) = E_Record_Type
3948
        and then Is_CPP_Class (E)
3949
        and then Is_Tagged_Type (E)
3950
        and then Tagged_Type_Expansion
3951
        and then Expander_Active
3952
      then
3953
         if CPP_Num_Prims (E) = 0 then
3954
 
3955
            --  If the CPP type has user defined components then it must import
3956
            --  primitives from C++. This is required because if the C++ class
3957
            --  has no primitives then the C++ compiler does not added the _tag
3958
            --  component to the type.
3959
 
3960
            pragma Assert (Chars (First_Entity (E)) = Name_uTag);
3961
 
3962
            if First_Entity (E) /= Last_Entity (E) then
3963
               Error_Msg_N
3964
                 ("?'C'P'P type must import at least one primitive from C++",
3965
                  E);
3966
            end if;
3967
         end if;
3968
 
3969
         --  Check that all its primitives are abstract or imported from C++.
3970
         --  Check also availability of the C++ constructor.
3971
 
3972
         declare
3973
            Has_Constructors : constant Boolean := Has_CPP_Constructors (E);
3974
            Elmt             : Elmt_Id;
3975
            Error_Reported   : Boolean := False;
3976
            Prim             : Node_Id;
3977
 
3978
         begin
3979
            Elmt := First_Elmt (Primitive_Operations (E));
3980
            while Present (Elmt) loop
3981
               Prim := Node (Elmt);
3982
 
3983
               if Comes_From_Source (Prim) then
3984
                  if Is_Abstract_Subprogram (Prim) then
3985
                     null;
3986
 
3987
                  elsif not Is_Imported (Prim)
3988
                    or else Convention (Prim) /= Convention_CPP
3989
                  then
3990
                     Error_Msg_N
3991
                       ("?primitives of 'C'P'P types must be imported from C++"
3992
                        & " or abstract", Prim);
3993
 
3994
                  elsif not Has_Constructors
3995
                     and then not Error_Reported
3996
                  then
3997
                     Error_Msg_Name_1 := Chars (E);
3998
                     Error_Msg_N
3999
                       ("?'C'P'P constructor required for type %", Prim);
4000
                     Error_Reported := True;
4001
                  end if;
4002
               end if;
4003
 
4004
               Next_Elmt (Elmt);
4005
            end loop;
4006
         end;
4007
      end if;
4008
 
4009
      Inside_Freezing_Actions := Inside_Freezing_Actions - 1;
4010
 
4011
      --  If we have a type with predicates, build predicate function
4012
 
4013
      if Is_Type (E) and then Has_Predicates (E) then
4014
         Build_Predicate_Function (E, N);
4015
      end if;
4016
 
4017
      --  If type has delayed aspects, this is where we do the preanalysis at
4018
      --  the freeze point, as part of the consistent visibility check. Note
4019
      --  that this must be done after calling Build_Predicate_Function or
4020
      --  Build_Invariant_Procedure since these subprograms fix occurrences of
4021
      --  the subtype name in the saved expression so that they will not cause
4022
      --  trouble in the preanalysis.
4023
 
4024
      if Has_Delayed_Aspects (E) then
4025
         declare
4026
            Ritem : Node_Id;
4027
 
4028
         begin
4029
            --  Look for aspect specification entries for this entity
4030
 
4031
            Ritem := First_Rep_Item (E);
4032
            while Present (Ritem) loop
4033
               if Nkind (Ritem) = N_Aspect_Specification
4034
                 and then Entity (Ritem) = E
4035
                 and then Is_Delayed_Aspect (Ritem)
4036
                 and then Scope (E) = Current_Scope
4037
               then
4038
                  Check_Aspect_At_Freeze_Point (Ritem);
4039
               end if;
4040
 
4041
               Next_Rep_Item (Ritem);
4042
            end loop;
4043
         end;
4044
      end if;
4045
   end Analyze_Freeze_Entity;
4046
 
4047
   ------------------------------------------
4048
   -- Analyze_Record_Representation_Clause --
4049
   ------------------------------------------
4050
 
4051
   --  Note: we check as much as we can here, but we can't do any checks
4052
   --  based on the position values (e.g. overlap checks) until freeze time
4053
   --  because especially in Ada 2005 (machine scalar mode), the processing
4054
   --  for non-standard bit order can substantially change the positions.
4055
   --  See procedure Check_Record_Representation_Clause (called from Freeze)
4056
   --  for the remainder of this processing.
4057
 
4058
   procedure Analyze_Record_Representation_Clause (N : Node_Id) is
4059
      Ident   : constant Node_Id := Identifier (N);
4060
      Biased  : Boolean;
4061
      CC      : Node_Id;
4062
      Comp    : Entity_Id;
4063
      Fbit    : Uint;
4064
      Hbit    : Uint := Uint_0;
4065
      Lbit    : Uint;
4066
      Ocomp   : Entity_Id;
4067
      Posit   : Uint;
4068
      Rectype : Entity_Id;
4069
 
4070
      CR_Pragma : Node_Id := Empty;
4071
      --  Points to N_Pragma node if Complete_Representation pragma present
4072
 
4073
   begin
4074
      if Ignore_Rep_Clauses then
4075
         return;
4076
      end if;
4077
 
4078
      Find_Type (Ident);
4079
      Rectype := Entity (Ident);
4080
 
4081
      if Rectype = Any_Type
4082
        or else Rep_Item_Too_Early (Rectype, N)
4083
      then
4084
         return;
4085
      else
4086
         Rectype := Underlying_Type (Rectype);
4087
      end if;
4088
 
4089
      --  First some basic error checks
4090
 
4091
      if not Is_Record_Type (Rectype) then
4092
         Error_Msg_NE
4093
           ("record type required, found}", Ident, First_Subtype (Rectype));
4094
         return;
4095
 
4096
      elsif Scope (Rectype) /= Current_Scope then
4097
         Error_Msg_N ("type must be declared in this scope", N);
4098
         return;
4099
 
4100
      elsif not Is_First_Subtype (Rectype) then
4101
         Error_Msg_N ("cannot give record rep clause for subtype", N);
4102
         return;
4103
 
4104
      elsif Has_Record_Rep_Clause (Rectype) then
4105
         Error_Msg_N ("duplicate record rep clause ignored", N);
4106
         return;
4107
 
4108
      elsif Rep_Item_Too_Late (Rectype, N) then
4109
         return;
4110
      end if;
4111
 
4112
      if Present (Mod_Clause (N)) then
4113
         declare
4114
            Loc     : constant Source_Ptr := Sloc (N);
4115
            M       : constant Node_Id := Mod_Clause (N);
4116
            P       : constant List_Id := Pragmas_Before (M);
4117
            AtM_Nod : Node_Id;
4118
 
4119
            Mod_Val : Uint;
4120
            pragma Warnings (Off, Mod_Val);
4121
 
4122
         begin
4123
            Check_Restriction (No_Obsolescent_Features, Mod_Clause (N));
4124
 
4125
            if Warn_On_Obsolescent_Feature then
4126
               Error_Msg_N
4127
                 ("mod clause is an obsolescent feature (RM J.8)?", N);
4128
               Error_Msg_N
4129
                 ("\use alignment attribute definition clause instead?", N);
4130
            end if;
4131
 
4132
            if Present (P) then
4133
               Analyze_List (P);
4134
            end if;
4135
 
4136
            --  In ASIS_Mode mode, expansion is disabled, but we must convert
4137
            --  the Mod clause into an alignment clause anyway, so that the
4138
            --  back-end can compute and back-annotate properly the size and
4139
            --  alignment of types that may include this record.
4140
 
4141
            --  This seems dubious, this destroys the source tree in a manner
4142
            --  not detectable by ASIS ???
4143
 
4144
            if Operating_Mode = Check_Semantics and then ASIS_Mode then
4145
               AtM_Nod :=
4146
                 Make_Attribute_Definition_Clause (Loc,
4147
                   Name       => New_Reference_To (Base_Type (Rectype), Loc),
4148
                   Chars      => Name_Alignment,
4149
                   Expression => Relocate_Node (Expression (M)));
4150
 
4151
               Set_From_At_Mod (AtM_Nod);
4152
               Insert_After (N, AtM_Nod);
4153
               Mod_Val := Get_Alignment_Value (Expression (AtM_Nod));
4154
               Set_Mod_Clause (N, Empty);
4155
 
4156
            else
4157
               --  Get the alignment value to perform error checking
4158
 
4159
               Mod_Val := Get_Alignment_Value (Expression (M));
4160
            end if;
4161
         end;
4162
      end if;
4163
 
4164
      --  For untagged types, clear any existing component clauses for the
4165
      --  type. If the type is derived, this is what allows us to override
4166
      --  a rep clause for the parent. For type extensions, the representation
4167
      --  of the inherited components is inherited, so we want to keep previous
4168
      --  component clauses for completeness.
4169
 
4170
      if not Is_Tagged_Type (Rectype) then
4171
         Comp := First_Component_Or_Discriminant (Rectype);
4172
         while Present (Comp) loop
4173
            Set_Component_Clause (Comp, Empty);
4174
            Next_Component_Or_Discriminant (Comp);
4175
         end loop;
4176
      end if;
4177
 
4178
      --  All done if no component clauses
4179
 
4180
      CC := First (Component_Clauses (N));
4181
 
4182
      if No (CC) then
4183
         return;
4184
      end if;
4185
 
4186
      --  A representation like this applies to the base type
4187
 
4188
      Set_Has_Record_Rep_Clause (Base_Type (Rectype));
4189
      Set_Has_Non_Standard_Rep  (Base_Type (Rectype));
4190
      Set_Has_Specified_Layout  (Base_Type (Rectype));
4191
 
4192
      --  Process the component clauses
4193
 
4194
      while Present (CC) loop
4195
 
4196
         --  Pragma
4197
 
4198
         if Nkind (CC) = N_Pragma then
4199
            Analyze (CC);
4200
 
4201
            --  The only pragma of interest is Complete_Representation
4202
 
4203
            if Pragma_Name (CC) = Name_Complete_Representation then
4204
               CR_Pragma := CC;
4205
            end if;
4206
 
4207
         --  Processing for real component clause
4208
 
4209
         else
4210
            Posit := Static_Integer (Position  (CC));
4211
            Fbit  := Static_Integer (First_Bit (CC));
4212
            Lbit  := Static_Integer (Last_Bit  (CC));
4213
 
4214
            if Posit /= No_Uint
4215
              and then Fbit /= No_Uint
4216
              and then Lbit /= No_Uint
4217
            then
4218
               if Posit < 0 then
4219
                  Error_Msg_N
4220
                    ("position cannot be negative", Position (CC));
4221
 
4222
               elsif Fbit < 0 then
4223
                  Error_Msg_N
4224
                    ("first bit cannot be negative", First_Bit (CC));
4225
 
4226
               --  The Last_Bit specified in a component clause must not be
4227
               --  less than the First_Bit minus one (RM-13.5.1(10)).
4228
 
4229
               elsif Lbit < Fbit - 1 then
4230
                  Error_Msg_N
4231
                    ("last bit cannot be less than first bit minus one",
4232
                     Last_Bit (CC));
4233
 
4234
               --  Values look OK, so find the corresponding record component
4235
               --  Even though the syntax allows an attribute reference for
4236
               --  implementation-defined components, GNAT does not allow the
4237
               --  tag to get an explicit position.
4238
 
4239
               elsif Nkind (Component_Name (CC)) = N_Attribute_Reference then
4240
                  if Attribute_Name (Component_Name (CC)) = Name_Tag then
4241
                     Error_Msg_N ("position of tag cannot be specified", CC);
4242
                  else
4243
                     Error_Msg_N ("illegal component name", CC);
4244
                  end if;
4245
 
4246
               else
4247
                  Comp := First_Entity (Rectype);
4248
                  while Present (Comp) loop
4249
                     exit when Chars (Comp) = Chars (Component_Name (CC));
4250
                     Next_Entity (Comp);
4251
                  end loop;
4252
 
4253
                  if No (Comp) then
4254
 
4255
                     --  Maybe component of base type that is absent from
4256
                     --  statically constrained first subtype.
4257
 
4258
                     Comp := First_Entity (Base_Type (Rectype));
4259
                     while Present (Comp) loop
4260
                        exit when Chars (Comp) = Chars (Component_Name (CC));
4261
                        Next_Entity (Comp);
4262
                     end loop;
4263
                  end if;
4264
 
4265
                  if No (Comp) then
4266
                     Error_Msg_N
4267
                       ("component clause is for non-existent field", CC);
4268
 
4269
                  --  Ada 2012 (AI05-0026): Any name that denotes a
4270
                  --  discriminant of an object of an unchecked union type
4271
                  --  shall not occur within a record_representation_clause.
4272
 
4273
                  --  The general restriction of using record rep clauses on
4274
                  --  Unchecked_Union types has now been lifted. Since it is
4275
                  --  possible to introduce a record rep clause which mentions
4276
                  --  the discriminant of an Unchecked_Union in non-Ada 2012
4277
                  --  code, this check is applied to all versions of the
4278
                  --  language.
4279
 
4280
                  elsif Ekind (Comp) = E_Discriminant
4281
                    and then Is_Unchecked_Union (Rectype)
4282
                  then
4283
                     Error_Msg_N
4284
                       ("cannot reference discriminant of Unchecked_Union",
4285
                        Component_Name (CC));
4286
 
4287
                  elsif Present (Component_Clause (Comp)) then
4288
 
4289
                     --  Diagnose duplicate rep clause, or check consistency
4290
                     --  if this is an inherited component. In a double fault,
4291
                     --  there may be a duplicate inconsistent clause for an
4292
                     --  inherited component.
4293
 
4294
                     if Scope (Original_Record_Component (Comp)) = Rectype
4295
                       or else Parent (Component_Clause (Comp)) = N
4296
                     then
4297
                        Error_Msg_Sloc := Sloc (Component_Clause (Comp));
4298
                        Error_Msg_N ("component clause previously given#", CC);
4299
 
4300
                     else
4301
                        declare
4302
                           Rep1 : constant Node_Id := Component_Clause (Comp);
4303
                        begin
4304
                           if Intval (Position (Rep1)) /=
4305
                                                   Intval (Position (CC))
4306
                             or else Intval (First_Bit (Rep1)) /=
4307
                                                   Intval (First_Bit (CC))
4308
                             or else Intval (Last_Bit (Rep1)) /=
4309
                                                   Intval (Last_Bit (CC))
4310
                           then
4311
                              Error_Msg_N ("component clause inconsistent "
4312
                                & "with representation of ancestor", CC);
4313
                           elsif Warn_On_Redundant_Constructs then
4314
                              Error_Msg_N ("?redundant component clause "
4315
                                & "for inherited component!", CC);
4316
                           end if;
4317
                        end;
4318
                     end if;
4319
 
4320
                  --  Normal case where this is the first component clause we
4321
                  --  have seen for this entity, so set it up properly.
4322
 
4323
                  else
4324
                     --  Make reference for field in record rep clause and set
4325
                     --  appropriate entity field in the field identifier.
4326
 
4327
                     Generate_Reference
4328
                       (Comp, Component_Name (CC), Set_Ref => False);
4329
                     Set_Entity (Component_Name (CC), Comp);
4330
 
4331
                     --  Update Fbit and Lbit to the actual bit number
4332
 
4333
                     Fbit := Fbit + UI_From_Int (SSU) * Posit;
4334
                     Lbit := Lbit + UI_From_Int (SSU) * Posit;
4335
 
4336
                     if Has_Size_Clause (Rectype)
4337
                       and then RM_Size (Rectype) <= Lbit
4338
                     then
4339
                        Error_Msg_N
4340
                          ("bit number out of range of specified size",
4341
                           Last_Bit (CC));
4342
                     else
4343
                        Set_Component_Clause     (Comp, CC);
4344
                        Set_Component_Bit_Offset (Comp, Fbit);
4345
                        Set_Esize                (Comp, 1 + (Lbit - Fbit));
4346
                        Set_Normalized_First_Bit (Comp, Fbit mod SSU);
4347
                        Set_Normalized_Position  (Comp, Fbit / SSU);
4348
 
4349
                        if Warn_On_Overridden_Size
4350
                          and then Has_Size_Clause (Etype (Comp))
4351
                          and then RM_Size (Etype (Comp)) /= Esize (Comp)
4352
                        then
4353
                           Error_Msg_NE
4354
                             ("?component size overrides size clause for&",
4355
                              Component_Name (CC), Etype (Comp));
4356
                        end if;
4357
 
4358
                        --  This information is also set in the corresponding
4359
                        --  component of the base type, found by accessing the
4360
                        --  Original_Record_Component link if it is present.
4361
 
4362
                        Ocomp := Original_Record_Component (Comp);
4363
 
4364
                        if Hbit < Lbit then
4365
                           Hbit := Lbit;
4366
                        end if;
4367
 
4368
                        Check_Size
4369
                          (Component_Name (CC),
4370
                           Etype (Comp),
4371
                           Esize (Comp),
4372
                           Biased);
4373
 
4374
                        Set_Biased
4375
                          (Comp, First_Node (CC), "component clause", Biased);
4376
 
4377
                        if Present (Ocomp) then
4378
                           Set_Component_Clause     (Ocomp, CC);
4379
                           Set_Component_Bit_Offset (Ocomp, Fbit);
4380
                           Set_Normalized_First_Bit (Ocomp, Fbit mod SSU);
4381
                           Set_Normalized_Position  (Ocomp, Fbit / SSU);
4382
                           Set_Esize                (Ocomp, 1 + (Lbit - Fbit));
4383
 
4384
                           Set_Normalized_Position_Max
4385
                             (Ocomp, Normalized_Position (Ocomp));
4386
 
4387
                           --  Note: we don't use Set_Biased here, because we
4388
                           --  already gave a warning above if needed, and we
4389
                           --  would get a duplicate for the same name here.
4390
 
4391
                           Set_Has_Biased_Representation
4392
                             (Ocomp, Has_Biased_Representation (Comp));
4393
                        end if;
4394
 
4395
                        if Esize (Comp) < 0 then
4396
                           Error_Msg_N ("component size is negative", CC);
4397
                        end if;
4398
                     end if;
4399
                  end if;
4400
               end if;
4401
            end if;
4402
         end if;
4403
 
4404
         Next (CC);
4405
      end loop;
4406
 
4407
      --  Check missing components if Complete_Representation pragma appeared
4408
 
4409
      if Present (CR_Pragma) then
4410
         Comp := First_Component_Or_Discriminant (Rectype);
4411
         while Present (Comp) loop
4412
            if No (Component_Clause (Comp)) then
4413
               Error_Msg_NE
4414
                 ("missing component clause for &", CR_Pragma, Comp);
4415
            end if;
4416
 
4417
            Next_Component_Or_Discriminant (Comp);
4418
         end loop;
4419
 
4420
         --  If no Complete_Representation pragma, warn if missing components
4421
 
4422
      elsif Warn_On_Unrepped_Components then
4423
         declare
4424
            Num_Repped_Components   : Nat := 0;
4425
            Num_Unrepped_Components : Nat := 0;
4426
 
4427
         begin
4428
            --  First count number of repped and unrepped components
4429
 
4430
            Comp := First_Component_Or_Discriminant (Rectype);
4431
            while Present (Comp) loop
4432
               if Present (Component_Clause (Comp)) then
4433
                  Num_Repped_Components := Num_Repped_Components + 1;
4434
               else
4435
                  Num_Unrepped_Components := Num_Unrepped_Components + 1;
4436
               end if;
4437
 
4438
               Next_Component_Or_Discriminant (Comp);
4439
            end loop;
4440
 
4441
            --  We are only interested in the case where there is at least one
4442
            --  unrepped component, and at least half the components have rep
4443
            --  clauses. We figure that if less than half have them, then the
4444
            --  partial rep clause is really intentional. If the component
4445
            --  type has no underlying type set at this point (as for a generic
4446
            --  formal type), we don't know enough to give a warning on the
4447
            --  component.
4448
 
4449
            if Num_Unrepped_Components > 0
4450
              and then Num_Unrepped_Components < Num_Repped_Components
4451
            then
4452
               Comp := First_Component_Or_Discriminant (Rectype);
4453
               while Present (Comp) loop
4454
                  if No (Component_Clause (Comp))
4455
                    and then Comes_From_Source (Comp)
4456
                    and then Present (Underlying_Type (Etype (Comp)))
4457
                    and then (Is_Scalar_Type (Underlying_Type (Etype (Comp)))
4458
                               or else Size_Known_At_Compile_Time
4459
                                         (Underlying_Type (Etype (Comp))))
4460
                    and then not Has_Warnings_Off (Rectype)
4461
                  then
4462
                     Error_Msg_Sloc := Sloc (Comp);
4463
                     Error_Msg_NE
4464
                       ("?no component clause given for & declared #",
4465
                        N, Comp);
4466
                  end if;
4467
 
4468
                  Next_Component_Or_Discriminant (Comp);
4469
               end loop;
4470
            end if;
4471
         end;
4472
      end if;
4473
   end Analyze_Record_Representation_Clause;
4474
 
4475
   -------------------------------
4476
   -- Build_Invariant_Procedure --
4477
   -------------------------------
4478
 
4479
   --  The procedure that is constructed here has the form
4480
 
4481
   --  procedure typInvariant (Ixxx : typ) is
4482
   --  begin
4483
   --     pragma Check (Invariant, exp, "failed invariant from xxx");
4484
   --     pragma Check (Invariant, exp, "failed invariant from xxx");
4485
   --     ...
4486
   --     pragma Check (Invariant, exp, "failed inherited invariant from xxx");
4487
   --     ...
4488
   --  end typInvariant;
4489
 
4490
   procedure Build_Invariant_Procedure (Typ : Entity_Id; N : Node_Id) is
4491
      Loc   : constant Source_Ptr := Sloc (Typ);
4492
      Stmts : List_Id;
4493
      Spec  : Node_Id;
4494
      SId   : Entity_Id;
4495
      PDecl : Node_Id;
4496
      PBody : Node_Id;
4497
 
4498
      Visible_Decls : constant List_Id := Visible_Declarations (N);
4499
      Private_Decls : constant List_Id := Private_Declarations (N);
4500
 
4501
      procedure Add_Invariants (T : Entity_Id; Inherit : Boolean);
4502
      --  Appends statements to Stmts for any invariants in the rep item chain
4503
      --  of the given type. If Inherit is False, then we only process entries
4504
      --  on the chain for the type Typ. If Inherit is True, then we ignore any
4505
      --  Invariant aspects, but we process all Invariant'Class aspects, adding
4506
      --  "inherited" to the exception message and generating an informational
4507
      --  message about the inheritance of an invariant.
4508
 
4509
      Object_Name : constant Name_Id := New_Internal_Name ('I');
4510
      --  Name for argument of invariant procedure
4511
 
4512
      Object_Entity : constant Node_Id :=
4513
                        Make_Defining_Identifier (Loc, Object_Name);
4514
      --  The procedure declaration entity for the argument
4515
 
4516
      --------------------
4517
      -- Add_Invariants --
4518
      --------------------
4519
 
4520
      procedure Add_Invariants (T : Entity_Id; Inherit : Boolean) is
4521
         Ritem : Node_Id;
4522
         Arg1  : Node_Id;
4523
         Arg2  : Node_Id;
4524
         Arg3  : Node_Id;
4525
         Exp   : Node_Id;
4526
         Loc   : Source_Ptr;
4527
         Assoc : List_Id;
4528
         Str   : String_Id;
4529
 
4530
         procedure Replace_Type_Reference (N : Node_Id);
4531
         --  Replace a single occurrence N of the subtype name with a reference
4532
         --  to the formal of the predicate function. N can be an identifier
4533
         --  referencing the subtype, or a selected component, representing an
4534
         --  appropriately qualified occurrence of the subtype name.
4535
 
4536
         procedure Replace_Type_References is
4537
           new Replace_Type_References_Generic (Replace_Type_Reference);
4538
         --  Traverse an expression replacing all occurrences of the subtype
4539
         --  name with appropriate references to the object that is the formal
4540
         --  parameter of the predicate function. Note that we must ensure
4541
         --  that the type and entity information is properly set in the
4542
         --  replacement node, since we will do a Preanalyze call of this
4543
         --  expression without proper visibility of the procedure argument.
4544
 
4545
         ----------------------------
4546
         -- Replace_Type_Reference --
4547
         ----------------------------
4548
 
4549
         procedure Replace_Type_Reference (N : Node_Id) is
4550
         begin
4551
            --  Invariant'Class, replace with T'Class (obj)
4552
 
4553
            if Class_Present (Ritem) then
4554
               Rewrite (N,
4555
                 Make_Type_Conversion (Loc,
4556
                   Subtype_Mark =>
4557
                     Make_Attribute_Reference (Loc,
4558
                       Prefix         => New_Occurrence_Of (T, Loc),
4559
                       Attribute_Name => Name_Class),
4560
                   Expression   => Make_Identifier (Loc, Object_Name)));
4561
 
4562
               Set_Entity (Expression (N), Object_Entity);
4563
               Set_Etype  (Expression (N), Typ);
4564
 
4565
            --  Invariant, replace with obj
4566
 
4567
            else
4568
               Rewrite (N, Make_Identifier (Loc, Object_Name));
4569
               Set_Entity (N, Object_Entity);
4570
               Set_Etype  (N, Typ);
4571
            end if;
4572
         end Replace_Type_Reference;
4573
 
4574
      --  Start of processing for Add_Invariants
4575
 
4576
      begin
4577
         Ritem := First_Rep_Item (T);
4578
         while Present (Ritem) loop
4579
            if Nkind (Ritem) = N_Pragma
4580
              and then Pragma_Name (Ritem) = Name_Invariant
4581
            then
4582
               Arg1 := First (Pragma_Argument_Associations (Ritem));
4583
               Arg2 := Next (Arg1);
4584
               Arg3 := Next (Arg2);
4585
 
4586
               Arg1 := Get_Pragma_Arg (Arg1);
4587
               Arg2 := Get_Pragma_Arg (Arg2);
4588
 
4589
               --  For Inherit case, ignore Invariant, process only Class case
4590
 
4591
               if Inherit then
4592
                  if not Class_Present (Ritem) then
4593
                     goto Continue;
4594
                  end if;
4595
 
4596
               --  For Inherit false, process only item for right type
4597
 
4598
               else
4599
                  if Entity (Arg1) /= Typ then
4600
                     goto Continue;
4601
                  end if;
4602
               end if;
4603
 
4604
               if No (Stmts) then
4605
                  Stmts := Empty_List;
4606
               end if;
4607
 
4608
               Exp := New_Copy_Tree (Arg2);
4609
               Loc := Sloc (Exp);
4610
 
4611
               --  We need to replace any occurrences of the name of the type
4612
               --  with references to the object, converted to type'Class in
4613
               --  the case of Invariant'Class aspects.
4614
 
4615
               Replace_Type_References (Exp, Chars (T));
4616
 
4617
               --  If this invariant comes from an aspect, find the aspect
4618
               --  specification, and replace the saved expression because
4619
               --  we need the subtype references replaced for the calls to
4620
               --  Preanalyze_Spec_Expressin in Check_Aspect_At_Freeze_Point
4621
               --  and Check_Aspect_At_End_Of_Declarations.
4622
 
4623
               if From_Aspect_Specification (Ritem) then
4624
                  declare
4625
                     Aitem : Node_Id;
4626
 
4627
                  begin
4628
                     --  Loop to find corresponding aspect, note that this
4629
                     --  must be present given the pragma is marked delayed.
4630
 
4631
                     Aitem := Next_Rep_Item (Ritem);
4632
                     while Present (Aitem) loop
4633
                        if Nkind (Aitem) = N_Aspect_Specification
4634
                          and then Aspect_Rep_Item (Aitem) = Ritem
4635
                        then
4636
                           Set_Entity
4637
                             (Identifier (Aitem), New_Copy_Tree (Exp));
4638
                           exit;
4639
                        end if;
4640
 
4641
                        Aitem := Next_Rep_Item (Aitem);
4642
                     end loop;
4643
                  end;
4644
               end if;
4645
 
4646
               --  Now we need to preanalyze the expression to properly capture
4647
               --  the visibility in the visible part. The expression will not
4648
               --  be analyzed for real until the body is analyzed, but that is
4649
               --  at the end of the private part and has the wrong visibility.
4650
 
4651
               Set_Parent (Exp, N);
4652
               Preanalyze_Spec_Expression (Exp, Standard_Boolean);
4653
 
4654
               --  Build first two arguments for Check pragma
4655
 
4656
               Assoc := New_List (
4657
                 Make_Pragma_Argument_Association (Loc,
4658
                   Expression => Make_Identifier (Loc, Name_Invariant)),
4659
                 Make_Pragma_Argument_Association (Loc, Expression => Exp));
4660
 
4661
               --  Add message if present in Invariant pragma
4662
 
4663
               if Present (Arg3) then
4664
                  Str := Strval (Get_Pragma_Arg (Arg3));
4665
 
4666
                  --  If inherited case, and message starts "failed invariant",
4667
                  --  change it to be "failed inherited invariant".
4668
 
4669
                  if Inherit then
4670
                     String_To_Name_Buffer (Str);
4671
 
4672
                     if Name_Buffer (1 .. 16) = "failed invariant" then
4673
                        Insert_Str_In_Name_Buffer ("inherited ", 8);
4674
                        Str := String_From_Name_Buffer;
4675
                     end if;
4676
                  end if;
4677
 
4678
                  Append_To (Assoc,
4679
                    Make_Pragma_Argument_Association (Loc,
4680
                      Expression => Make_String_Literal (Loc, Str)));
4681
               end if;
4682
 
4683
               --  Add Check pragma to list of statements
4684
 
4685
               Append_To (Stmts,
4686
                 Make_Pragma (Loc,
4687
                   Pragma_Identifier            =>
4688
                     Make_Identifier (Loc, Name_Check),
4689
                   Pragma_Argument_Associations => Assoc));
4690
 
4691
               --  If Inherited case and option enabled, output info msg. Note
4692
               --  that we know this is a case of Invariant'Class.
4693
 
4694
               if Inherit and Opt.List_Inherited_Aspects then
4695
                  Error_Msg_Sloc := Sloc (Ritem);
4696
                  Error_Msg_N
4697
                    ("?info: & inherits `Invariant''Class` aspect from #",
4698
                     Typ);
4699
               end if;
4700
            end if;
4701
 
4702
         <<Continue>>
4703
            Next_Rep_Item (Ritem);
4704
         end loop;
4705
      end Add_Invariants;
4706
 
4707
   --  Start of processing for Build_Invariant_Procedure
4708
 
4709
   begin
4710
      Stmts := No_List;
4711
      PDecl := Empty;
4712
      PBody := Empty;
4713
      Set_Etype (Object_Entity, Typ);
4714
 
4715
      --  Add invariants for the current type
4716
 
4717
      Add_Invariants (Typ, Inherit => False);
4718
 
4719
      --  Add invariants for parent types
4720
 
4721
      declare
4722
         Current_Typ : Entity_Id;
4723
         Parent_Typ  : Entity_Id;
4724
 
4725
      begin
4726
         Current_Typ := Typ;
4727
         loop
4728
            Parent_Typ := Etype (Current_Typ);
4729
 
4730
            if Is_Private_Type (Parent_Typ)
4731
              and then Present (Full_View (Base_Type (Parent_Typ)))
4732
            then
4733
               Parent_Typ := Full_View (Base_Type (Parent_Typ));
4734
            end if;
4735
 
4736
            exit when Parent_Typ = Current_Typ;
4737
 
4738
            Current_Typ := Parent_Typ;
4739
            Add_Invariants (Current_Typ, Inherit => True);
4740
         end loop;
4741
      end;
4742
 
4743
      --  Build the procedure if we generated at least one Check pragma
4744
 
4745
      if Stmts /= No_List then
4746
 
4747
         --  Build procedure declaration
4748
 
4749
         SId :=
4750
           Make_Defining_Identifier (Loc,
4751
             Chars => New_External_Name (Chars (Typ), "Invariant"));
4752
         Set_Has_Invariants (SId);
4753
         Set_Invariant_Procedure (Typ, SId);
4754
 
4755
         Spec :=
4756
           Make_Procedure_Specification (Loc,
4757
             Defining_Unit_Name       => SId,
4758
             Parameter_Specifications => New_List (
4759
               Make_Parameter_Specification (Loc,
4760
                 Defining_Identifier => Object_Entity,
4761
                 Parameter_Type      => New_Occurrence_Of (Typ, Loc))));
4762
 
4763
         PDecl := Make_Subprogram_Declaration (Loc, Specification => Spec);
4764
 
4765
         --  Build procedure body
4766
 
4767
         SId :=
4768
           Make_Defining_Identifier (Loc,
4769
             Chars => New_External_Name (Chars (Typ), "Invariant"));
4770
 
4771
         Spec :=
4772
           Make_Procedure_Specification (Loc,
4773
             Defining_Unit_Name       => SId,
4774
             Parameter_Specifications => New_List (
4775
               Make_Parameter_Specification (Loc,
4776
                 Defining_Identifier =>
4777
                   Make_Defining_Identifier (Loc, Object_Name),
4778
                 Parameter_Type => New_Occurrence_Of (Typ, Loc))));
4779
 
4780
         PBody :=
4781
           Make_Subprogram_Body (Loc,
4782
             Specification              => Spec,
4783
             Declarations               => Empty_List,
4784
             Handled_Statement_Sequence =>
4785
               Make_Handled_Sequence_Of_Statements (Loc,
4786
                 Statements => Stmts));
4787
 
4788
         --  Insert procedure declaration and spec at the appropriate points.
4789
         --  Skip this if there are no private declarations (that's an error
4790
         --  that will be diagnosed elsewhere, and there is no point in having
4791
         --  an invariant procedure set if the full declaration is missing).
4792
 
4793
         if Present (Private_Decls) then
4794
 
4795
            --  The spec goes at the end of visible declarations, but they have
4796
            --  already been analyzed, so we need to explicitly do the analyze.
4797
 
4798
            Append_To (Visible_Decls, PDecl);
4799
            Analyze (PDecl);
4800
 
4801
            --  The body goes at the end of the private declarations, which we
4802
            --  have not analyzed yet, so we do not need to perform an explicit
4803
            --  analyze call. We skip this if there are no private declarations
4804
            --  (this is an error that will be caught elsewhere);
4805
 
4806
            Append_To (Private_Decls, PBody);
4807
 
4808
            --  If the invariant appears on the full view of a type, the
4809
            --  analysis of the private part is complete, and we must
4810
            --  analyze the new body explicitly.
4811
 
4812
            if In_Private_Part (Current_Scope) then
4813
               Analyze (PBody);
4814
            end if;
4815
         end if;
4816
      end if;
4817
   end Build_Invariant_Procedure;
4818
 
4819
   ------------------------------
4820
   -- Build_Predicate_Function --
4821
   ------------------------------
4822
 
4823
   --  The procedure that is constructed here has the form
4824
 
4825
   --  function typPredicate (Ixxx : typ) return Boolean is
4826
   --  begin
4827
   --     return
4828
   --        exp1 and then exp2 and then ...
4829
   --        and then typ1Predicate (typ1 (Ixxx))
4830
   --        and then typ2Predicate (typ2 (Ixxx))
4831
   --        and then ...;
4832
   --  end typPredicate;
4833
 
4834
   --  Here exp1, and exp2 are expressions from Predicate pragmas. Note that
4835
   --  this is the point at which these expressions get analyzed, providing the
4836
   --  required delay, and typ1, typ2, are entities from which predicates are
4837
   --  inherited. Note that we do NOT generate Check pragmas, that's because we
4838
   --  use this function even if checks are off, e.g. for membership tests.
4839
 
4840
   procedure Build_Predicate_Function (Typ : Entity_Id; N : Node_Id) is
4841
      Loc  : constant Source_Ptr := Sloc (Typ);
4842
      Spec : Node_Id;
4843
      SId  : Entity_Id;
4844
      FDecl : Node_Id;
4845
      FBody : Node_Id;
4846
 
4847
      Expr : Node_Id;
4848
      --  This is the expression for the return statement in the function. It
4849
      --  is build by connecting the component predicates with AND THEN.
4850
 
4851
      procedure Add_Call (T : Entity_Id);
4852
      --  Includes a call to the predicate function for type T in Expr if T
4853
      --  has predicates and Predicate_Function (T) is non-empty.
4854
 
4855
      procedure Add_Predicates;
4856
      --  Appends expressions for any Predicate pragmas in the rep item chain
4857
      --  Typ to Expr. Note that we look only at items for this exact entity.
4858
      --  Inheritance of predicates for the parent type is done by calling the
4859
      --  Predicate_Function of the parent type, using Add_Call above.
4860
 
4861
      Object_Name : constant Name_Id := New_Internal_Name ('I');
4862
      --  Name for argument of Predicate procedure
4863
 
4864
      Object_Entity : constant Entity_Id :=
4865
                        Make_Defining_Identifier (Loc, Object_Name);
4866
      --  The entity for the spec entity for the argument
4867
 
4868
      Dynamic_Predicate_Present : Boolean := False;
4869
      --  Set True if a dynamic predicate is present, results in the entire
4870
      --  predicate being considered dynamic even if it looks static
4871
 
4872
      Static_Predicate_Present : Node_Id := Empty;
4873
      --  Set to N_Pragma node for a static predicate if one is encountered.
4874
 
4875
      --------------
4876
      -- Add_Call --
4877
      --------------
4878
 
4879
      procedure Add_Call (T : Entity_Id) is
4880
         Exp : Node_Id;
4881
 
4882
      begin
4883
         if Present (T) and then Present (Predicate_Function (T)) then
4884
            Set_Has_Predicates (Typ);
4885
 
4886
            --  Build the call to the predicate function of T
4887
 
4888
            Exp :=
4889
              Make_Predicate_Call
4890
                (T, Convert_To (T, Make_Identifier (Loc, Object_Name)));
4891
 
4892
            --  Add call to evolving expression, using AND THEN if needed
4893
 
4894
            if No (Expr) then
4895
               Expr := Exp;
4896
            else
4897
               Expr :=
4898
                 Make_And_Then (Loc,
4899
                   Left_Opnd  => Relocate_Node (Expr),
4900
                   Right_Opnd => Exp);
4901
            end if;
4902
 
4903
            --  Output info message on inheritance if required. Note we do not
4904
            --  give this information for generic actual types, since it is
4905
            --  unwelcome noise in that case in instantiations. We also
4906
            --  generally suppress the message in instantiations, and also
4907
            --  if it involves internal names.
4908
 
4909
            if Opt.List_Inherited_Aspects
4910
              and then not Is_Generic_Actual_Type (Typ)
4911
              and then Instantiation_Depth (Sloc (Typ)) = 0
4912
              and then not Is_Internal_Name (Chars (T))
4913
              and then not Is_Internal_Name (Chars (Typ))
4914
            then
4915
               Error_Msg_Sloc := Sloc (Predicate_Function (T));
4916
               Error_Msg_Node_2 := T;
4917
               Error_Msg_N ("?info: & inherits predicate from & #", Typ);
4918
            end if;
4919
         end if;
4920
      end Add_Call;
4921
 
4922
      --------------------
4923
      -- Add_Predicates --
4924
      --------------------
4925
 
4926
      procedure Add_Predicates is
4927
         Ritem : Node_Id;
4928
         Arg1  : Node_Id;
4929
         Arg2  : Node_Id;
4930
 
4931
         procedure Replace_Type_Reference (N : Node_Id);
4932
         --  Replace a single occurrence N of the subtype name with a reference
4933
         --  to the formal of the predicate function. N can be an identifier
4934
         --  referencing the subtype, or a selected component, representing an
4935
         --  appropriately qualified occurrence of the subtype name.
4936
 
4937
         procedure Replace_Type_References is
4938
           new Replace_Type_References_Generic (Replace_Type_Reference);
4939
         --  Traverse an expression changing every occurrence of an identifier
4940
         --  whose name matches the name of the subtype with a reference to
4941
         --  the formal parameter of the predicate function.
4942
 
4943
         ----------------------------
4944
         -- Replace_Type_Reference --
4945
         ----------------------------
4946
 
4947
         procedure Replace_Type_Reference (N : Node_Id) is
4948
         begin
4949
            Rewrite (N, Make_Identifier (Loc, Object_Name));
4950
            Set_Entity (N, Object_Entity);
4951
            Set_Etype (N, Typ);
4952
         end Replace_Type_Reference;
4953
 
4954
      --  Start of processing for Add_Predicates
4955
 
4956
      begin
4957
         Ritem := First_Rep_Item (Typ);
4958
         while Present (Ritem) loop
4959
            if Nkind (Ritem) = N_Pragma
4960
              and then Pragma_Name (Ritem) = Name_Predicate
4961
            then
4962
               if Present (Corresponding_Aspect (Ritem)) then
4963
                  case Chars (Identifier (Corresponding_Aspect (Ritem))) is
4964
                     when Name_Dynamic_Predicate =>
4965
                        Dynamic_Predicate_Present := True;
4966
                     when Name_Static_Predicate =>
4967
                        Static_Predicate_Present := Ritem;
4968
                     when others =>
4969
                        null;
4970
                  end case;
4971
               end if;
4972
 
4973
               --  Acquire arguments
4974
 
4975
               Arg1 := First (Pragma_Argument_Associations (Ritem));
4976
               Arg2 := Next (Arg1);
4977
 
4978
               Arg1 := Get_Pragma_Arg (Arg1);
4979
               Arg2 := Get_Pragma_Arg (Arg2);
4980
 
4981
               --  See if this predicate pragma is for the current type or for
4982
               --  its full view. A predicate on a private completion is placed
4983
               --  on the partial view beause this is the visible entity that
4984
               --  is frozen.
4985
 
4986
               if Entity (Arg1) = Typ
4987
                 or else Full_View (Entity (Arg1)) = Typ
4988
               then
4989
 
4990
                  --  We have a match, this entry is for our subtype
4991
 
4992
                  --  We need to replace any occurrences of the name of the
4993
                  --  type with references to the object.
4994
 
4995
                  Replace_Type_References (Arg2, Chars (Typ));
4996
 
4997
                  --  If this predicate comes from an aspect, find the aspect
4998
                  --  specification, and replace the saved expression because
4999
                  --  we need the subtype references replaced for the calls to
5000
                  --  Preanalyze_Spec_Expressin in Check_Aspect_At_Freeze_Point
5001
                  --  and Check_Aspect_At_End_Of_Declarations.
5002
 
5003
                  if From_Aspect_Specification (Ritem) then
5004
                     declare
5005
                        Aitem : Node_Id;
5006
 
5007
                     begin
5008
                        --  Loop to find corresponding aspect, note that this
5009
                        --  must be present given the pragma is marked delayed.
5010
 
5011
                        Aitem := Next_Rep_Item (Ritem);
5012
                        loop
5013
                           if Nkind (Aitem) = N_Aspect_Specification
5014
                             and then Aspect_Rep_Item (Aitem) = Ritem
5015
                           then
5016
                              Set_Entity
5017
                                (Identifier (Aitem), New_Copy_Tree (Arg2));
5018
                              exit;
5019
                           end if;
5020
 
5021
                           Aitem := Next_Rep_Item (Aitem);
5022
                        end loop;
5023
                     end;
5024
                  end if;
5025
 
5026
                  --  Now we can add the expression
5027
 
5028
                  if No (Expr) then
5029
                     Expr := Relocate_Node (Arg2);
5030
 
5031
                  --  There already was a predicate, so add to it
5032
 
5033
                  else
5034
                     Expr :=
5035
                       Make_And_Then (Loc,
5036
                         Left_Opnd  => Relocate_Node (Expr),
5037
                         Right_Opnd => Relocate_Node (Arg2));
5038
                  end if;
5039
               end if;
5040
            end if;
5041
 
5042
            Next_Rep_Item (Ritem);
5043
         end loop;
5044
      end Add_Predicates;
5045
 
5046
   --  Start of processing for Build_Predicate_Function
5047
 
5048
   begin
5049
      --  Initialize for construction of statement list
5050
 
5051
      Expr := Empty;
5052
 
5053
      --  Return if already built or if type does not have predicates
5054
 
5055
      if not Has_Predicates (Typ)
5056
        or else Present (Predicate_Function (Typ))
5057
      then
5058
         return;
5059
      end if;
5060
 
5061
      --  Add Predicates for the current type
5062
 
5063
      Add_Predicates;
5064
 
5065
      --  Add predicates for ancestor if present
5066
 
5067
      declare
5068
         Atyp : constant Entity_Id := Nearest_Ancestor (Typ);
5069
      begin
5070
         if Present (Atyp) then
5071
            Add_Call (Atyp);
5072
         end if;
5073
      end;
5074
 
5075
      --  If we have predicates, build the function
5076
 
5077
      if Present (Expr) then
5078
 
5079
         --  Build function declaration
5080
 
5081
         pragma Assert (Has_Predicates (Typ));
5082
         SId :=
5083
           Make_Defining_Identifier (Loc,
5084
             Chars => New_External_Name (Chars (Typ), "Predicate"));
5085
         Set_Has_Predicates (SId);
5086
         Set_Predicate_Function (Typ, SId);
5087
 
5088
         --  The predicate function is shared between views of a type.
5089
 
5090
         if Is_Private_Type (Typ) and then Present (Full_View (Typ)) then
5091
            Set_Predicate_Function (Full_View (Typ), SId);
5092
         end if;
5093
 
5094
         Spec :=
5095
           Make_Function_Specification (Loc,
5096
             Defining_Unit_Name       => SId,
5097
             Parameter_Specifications => New_List (
5098
               Make_Parameter_Specification (Loc,
5099
                 Defining_Identifier => Object_Entity,
5100
                 Parameter_Type      => New_Occurrence_Of (Typ, Loc))),
5101
             Result_Definition        =>
5102
               New_Occurrence_Of (Standard_Boolean, Loc));
5103
 
5104
         FDecl := Make_Subprogram_Declaration (Loc, Specification => Spec);
5105
 
5106
         --  Build function body
5107
 
5108
         SId :=
5109
           Make_Defining_Identifier (Loc,
5110
             Chars => New_External_Name (Chars (Typ), "Predicate"));
5111
 
5112
         Spec :=
5113
           Make_Function_Specification (Loc,
5114
             Defining_Unit_Name       => SId,
5115
             Parameter_Specifications => New_List (
5116
               Make_Parameter_Specification (Loc,
5117
                 Defining_Identifier =>
5118
                   Make_Defining_Identifier (Loc, Object_Name),
5119
                 Parameter_Type =>
5120
                   New_Occurrence_Of (Typ, Loc))),
5121
             Result_Definition        =>
5122
               New_Occurrence_Of (Standard_Boolean, Loc));
5123
 
5124
         FBody :=
5125
           Make_Subprogram_Body (Loc,
5126
             Specification              => Spec,
5127
             Declarations               => Empty_List,
5128
             Handled_Statement_Sequence =>
5129
               Make_Handled_Sequence_Of_Statements (Loc,
5130
                 Statements => New_List (
5131
                   Make_Simple_Return_Statement (Loc,
5132
                     Expression => Expr))));
5133
 
5134
         --  Insert declaration before freeze node and body after
5135
 
5136
         Insert_Before_And_Analyze (N, FDecl);
5137
         Insert_After_And_Analyze  (N, FBody);
5138
 
5139
         --  Deal with static predicate case
5140
 
5141
         if Ekind_In (Typ, E_Enumeration_Subtype,
5142
                           E_Modular_Integer_Subtype,
5143
                           E_Signed_Integer_Subtype)
5144
           and then Is_Static_Subtype (Typ)
5145
           and then not Dynamic_Predicate_Present
5146
         then
5147
            Build_Static_Predicate (Typ, Expr, Object_Name);
5148
 
5149
            if Present (Static_Predicate_Present)
5150
              and No (Static_Predicate (Typ))
5151
            then
5152
               Error_Msg_F
5153
                 ("expression does not have required form for "
5154
                  & "static predicate",
5155
                  Next (First (Pragma_Argument_Associations
5156
                                (Static_Predicate_Present))));
5157
            end if;
5158
         end if;
5159
      end if;
5160
   end Build_Predicate_Function;
5161
 
5162
   ----------------------------
5163
   -- Build_Static_Predicate --
5164
   ----------------------------
5165
 
5166
   procedure Build_Static_Predicate
5167
     (Typ  : Entity_Id;
5168
      Expr : Node_Id;
5169
      Nam  : Name_Id)
5170
   is
5171
      Loc : constant Source_Ptr := Sloc (Expr);
5172
 
5173
      Non_Static : exception;
5174
      --  Raised if something non-static is found
5175
 
5176
      Btyp : constant Entity_Id := Base_Type (Typ);
5177
 
5178
      BLo : constant Uint := Expr_Value (Type_Low_Bound  (Btyp));
5179
      BHi : constant Uint := Expr_Value (Type_High_Bound (Btyp));
5180
      --  Low bound and high bound value of base type of Typ
5181
 
5182
      TLo : constant Uint := Expr_Value (Type_Low_Bound  (Typ));
5183
      THi : constant Uint := Expr_Value (Type_High_Bound (Typ));
5184
      --  Low bound and high bound values of static subtype Typ
5185
 
5186
      type REnt is record
5187
         Lo, Hi : Uint;
5188
      end record;
5189
      --  One entry in a Rlist value, a single REnt (range entry) value
5190
      --  denotes one range from Lo to Hi. To represent a single value
5191
      --  range Lo = Hi = value.
5192
 
5193
      type RList is array (Nat range <>) of REnt;
5194
      --  A list of ranges. The ranges are sorted in increasing order,
5195
      --  and are disjoint (there is a gap of at least one value between
5196
      --  each range in the table). A value is in the set of ranges in
5197
      --  Rlist if it lies within one of these ranges
5198
 
5199
      False_Range : constant RList :=
5200
                      RList'(1 .. 0 => REnt'(No_Uint, No_Uint));
5201
      --  An empty set of ranges represents a range list that can never be
5202
      --  satisfied, since there are no ranges in which the value could lie,
5203
      --  so it does not lie in any of them. False_Range is a canonical value
5204
      --  for this empty set, but general processing should test for an Rlist
5205
      --  with length zero (see Is_False predicate), since other null ranges
5206
      --  may appear which must be treated as False.
5207
 
5208
      True_Range : constant RList := RList'(1 => REnt'(BLo, BHi));
5209
      --  Range representing True, value must be in the base range
5210
 
5211
      function "and" (Left, Right : RList) return RList;
5212
      --  And's together two range lists, returning a range list. This is
5213
      --  a set intersection operation.
5214
 
5215
      function "or" (Left, Right : RList) return RList;
5216
      --  Or's together two range lists, returning a range list. This is a
5217
      --  set union operation.
5218
 
5219
      function "not" (Right : RList) return RList;
5220
      --  Returns complement of a given range list, i.e. a range list
5221
      --  representing all the values in TLo .. THi that are not in the
5222
      --  input operand Right.
5223
 
5224
      function Build_Val (V : Uint) return Node_Id;
5225
      --  Return an analyzed N_Identifier node referencing this value, suitable
5226
      --  for use as an entry in the Static_Predicate list. This node is typed
5227
      --  with the base type.
5228
 
5229
      function Build_Range (Lo, Hi : Uint) return Node_Id;
5230
      --  Return an analyzed N_Range node referencing this range, suitable
5231
      --  for use as an entry in the Static_Predicate list. This node is typed
5232
      --  with the base type.
5233
 
5234
      function Get_RList (Exp : Node_Id) return RList;
5235
      --  This is a recursive routine that converts the given expression into
5236
      --  a list of ranges, suitable for use in building the static predicate.
5237
 
5238
      function Is_False (R : RList) return Boolean;
5239
      pragma Inline (Is_False);
5240
      --  Returns True if the given range list is empty, and thus represents
5241
      --  a False list of ranges that can never be satisfied.
5242
 
5243
      function Is_True (R : RList) return Boolean;
5244
      --  Returns True if R trivially represents the True predicate by having
5245
      --  a single range from BLo to BHi.
5246
 
5247
      function Is_Type_Ref (N : Node_Id) return Boolean;
5248
      pragma Inline (Is_Type_Ref);
5249
      --  Returns if True if N is a reference to the type for the predicate in
5250
      --  the expression (i.e. if it is an identifier whose Chars field matches
5251
      --  the Nam given in the call).
5252
 
5253
      function Lo_Val (N : Node_Id) return Uint;
5254
      --  Given static expression or static range from a Static_Predicate list,
5255
      --  gets expression value or low bound of range.
5256
 
5257
      function Hi_Val (N : Node_Id) return Uint;
5258
      --  Given static expression or static range from a Static_Predicate list,
5259
      --  gets expression value of high bound of range.
5260
 
5261
      function Membership_Entry (N : Node_Id) return RList;
5262
      --  Given a single membership entry (range, value, or subtype), returns
5263
      --  the corresponding range list. Raises Static_Error if not static.
5264
 
5265
      function Membership_Entries (N : Node_Id) return RList;
5266
      --  Given an element on an alternatives list of a membership operation,
5267
      --  returns the range list corresponding to this entry and all following
5268
      --  entries (i.e. returns the "or" of this list of values).
5269
 
5270
      function Stat_Pred (Typ : Entity_Id) return RList;
5271
      --  Given a type, if it has a static predicate, then return the predicate
5272
      --  as a range list, otherwise raise Non_Static.
5273
 
5274
      -----------
5275
      -- "and" --
5276
      -----------
5277
 
5278
      function "and" (Left, Right : RList) return RList is
5279
         FEnt : REnt;
5280
         --  First range of result
5281
 
5282
         SLeft : Nat := Left'First;
5283
         --  Start of rest of left entries
5284
 
5285
         SRight : Nat := Right'First;
5286
         --  Start of rest of right entries
5287
 
5288
      begin
5289
         --  If either range is True, return the other
5290
 
5291
         if Is_True (Left) then
5292
            return Right;
5293
         elsif Is_True (Right) then
5294
            return Left;
5295
         end if;
5296
 
5297
         --  If either range is False, return False
5298
 
5299
         if Is_False (Left) or else Is_False (Right) then
5300
            return False_Range;
5301
         end if;
5302
 
5303
         --  Loop to remove entries at start that are disjoint, and thus
5304
         --  just get discarded from the result entirely.
5305
 
5306
         loop
5307
            --  If no operands left in either operand, result is false
5308
 
5309
            if SLeft > Left'Last or else SRight > Right'Last then
5310
               return False_Range;
5311
 
5312
            --  Discard first left operand entry if disjoint with right
5313
 
5314
            elsif Left (SLeft).Hi < Right (SRight).Lo then
5315
               SLeft := SLeft + 1;
5316
 
5317
            --  Discard first right operand entry if disjoint with left
5318
 
5319
            elsif Right (SRight).Hi < Left (SLeft).Lo then
5320
               SRight := SRight + 1;
5321
 
5322
            --  Otherwise we have an overlapping entry
5323
 
5324
            else
5325
               exit;
5326
            end if;
5327
         end loop;
5328
 
5329
         --  Now we have two non-null operands, and first entries overlap.
5330
         --  The first entry in the result will be the overlapping part of
5331
         --  these two entries.
5332
 
5333
         FEnt := REnt'(Lo => UI_Max (Left (SLeft).Lo, Right (SRight).Lo),
5334
                       Hi => UI_Min (Left (SLeft).Hi, Right (SRight).Hi));
5335
 
5336
         --  Now we can remove the entry that ended at a lower value, since
5337
         --  its contribution is entirely contained in Fent.
5338
 
5339
         if Left (SLeft).Hi <= Right (SRight).Hi then
5340
            SLeft := SLeft + 1;
5341
         else
5342
            SRight := SRight + 1;
5343
         end if;
5344
 
5345
         --  Compute result by concatenating this first entry with the "and"
5346
         --  of the remaining parts of the left and right operands. Note that
5347
         --  if either of these is empty, "and" will yield empty, so that we
5348
         --  will end up with just Fent, which is what we want in that case.
5349
 
5350
         return
5351
           FEnt & (Left (SLeft .. Left'Last) and Right (SRight .. Right'Last));
5352
      end "and";
5353
 
5354
      -----------
5355
      -- "not" --
5356
      -----------
5357
 
5358
      function "not" (Right : RList) return RList is
5359
      begin
5360
         --  Return True if False range
5361
 
5362
         if Is_False (Right) then
5363
            return True_Range;
5364
         end if;
5365
 
5366
         --  Return False if True range
5367
 
5368
         if Is_True (Right) then
5369
            return False_Range;
5370
         end if;
5371
 
5372
         --  Here if not trivial case
5373
 
5374
         declare
5375
            Result : RList (1 .. Right'Length + 1);
5376
            --  May need one more entry for gap at beginning and end
5377
 
5378
            Count : Nat := 0;
5379
            --  Number of entries stored in Result
5380
 
5381
         begin
5382
            --  Gap at start
5383
 
5384
            if Right (Right'First).Lo > TLo then
5385
               Count := Count + 1;
5386
               Result (Count) := REnt'(TLo, Right (Right'First).Lo - 1);
5387
            end if;
5388
 
5389
            --  Gaps between ranges
5390
 
5391
            for J in Right'First .. Right'Last - 1 loop
5392
               Count := Count + 1;
5393
               Result (Count) :=
5394
                 REnt'(Right (J).Hi + 1, Right (J + 1).Lo - 1);
5395
            end loop;
5396
 
5397
            --  Gap at end
5398
 
5399
            if Right (Right'Last).Hi < THi then
5400
               Count := Count + 1;
5401
               Result (Count) := REnt'(Right (Right'Last).Hi + 1, THi);
5402
            end if;
5403
 
5404
            return Result (1 .. Count);
5405
         end;
5406
      end "not";
5407
 
5408
      ----------
5409
      -- "or" --
5410
      ----------
5411
 
5412
      function "or" (Left, Right : RList) return RList is
5413
         FEnt : REnt;
5414
         --  First range of result
5415
 
5416
         SLeft : Nat := Left'First;
5417
         --  Start of rest of left entries
5418
 
5419
         SRight : Nat := Right'First;
5420
         --  Start of rest of right entries
5421
 
5422
      begin
5423
         --  If either range is True, return True
5424
 
5425
         if Is_True (Left) or else Is_True (Right) then
5426
            return True_Range;
5427
         end if;
5428
 
5429
         --  If either range is False (empty), return the other
5430
 
5431
         if Is_False (Left) then
5432
            return Right;
5433
         elsif Is_False (Right) then
5434
            return Left;
5435
         end if;
5436
 
5437
         --  Initialize result first entry from left or right operand
5438
         --  depending on which starts with the lower range.
5439
 
5440
         if Left (SLeft).Lo < Right (SRight).Lo then
5441
            FEnt := Left (SLeft);
5442
            SLeft := SLeft + 1;
5443
         else
5444
            FEnt := Right (SRight);
5445
            SRight := SRight + 1;
5446
         end if;
5447
 
5448
         --  This loop eats ranges from left and right operands that
5449
         --  are contiguous with the first range we are gathering.
5450
 
5451
         loop
5452
            --  Eat first entry in left operand if contiguous or
5453
            --  overlapped by gathered first operand of result.
5454
 
5455
            if SLeft <= Left'Last
5456
              and then Left (SLeft).Lo <= FEnt.Hi + 1
5457
            then
5458
               FEnt.Hi := UI_Max (FEnt.Hi, Left (SLeft).Hi);
5459
               SLeft := SLeft + 1;
5460
 
5461
               --  Eat first entry in right operand if contiguous or
5462
               --  overlapped by gathered right operand of result.
5463
 
5464
            elsif SRight <= Right'Last
5465
              and then Right (SRight).Lo <= FEnt.Hi + 1
5466
            then
5467
               FEnt.Hi := UI_Max (FEnt.Hi, Right (SRight).Hi);
5468
               SRight := SRight + 1;
5469
 
5470
               --  All done if no more entries to eat!
5471
 
5472
            else
5473
               exit;
5474
            end if;
5475
         end loop;
5476
 
5477
         --  Obtain result as the first entry we just computed, concatenated
5478
         --  to the "or" of the remaining results (if one operand is empty,
5479
         --  this will just concatenate with the other
5480
 
5481
         return
5482
           FEnt & (Left (SLeft .. Left'Last) or Right (SRight .. Right'Last));
5483
      end "or";
5484
 
5485
      -----------------
5486
      -- Build_Range --
5487
      -----------------
5488
 
5489
      function Build_Range (Lo, Hi : Uint) return Node_Id is
5490
         Result : Node_Id;
5491
      begin
5492
         if Lo = Hi then
5493
            return Build_Val (Hi);
5494
         else
5495
            Result :=
5496
              Make_Range (Loc,
5497
                Low_Bound  => Build_Val (Lo),
5498
                High_Bound => Build_Val (Hi));
5499
            Set_Etype (Result, Btyp);
5500
            Set_Analyzed (Result);
5501
            return Result;
5502
         end if;
5503
      end Build_Range;
5504
 
5505
      ---------------
5506
      -- Build_Val --
5507
      ---------------
5508
 
5509
      function Build_Val (V : Uint) return Node_Id is
5510
         Result : Node_Id;
5511
 
5512
      begin
5513
         if Is_Enumeration_Type (Typ) then
5514
            Result := Get_Enum_Lit_From_Pos (Typ, V, Loc);
5515
         else
5516
            Result := Make_Integer_Literal (Loc, V);
5517
         end if;
5518
 
5519
         Set_Etype (Result, Btyp);
5520
         Set_Is_Static_Expression (Result);
5521
         Set_Analyzed (Result);
5522
         return Result;
5523
      end Build_Val;
5524
 
5525
      ---------------
5526
      -- Get_RList --
5527
      ---------------
5528
 
5529
      function Get_RList (Exp : Node_Id) return RList is
5530
         Op  : Node_Kind;
5531
         Val : Uint;
5532
 
5533
      begin
5534
         --  Static expression can only be true or false
5535
 
5536
         if Is_OK_Static_Expression (Exp) then
5537
 
5538
            --  For False
5539
 
5540
            if Expr_Value (Exp) = 0 then
5541
               return False_Range;
5542
            else
5543
               return True_Range;
5544
            end if;
5545
         end if;
5546
 
5547
         --  Otherwise test node type
5548
 
5549
         Op := Nkind (Exp);
5550
 
5551
         case Op is
5552
 
5553
            --  And
5554
 
5555
            when N_Op_And | N_And_Then =>
5556
               return Get_RList (Left_Opnd (Exp))
5557
                        and
5558
                      Get_RList (Right_Opnd (Exp));
5559
 
5560
            --  Or
5561
 
5562
            when N_Op_Or | N_Or_Else =>
5563
               return Get_RList (Left_Opnd (Exp))
5564
                        or
5565
                      Get_RList (Right_Opnd (Exp));
5566
 
5567
            --  Not
5568
 
5569
            when N_Op_Not =>
5570
               return not Get_RList (Right_Opnd (Exp));
5571
 
5572
            --  Comparisons of type with static value
5573
 
5574
            when N_Op_Compare =>
5575
               --  Type is left operand
5576
 
5577
               if Is_Type_Ref (Left_Opnd (Exp))
5578
                 and then Is_OK_Static_Expression (Right_Opnd (Exp))
5579
               then
5580
                  Val := Expr_Value (Right_Opnd (Exp));
5581
 
5582
                  --  Typ is right operand
5583
 
5584
               elsif Is_Type_Ref (Right_Opnd (Exp))
5585
                 and then Is_OK_Static_Expression (Left_Opnd (Exp))
5586
               then
5587
                  Val := Expr_Value (Left_Opnd (Exp));
5588
 
5589
                  --  Invert sense of comparison
5590
 
5591
                  case Op is
5592
                     when N_Op_Gt => Op := N_Op_Lt;
5593
                     when N_Op_Lt => Op := N_Op_Gt;
5594
                     when N_Op_Ge => Op := N_Op_Le;
5595
                     when N_Op_Le => Op := N_Op_Ge;
5596
                     when others  => null;
5597
                  end case;
5598
 
5599
                  --  Other cases are non-static
5600
 
5601
               else
5602
                  raise Non_Static;
5603
               end if;
5604
 
5605
               --  Construct range according to comparison operation
5606
 
5607
               case Op is
5608
                  when N_Op_Eq =>
5609
                     return RList'(1 => REnt'(Val, Val));
5610
 
5611
                  when N_Op_Ge =>
5612
                     return RList'(1 => REnt'(Val, BHi));
5613
 
5614
                  when N_Op_Gt =>
5615
                     return RList'(1 => REnt'(Val + 1, BHi));
5616
 
5617
                  when N_Op_Le =>
5618
                     return RList'(1 => REnt'(BLo, Val));
5619
 
5620
                  when N_Op_Lt =>
5621
                     return RList'(1 => REnt'(BLo, Val - 1));
5622
 
5623
                  when N_Op_Ne =>
5624
                     return RList'(REnt'(BLo, Val - 1),
5625
                                   REnt'(Val + 1, BHi));
5626
 
5627
                  when others  =>
5628
                     raise Program_Error;
5629
               end case;
5630
 
5631
            --  Membership (IN)
5632
 
5633
            when N_In =>
5634
               if not Is_Type_Ref (Left_Opnd (Exp)) then
5635
                  raise Non_Static;
5636
               end if;
5637
 
5638
               if Present (Right_Opnd (Exp)) then
5639
                  return Membership_Entry (Right_Opnd (Exp));
5640
               else
5641
                  return Membership_Entries (First (Alternatives (Exp)));
5642
               end if;
5643
 
5644
            --  Negative membership (NOT IN)
5645
 
5646
            when N_Not_In =>
5647
               if not Is_Type_Ref (Left_Opnd (Exp)) then
5648
                  raise Non_Static;
5649
               end if;
5650
 
5651
               if Present (Right_Opnd (Exp)) then
5652
                  return not Membership_Entry (Right_Opnd (Exp));
5653
               else
5654
                  return not Membership_Entries (First (Alternatives (Exp)));
5655
               end if;
5656
 
5657
            --  Function call, may be call to static predicate
5658
 
5659
            when N_Function_Call =>
5660
               if Is_Entity_Name (Name (Exp)) then
5661
                  declare
5662
                     Ent : constant Entity_Id := Entity (Name (Exp));
5663
                  begin
5664
                     if Has_Predicates (Ent) then
5665
                        return Stat_Pred (Etype (First_Formal (Ent)));
5666
                     end if;
5667
                  end;
5668
               end if;
5669
 
5670
               --  Other function call cases are non-static
5671
 
5672
               raise Non_Static;
5673
 
5674
            --  Qualified expression, dig out the expression
5675
 
5676
            when N_Qualified_Expression =>
5677
               return Get_RList (Expression (Exp));
5678
 
5679
            --  Xor operator
5680
 
5681
            when N_Op_Xor =>
5682
               return (Get_RList (Left_Opnd (Exp))
5683
                        and not Get_RList (Right_Opnd (Exp)))
5684
                 or   (Get_RList (Right_Opnd (Exp))
5685
                        and not Get_RList (Left_Opnd (Exp)));
5686
 
5687
            --  Any other node type is non-static
5688
 
5689
            when others =>
5690
               raise Non_Static;
5691
         end case;
5692
      end Get_RList;
5693
 
5694
      ------------
5695
      -- Hi_Val --
5696
      ------------
5697
 
5698
      function Hi_Val (N : Node_Id) return Uint is
5699
      begin
5700
         if Is_Static_Expression (N) then
5701
            return Expr_Value (N);
5702
         else
5703
            pragma Assert (Nkind (N) = N_Range);
5704
            return Expr_Value (High_Bound (N));
5705
         end if;
5706
      end Hi_Val;
5707
 
5708
      --------------
5709
      -- Is_False --
5710
      --------------
5711
 
5712
      function Is_False (R : RList) return Boolean is
5713
      begin
5714
         return R'Length = 0;
5715
      end Is_False;
5716
 
5717
      -------------
5718
      -- Is_True --
5719
      -------------
5720
 
5721
      function Is_True (R : RList) return Boolean is
5722
      begin
5723
         return R'Length = 1
5724
           and then R (R'First).Lo = BLo
5725
           and then R (R'First).Hi = BHi;
5726
      end Is_True;
5727
 
5728
      -----------------
5729
      -- Is_Type_Ref --
5730
      -----------------
5731
 
5732
      function Is_Type_Ref (N : Node_Id) return Boolean is
5733
      begin
5734
         return Nkind (N) = N_Identifier and then Chars (N) = Nam;
5735
      end Is_Type_Ref;
5736
 
5737
      ------------
5738
      -- Lo_Val --
5739
      ------------
5740
 
5741
      function Lo_Val (N : Node_Id) return Uint is
5742
      begin
5743
         if Is_Static_Expression (N) then
5744
            return Expr_Value (N);
5745
         else
5746
            pragma Assert (Nkind (N) = N_Range);
5747
            return Expr_Value (Low_Bound (N));
5748
         end if;
5749
      end Lo_Val;
5750
 
5751
      ------------------------
5752
      -- Membership_Entries --
5753
      ------------------------
5754
 
5755
      function Membership_Entries (N : Node_Id) return RList is
5756
      begin
5757
         if No (Next (N)) then
5758
            return Membership_Entry (N);
5759
         else
5760
            return Membership_Entry (N) or Membership_Entries (Next (N));
5761
         end if;
5762
      end Membership_Entries;
5763
 
5764
      ----------------------
5765
      -- Membership_Entry --
5766
      ----------------------
5767
 
5768
      function Membership_Entry (N : Node_Id) return RList is
5769
         Val : Uint;
5770
         SLo : Uint;
5771
         SHi : Uint;
5772
 
5773
      begin
5774
         --  Range case
5775
 
5776
         if Nkind (N) = N_Range then
5777
            if not Is_Static_Expression (Low_Bound (N))
5778
                 or else
5779
               not Is_Static_Expression (High_Bound (N))
5780
            then
5781
               raise Non_Static;
5782
            else
5783
               SLo := Expr_Value (Low_Bound  (N));
5784
               SHi := Expr_Value (High_Bound (N));
5785
               return RList'(1 => REnt'(SLo, SHi));
5786
            end if;
5787
 
5788
         --  Static expression case
5789
 
5790
         elsif Is_Static_Expression (N) then
5791
            Val := Expr_Value (N);
5792
            return RList'(1 => REnt'(Val, Val));
5793
 
5794
         --  Identifier (other than static expression) case
5795
 
5796
         else pragma Assert (Nkind (N) = N_Identifier);
5797
 
5798
            --  Type case
5799
 
5800
            if Is_Type (Entity (N)) then
5801
 
5802
               --  If type has predicates, process them
5803
 
5804
               if Has_Predicates (Entity (N)) then
5805
                  return Stat_Pred (Entity (N));
5806
 
5807
               --  For static subtype without predicates, get range
5808
 
5809
               elsif Is_Static_Subtype (Entity (N)) then
5810
                  SLo := Expr_Value (Type_Low_Bound  (Entity (N)));
5811
                  SHi := Expr_Value (Type_High_Bound (Entity (N)));
5812
                  return RList'(1 => REnt'(SLo, SHi));
5813
 
5814
               --  Any other type makes us non-static
5815
 
5816
               else
5817
                  raise Non_Static;
5818
               end if;
5819
 
5820
            --  Any other kind of identifier in predicate (e.g. a non-static
5821
            --  expression value) means this is not a static predicate.
5822
 
5823
            else
5824
               raise Non_Static;
5825
            end if;
5826
         end if;
5827
      end Membership_Entry;
5828
 
5829
      ---------------
5830
      -- Stat_Pred --
5831
      ---------------
5832
 
5833
      function Stat_Pred (Typ : Entity_Id) return RList is
5834
      begin
5835
         --  Not static if type does not have static predicates
5836
 
5837
         if not Has_Predicates (Typ)
5838
           or else No (Static_Predicate (Typ))
5839
         then
5840
            raise Non_Static;
5841
         end if;
5842
 
5843
         --  Otherwise we convert the predicate list to a range list
5844
 
5845
         declare
5846
            Result : RList (1 .. List_Length (Static_Predicate (Typ)));
5847
            P      : Node_Id;
5848
 
5849
         begin
5850
            P := First (Static_Predicate (Typ));
5851
            for J in Result'Range loop
5852
               Result (J) := REnt'(Lo_Val (P), Hi_Val (P));
5853
               Next (P);
5854
            end loop;
5855
 
5856
            return Result;
5857
         end;
5858
      end Stat_Pred;
5859
 
5860
   --  Start of processing for Build_Static_Predicate
5861
 
5862
   begin
5863
      --  Now analyze the expression to see if it is a static predicate
5864
 
5865
      declare
5866
         Ranges : constant RList := Get_RList (Expr);
5867
         --  Range list from expression if it is static
5868
 
5869
         Plist : List_Id;
5870
 
5871
      begin
5872
         --  Convert range list into a form for the static predicate. In the
5873
         --  Ranges array, we just have raw ranges, these must be converted
5874
         --  to properly typed and analyzed static expressions or range nodes.
5875
 
5876
         --  Note: here we limit ranges to the ranges of the subtype, so that
5877
         --  a predicate is always false for values outside the subtype. That
5878
         --  seems fine, such values are invalid anyway, and considering them
5879
         --  to fail the predicate seems allowed and friendly, and furthermore
5880
         --  simplifies processing for case statements and loops.
5881
 
5882
         Plist := New_List;
5883
 
5884
         for J in Ranges'Range loop
5885
            declare
5886
               Lo : Uint := Ranges (J).Lo;
5887
               Hi : Uint := Ranges (J).Hi;
5888
 
5889
            begin
5890
               --  Ignore completely out of range entry
5891
 
5892
               if Hi < TLo or else Lo > THi then
5893
                  null;
5894
 
5895
                  --  Otherwise process entry
5896
 
5897
               else
5898
                  --  Adjust out of range value to subtype range
5899
 
5900
                  if Lo < TLo then
5901
                     Lo := TLo;
5902
                  end if;
5903
 
5904
                  if Hi > THi then
5905
                     Hi := THi;
5906
                  end if;
5907
 
5908
                  --  Convert range into required form
5909
 
5910
                  if Lo = Hi then
5911
                     Append_To (Plist, Build_Val (Lo));
5912
                  else
5913
                     Append_To (Plist, Build_Range (Lo, Hi));
5914
                  end if;
5915
               end if;
5916
            end;
5917
         end loop;
5918
 
5919
         --  Processing was successful and all entries were static, so now we
5920
         --  can store the result as the predicate list.
5921
 
5922
         Set_Static_Predicate (Typ, Plist);
5923
 
5924
         --  The processing for static predicates put the expression into
5925
         --  canonical form as a series of ranges. It also eliminated
5926
         --  duplicates and collapsed and combined ranges. We might as well
5927
         --  replace the alternatives list of the right operand of the
5928
         --  membership test with the static predicate list, which will
5929
         --  usually be more efficient.
5930
 
5931
         declare
5932
            New_Alts : constant List_Id := New_List;
5933
            Old_Node : Node_Id;
5934
            New_Node : Node_Id;
5935
 
5936
         begin
5937
            Old_Node := First (Plist);
5938
            while Present (Old_Node) loop
5939
               New_Node := New_Copy (Old_Node);
5940
 
5941
               if Nkind (New_Node) = N_Range then
5942
                  Set_Low_Bound  (New_Node, New_Copy (Low_Bound  (Old_Node)));
5943
                  Set_High_Bound (New_Node, New_Copy (High_Bound (Old_Node)));
5944
               end if;
5945
 
5946
               Append_To (New_Alts, New_Node);
5947
               Next (Old_Node);
5948
            end loop;
5949
 
5950
            --  If empty list, replace by False
5951
 
5952
            if Is_Empty_List (New_Alts) then
5953
               Rewrite (Expr, New_Occurrence_Of (Standard_False, Loc));
5954
 
5955
            --  Else replace by set membership test
5956
 
5957
            else
5958
               Rewrite (Expr,
5959
                 Make_In (Loc,
5960
                   Left_Opnd    => Make_Identifier (Loc, Nam),
5961
                   Right_Opnd   => Empty,
5962
                   Alternatives => New_Alts));
5963
 
5964
               --  Resolve new expression in function context
5965
 
5966
               Install_Formals (Predicate_Function (Typ));
5967
               Push_Scope (Predicate_Function (Typ));
5968
               Analyze_And_Resolve (Expr, Standard_Boolean);
5969
               Pop_Scope;
5970
            end if;
5971
         end;
5972
      end;
5973
 
5974
   --  If non-static, return doing nothing
5975
 
5976
   exception
5977
      when Non_Static =>
5978
         return;
5979
   end Build_Static_Predicate;
5980
 
5981
   -----------------------------------------
5982
   -- Check_Aspect_At_End_Of_Declarations --
5983
   -----------------------------------------
5984
 
5985
   procedure Check_Aspect_At_End_Of_Declarations (ASN : Node_Id) is
5986
      Ent   : constant Entity_Id := Entity     (ASN);
5987
      Ident : constant Node_Id   := Identifier (ASN);
5988
 
5989
      Freeze_Expr : constant Node_Id := Expression (ASN);
5990
      --  Expression from call to Check_Aspect_At_Freeze_Point
5991
 
5992
      End_Decl_Expr : constant Node_Id := Entity (Ident);
5993
      --  Expression to be analyzed at end of declarations
5994
 
5995
      T : constant Entity_Id := Etype (Freeze_Expr);
5996
      --  Type required for preanalyze call
5997
 
5998
      A_Id : constant Aspect_Id := Get_Aspect_Id (Chars (Ident));
5999
 
6000
      Err : Boolean;
6001
      --  Set False if error
6002
 
6003
      --  On entry to this procedure, Entity (Ident) contains a copy of the
6004
      --  original expression from the aspect, saved for this purpose, and
6005
      --  but Expression (Ident) is a preanalyzed copy of the expression,
6006
      --  preanalyzed just after the freeze point.
6007
 
6008
   begin
6009
      --  Case of stream attributes, just have to compare entities
6010
 
6011
      if A_Id = Aspect_Input  or else
6012
         A_Id = Aspect_Output or else
6013
         A_Id = Aspect_Read   or else
6014
         A_Id = Aspect_Write
6015
      then
6016
         Analyze (End_Decl_Expr);
6017
         Err := Entity (End_Decl_Expr) /= Entity (Freeze_Expr);
6018
 
6019
      elsif A_Id = Aspect_Variable_Indexing or else
6020
            A_Id = Aspect_Constant_Indexing or else
6021
            A_Id = Aspect_Default_Iterator  or else
6022
            A_Id = Aspect_Iterator_Element
6023
      then
6024
         --  Make type unfrozen before analysis, to prevent spurious errors
6025
         --  about late attributes.
6026
 
6027
         Set_Is_Frozen (Ent, False);
6028
         Analyze (End_Decl_Expr);
6029
         Analyze (Aspect_Rep_Item (ASN));
6030
         Set_Is_Frozen (Ent, True);
6031
 
6032
         --  If the end of declarations comes before any other freeze
6033
         --  point, the Freeze_Expr is not analyzed: no check needed.
6034
 
6035
         Err :=
6036
           Analyzed (Freeze_Expr)
6037
             and then not In_Instance
6038
             and then Entity (End_Decl_Expr) /= Entity (Freeze_Expr);
6039
 
6040
      --  All other cases
6041
 
6042
      else
6043
         --  In a generic context the aspect expressions have not been
6044
         --  preanalyzed, so do it now. There are no conformance checks
6045
         --  to perform in this case.
6046
 
6047
         if No (T) then
6048
            Check_Aspect_At_Freeze_Point (ASN);
6049
            return;
6050
 
6051
         --  The default values attributes may be defined in the private part,
6052
         --  and the analysis of the expression may take place when only the
6053
         --  partial view is visible. The expression must be scalar, so use
6054
         --  the full view to resolve.
6055
 
6056
         elsif (A_Id = Aspect_Default_Value
6057
                  or else
6058
                A_Id = Aspect_Default_Component_Value)
6059
            and then Is_Private_Type (T)
6060
         then
6061
            Preanalyze_Spec_Expression (End_Decl_Expr, Full_View (T));
6062
         else
6063
            Preanalyze_Spec_Expression (End_Decl_Expr, T);
6064
         end if;
6065
 
6066
         Err := not Fully_Conformant_Expressions (End_Decl_Expr, Freeze_Expr);
6067
      end if;
6068
 
6069
      --  Output error message if error
6070
 
6071
      if Err then
6072
         Error_Msg_NE
6073
           ("visibility of aspect for& changes after freeze point",
6074
            ASN, Ent);
6075
         Error_Msg_NE
6076
           ("?info: & is frozen here, aspects evaluated at this point",
6077
            Freeze_Node (Ent), Ent);
6078
      end if;
6079
   end Check_Aspect_At_End_Of_Declarations;
6080
 
6081
   ----------------------------------
6082
   -- Check_Aspect_At_Freeze_Point --
6083
   ----------------------------------
6084
 
6085
   procedure Check_Aspect_At_Freeze_Point (ASN : Node_Id) is
6086
      Ident : constant Node_Id := Identifier (ASN);
6087
      --  Identifier (use Entity field to save expression)
6088
 
6089
      T : Entity_Id;
6090
      --  Type required for preanalyze call
6091
 
6092
      A_Id : constant Aspect_Id := Get_Aspect_Id (Chars (Ident));
6093
 
6094
   begin
6095
      --  On entry to this procedure, Entity (Ident) contains a copy of the
6096
      --  original expression from the aspect, saved for this purpose.
6097
 
6098
      --  On exit from this procedure Entity (Ident) is unchanged, still
6099
      --  containing that copy, but Expression (Ident) is a preanalyzed copy
6100
      --  of the expression, preanalyzed just after the freeze point.
6101
 
6102
      --  Make a copy of the expression to be preanalyed
6103
 
6104
      Set_Expression (ASN, New_Copy_Tree (Entity (Ident)));
6105
 
6106
      --  Find type for preanalyze call
6107
 
6108
      case A_Id is
6109
 
6110
         --  No_Aspect should be impossible
6111
 
6112
         when No_Aspect =>
6113
            raise Program_Error;
6114
 
6115
         --  Library unit aspects should be impossible (never delayed)
6116
 
6117
         when Library_Unit_Aspects =>
6118
            raise Program_Error;
6119
 
6120
         --  Aspects taking an optional boolean argument. Should be impossible
6121
         --  since these are never delayed.
6122
 
6123
         when Boolean_Aspects =>
6124
            raise Program_Error;
6125
 
6126
         --  Test_Case aspect applies to entries and subprograms, hence should
6127
         --  never be delayed.
6128
 
6129
         when Aspect_Test_Case =>
6130
            raise Program_Error;
6131
 
6132
         when Aspect_Attach_Handler =>
6133
            T := RTE (RE_Interrupt_ID);
6134
 
6135
         --  Default_Value is resolved with the type entity in question
6136
 
6137
         when Aspect_Default_Value =>
6138
            T := Entity (ASN);
6139
 
6140
         --  Default_Component_Value is resolved with the component type
6141
 
6142
         when Aspect_Default_Component_Value =>
6143
            T := Component_Type (Entity (ASN));
6144
 
6145
         --  Aspects corresponding to attribute definition clauses
6146
 
6147
         when Aspect_Address =>
6148
            T := RTE (RE_Address);
6149
 
6150
         when Aspect_Bit_Order =>
6151
            T := RTE (RE_Bit_Order);
6152
 
6153
         when Aspect_CPU =>
6154
            T := RTE (RE_CPU_Range);
6155
 
6156
         when Aspect_Dispatching_Domain =>
6157
            T := RTE (RE_Dispatching_Domain);
6158
 
6159
         when Aspect_External_Tag =>
6160
            T := Standard_String;
6161
 
6162
         when Aspect_Priority | Aspect_Interrupt_Priority =>
6163
            T := Standard_Integer;
6164
 
6165
         when Aspect_Small =>
6166
            T := Universal_Real;
6167
 
6168
         --  For a simple storage pool, we have to retrieve the type of the
6169
         --  pool object associated with the aspect's corresponding attribute
6170
         --  definition clause.
6171
 
6172
         when Aspect_Simple_Storage_Pool =>
6173
            T := Etype (Expression (Aspect_Rep_Item (ASN)));
6174
 
6175
         when Aspect_Storage_Pool =>
6176
            T := Class_Wide_Type (RTE (RE_Root_Storage_Pool));
6177
 
6178
         when Aspect_Alignment      |
6179
              Aspect_Component_Size |
6180
              Aspect_Machine_Radix  |
6181
              Aspect_Object_Size    |
6182
              Aspect_Size           |
6183
              Aspect_Storage_Size   |
6184
              Aspect_Stream_Size    |
6185
              Aspect_Value_Size     =>
6186
            T := Any_Integer;
6187
 
6188
         --  Stream attribute. Special case, the expression is just an entity
6189
         --  that does not need any resolution, so just analyze.
6190
 
6191
         when Aspect_Input  |
6192
              Aspect_Output |
6193
              Aspect_Read   |
6194
              Aspect_Write  =>
6195
            Analyze (Expression (ASN));
6196
            return;
6197
 
6198
         --  Same for Iterator aspects, where the expression is a function
6199
         --  name. Legality rules are checked separately.
6200
 
6201
         when Aspect_Constant_Indexing    |
6202
              Aspect_Default_Iterator     |
6203
              Aspect_Iterator_Element     |
6204
              Aspect_Implicit_Dereference |
6205
              Aspect_Variable_Indexing    =>
6206
            Analyze (Expression (ASN));
6207
            return;
6208
 
6209
         --  Suppress/Unsuppress/Synchronization/Warnings should not be delayed
6210
 
6211
         when Aspect_Suppress        |
6212
              Aspect_Unsuppress      |
6213
              Aspect_Synchronization |
6214
              Aspect_Warnings        =>
6215
            raise Program_Error;
6216
 
6217
         --  Pre/Post/Invariant/Predicate take boolean expressions
6218
 
6219
         when Aspect_Dynamic_Predicate |
6220
              Aspect_Invariant         |
6221
              Aspect_Pre               |
6222
              Aspect_Precondition      |
6223
              Aspect_Post              |
6224
              Aspect_Postcondition     |
6225
              Aspect_Predicate         |
6226
              Aspect_Static_Predicate  |
6227
              Aspect_Type_Invariant    =>
6228
            T := Standard_Boolean;
6229
 
6230
         when Aspect_Dimension        |
6231
              Aspect_Dimension_System =>
6232
            raise Program_Error;
6233
 
6234
      end case;
6235
 
6236
      --  Do the preanalyze call
6237
 
6238
      Preanalyze_Spec_Expression (Expression (ASN), T);
6239
   end Check_Aspect_At_Freeze_Point;
6240
 
6241
   -----------------------------------
6242
   -- Check_Constant_Address_Clause --
6243
   -----------------------------------
6244
 
6245
   procedure Check_Constant_Address_Clause
6246
     (Expr  : Node_Id;
6247
      U_Ent : Entity_Id)
6248
   is
6249
      procedure Check_At_Constant_Address (Nod : Node_Id);
6250
      --  Checks that the given node N represents a name whose 'Address is
6251
      --  constant (in the same sense as OK_Constant_Address_Clause, i.e. the
6252
      --  address value is the same at the point of declaration of U_Ent and at
6253
      --  the time of elaboration of the address clause.
6254
 
6255
      procedure Check_Expr_Constants (Nod : Node_Id);
6256
      --  Checks that Nod meets the requirements for a constant address clause
6257
      --  in the sense of the enclosing procedure.
6258
 
6259
      procedure Check_List_Constants (Lst : List_Id);
6260
      --  Check that all elements of list Lst meet the requirements for a
6261
      --  constant address clause in the sense of the enclosing procedure.
6262
 
6263
      -------------------------------
6264
      -- Check_At_Constant_Address --
6265
      -------------------------------
6266
 
6267
      procedure Check_At_Constant_Address (Nod : Node_Id) is
6268
      begin
6269
         if Is_Entity_Name (Nod) then
6270
            if Present (Address_Clause (Entity ((Nod)))) then
6271
               Error_Msg_NE
6272
                 ("invalid address clause for initialized object &!",
6273
                           Nod, U_Ent);
6274
               Error_Msg_NE
6275
                 ("address for& cannot" &
6276
                    " depend on another address clause! (RM 13.1(22))!",
6277
                  Nod, U_Ent);
6278
 
6279
            elsif In_Same_Source_Unit (Entity (Nod), U_Ent)
6280
              and then Sloc (U_Ent) < Sloc (Entity (Nod))
6281
            then
6282
               Error_Msg_NE
6283
                 ("invalid address clause for initialized object &!",
6284
                  Nod, U_Ent);
6285
               Error_Msg_Node_2 := U_Ent;
6286
               Error_Msg_NE
6287
                 ("\& must be defined before & (RM 13.1(22))!",
6288
                  Nod, Entity (Nod));
6289
            end if;
6290
 
6291
         elsif Nkind (Nod) = N_Selected_Component then
6292
            declare
6293
               T : constant Entity_Id := Etype (Prefix (Nod));
6294
 
6295
            begin
6296
               if (Is_Record_Type (T)
6297
                    and then Has_Discriminants (T))
6298
                 or else
6299
                  (Is_Access_Type (T)
6300
                     and then Is_Record_Type (Designated_Type (T))
6301
                     and then Has_Discriminants (Designated_Type (T)))
6302
               then
6303
                  Error_Msg_NE
6304
                    ("invalid address clause for initialized object &!",
6305
                     Nod, U_Ent);
6306
                  Error_Msg_N
6307
                    ("\address cannot depend on component" &
6308
                     " of discriminated record (RM 13.1(22))!",
6309
                     Nod);
6310
               else
6311
                  Check_At_Constant_Address (Prefix (Nod));
6312
               end if;
6313
            end;
6314
 
6315
         elsif Nkind (Nod) = N_Indexed_Component then
6316
            Check_At_Constant_Address (Prefix (Nod));
6317
            Check_List_Constants (Expressions (Nod));
6318
 
6319
         else
6320
            Check_Expr_Constants (Nod);
6321
         end if;
6322
      end Check_At_Constant_Address;
6323
 
6324
      --------------------------
6325
      -- Check_Expr_Constants --
6326
      --------------------------
6327
 
6328
      procedure Check_Expr_Constants (Nod : Node_Id) is
6329
         Loc_U_Ent : constant Source_Ptr := Sloc (U_Ent);
6330
         Ent       : Entity_Id           := Empty;
6331
 
6332
      begin
6333
         if Nkind (Nod) in N_Has_Etype
6334
           and then Etype (Nod) = Any_Type
6335
         then
6336
            return;
6337
         end if;
6338
 
6339
         case Nkind (Nod) is
6340
            when N_Empty | N_Error =>
6341
               return;
6342
 
6343
            when N_Identifier | N_Expanded_Name =>
6344
               Ent := Entity (Nod);
6345
 
6346
               --  We need to look at the original node if it is different
6347
               --  from the node, since we may have rewritten things and
6348
               --  substituted an identifier representing the rewrite.
6349
 
6350
               if Original_Node (Nod) /= Nod then
6351
                  Check_Expr_Constants (Original_Node (Nod));
6352
 
6353
                  --  If the node is an object declaration without initial
6354
                  --  value, some code has been expanded, and the expression
6355
                  --  is not constant, even if the constituents might be
6356
                  --  acceptable, as in A'Address + offset.
6357
 
6358
                  if Ekind (Ent) = E_Variable
6359
                    and then
6360
                      Nkind (Declaration_Node (Ent)) = N_Object_Declaration
6361
                    and then
6362
                      No (Expression (Declaration_Node (Ent)))
6363
                  then
6364
                     Error_Msg_NE
6365
                       ("invalid address clause for initialized object &!",
6366
                        Nod, U_Ent);
6367
 
6368
                  --  If entity is constant, it may be the result of expanding
6369
                  --  a check. We must verify that its declaration appears
6370
                  --  before the object in question, else we also reject the
6371
                  --  address clause.
6372
 
6373
                  elsif Ekind (Ent) = E_Constant
6374
                    and then In_Same_Source_Unit (Ent, U_Ent)
6375
                    and then Sloc (Ent) > Loc_U_Ent
6376
                  then
6377
                     Error_Msg_NE
6378
                       ("invalid address clause for initialized object &!",
6379
                        Nod, U_Ent);
6380
                  end if;
6381
 
6382
                  return;
6383
               end if;
6384
 
6385
               --  Otherwise look at the identifier and see if it is OK
6386
 
6387
               if Ekind_In (Ent, E_Named_Integer, E_Named_Real)
6388
                 or else Is_Type (Ent)
6389
               then
6390
                  return;
6391
 
6392
               elsif
6393
                  Ekind (Ent) = E_Constant
6394
                    or else
6395
                  Ekind (Ent) = E_In_Parameter
6396
               then
6397
                  --  This is the case where we must have Ent defined before
6398
                  --  U_Ent. Clearly if they are in different units this
6399
                  --  requirement is met since the unit containing Ent is
6400
                  --  already processed.
6401
 
6402
                  if not In_Same_Source_Unit (Ent, U_Ent) then
6403
                     return;
6404
 
6405
                  --  Otherwise location of Ent must be before the location
6406
                  --  of U_Ent, that's what prior defined means.
6407
 
6408
                  elsif Sloc (Ent) < Loc_U_Ent then
6409
                     return;
6410
 
6411
                  else
6412
                     Error_Msg_NE
6413
                       ("invalid address clause for initialized object &!",
6414
                        Nod, U_Ent);
6415
                     Error_Msg_Node_2 := U_Ent;
6416
                     Error_Msg_NE
6417
                       ("\& must be defined before & (RM 13.1(22))!",
6418
                        Nod, Ent);
6419
                  end if;
6420
 
6421
               elsif Nkind (Original_Node (Nod)) = N_Function_Call then
6422
                  Check_Expr_Constants (Original_Node (Nod));
6423
 
6424
               else
6425
                  Error_Msg_NE
6426
                    ("invalid address clause for initialized object &!",
6427
                     Nod, U_Ent);
6428
 
6429
                  if Comes_From_Source (Ent) then
6430
                     Error_Msg_NE
6431
                       ("\reference to variable& not allowed"
6432
                          & " (RM 13.1(22))!", Nod, Ent);
6433
                  else
6434
                     Error_Msg_N
6435
                       ("non-static expression not allowed"
6436
                          & " (RM 13.1(22))!", Nod);
6437
                  end if;
6438
               end if;
6439
 
6440
            when N_Integer_Literal   =>
6441
 
6442
               --  If this is a rewritten unchecked conversion, in a system
6443
               --  where Address is an integer type, always use the base type
6444
               --  for a literal value. This is user-friendly and prevents
6445
               --  order-of-elaboration issues with instances of unchecked
6446
               --  conversion.
6447
 
6448
               if Nkind (Original_Node (Nod)) = N_Function_Call then
6449
                  Set_Etype (Nod, Base_Type (Etype (Nod)));
6450
               end if;
6451
 
6452
            when N_Real_Literal      |
6453
                 N_String_Literal    |
6454
                 N_Character_Literal =>
6455
               return;
6456
 
6457
            when N_Range =>
6458
               Check_Expr_Constants (Low_Bound (Nod));
6459
               Check_Expr_Constants (High_Bound (Nod));
6460
 
6461
            when N_Explicit_Dereference =>
6462
               Check_Expr_Constants (Prefix (Nod));
6463
 
6464
            when N_Indexed_Component =>
6465
               Check_Expr_Constants (Prefix (Nod));
6466
               Check_List_Constants (Expressions (Nod));
6467
 
6468
            when N_Slice =>
6469
               Check_Expr_Constants (Prefix (Nod));
6470
               Check_Expr_Constants (Discrete_Range (Nod));
6471
 
6472
            when N_Selected_Component =>
6473
               Check_Expr_Constants (Prefix (Nod));
6474
 
6475
            when N_Attribute_Reference =>
6476
               if Attribute_Name (Nod) = Name_Address
6477
                   or else
6478
                  Attribute_Name (Nod) = Name_Access
6479
                    or else
6480
                  Attribute_Name (Nod) = Name_Unchecked_Access
6481
                    or else
6482
                  Attribute_Name (Nod) = Name_Unrestricted_Access
6483
               then
6484
                  Check_At_Constant_Address (Prefix (Nod));
6485
 
6486
               else
6487
                  Check_Expr_Constants (Prefix (Nod));
6488
                  Check_List_Constants (Expressions (Nod));
6489
               end if;
6490
 
6491
            when N_Aggregate =>
6492
               Check_List_Constants (Component_Associations (Nod));
6493
               Check_List_Constants (Expressions (Nod));
6494
 
6495
            when N_Component_Association =>
6496
               Check_Expr_Constants (Expression (Nod));
6497
 
6498
            when N_Extension_Aggregate =>
6499
               Check_Expr_Constants (Ancestor_Part (Nod));
6500
               Check_List_Constants (Component_Associations (Nod));
6501
               Check_List_Constants (Expressions (Nod));
6502
 
6503
            when N_Null =>
6504
               return;
6505
 
6506
            when N_Binary_Op | N_Short_Circuit | N_Membership_Test =>
6507
               Check_Expr_Constants (Left_Opnd (Nod));
6508
               Check_Expr_Constants (Right_Opnd (Nod));
6509
 
6510
            when N_Unary_Op =>
6511
               Check_Expr_Constants (Right_Opnd (Nod));
6512
 
6513
            when N_Type_Conversion           |
6514
                 N_Qualified_Expression      |
6515
                 N_Allocator                 =>
6516
               Check_Expr_Constants (Expression (Nod));
6517
 
6518
            when N_Unchecked_Type_Conversion =>
6519
               Check_Expr_Constants (Expression (Nod));
6520
 
6521
               --  If this is a rewritten unchecked conversion, subtypes in
6522
               --  this node are those created within the instance. To avoid
6523
               --  order of elaboration issues, replace them with their base
6524
               --  types. Note that address clauses can cause order of
6525
               --  elaboration problems because they are elaborated by the
6526
               --  back-end at the point of definition, and may mention
6527
               --  entities declared in between (as long as everything is
6528
               --  static). It is user-friendly to allow unchecked conversions
6529
               --  in this context.
6530
 
6531
               if Nkind (Original_Node (Nod)) = N_Function_Call then
6532
                  Set_Etype (Expression (Nod),
6533
                    Base_Type (Etype (Expression (Nod))));
6534
                  Set_Etype (Nod, Base_Type (Etype (Nod)));
6535
               end if;
6536
 
6537
            when N_Function_Call =>
6538
               if not Is_Pure (Entity (Name (Nod))) then
6539
                  Error_Msg_NE
6540
                    ("invalid address clause for initialized object &!",
6541
                     Nod, U_Ent);
6542
 
6543
                  Error_Msg_NE
6544
                    ("\function & is not pure (RM 13.1(22))!",
6545
                     Nod, Entity (Name (Nod)));
6546
 
6547
               else
6548
                  Check_List_Constants (Parameter_Associations (Nod));
6549
               end if;
6550
 
6551
            when N_Parameter_Association =>
6552
               Check_Expr_Constants (Explicit_Actual_Parameter (Nod));
6553
 
6554
            when others =>
6555
               Error_Msg_NE
6556
                 ("invalid address clause for initialized object &!",
6557
                  Nod, U_Ent);
6558
               Error_Msg_NE
6559
                 ("\must be constant defined before& (RM 13.1(22))!",
6560
                  Nod, U_Ent);
6561
         end case;
6562
      end Check_Expr_Constants;
6563
 
6564
      --------------------------
6565
      -- Check_List_Constants --
6566
      --------------------------
6567
 
6568
      procedure Check_List_Constants (Lst : List_Id) is
6569
         Nod1 : Node_Id;
6570
 
6571
      begin
6572
         if Present (Lst) then
6573
            Nod1 := First (Lst);
6574
            while Present (Nod1) loop
6575
               Check_Expr_Constants (Nod1);
6576
               Next (Nod1);
6577
            end loop;
6578
         end if;
6579
      end Check_List_Constants;
6580
 
6581
   --  Start of processing for Check_Constant_Address_Clause
6582
 
6583
   begin
6584
      --  If rep_clauses are to be ignored, no need for legality checks. In
6585
      --  particular, no need to pester user about rep clauses that violate
6586
      --  the rule on constant addresses, given that these clauses will be
6587
      --  removed by Freeze before they reach the back end.
6588
 
6589
      if not Ignore_Rep_Clauses then
6590
         Check_Expr_Constants (Expr);
6591
      end if;
6592
   end Check_Constant_Address_Clause;
6593
 
6594
   ----------------------------------------
6595
   -- Check_Record_Representation_Clause --
6596
   ----------------------------------------
6597
 
6598
   procedure Check_Record_Representation_Clause (N : Node_Id) is
6599
      Loc     : constant Source_Ptr := Sloc (N);
6600
      Ident   : constant Node_Id    := Identifier (N);
6601
      Rectype : Entity_Id;
6602
      Fent    : Entity_Id;
6603
      CC      : Node_Id;
6604
      Fbit    : Uint;
6605
      Lbit    : Uint;
6606
      Hbit    : Uint := Uint_0;
6607
      Comp    : Entity_Id;
6608
      Pcomp   : Entity_Id;
6609
 
6610
      Max_Bit_So_Far : Uint;
6611
      --  Records the maximum bit position so far. If all field positions
6612
      --  are monotonically increasing, then we can skip the circuit for
6613
      --  checking for overlap, since no overlap is possible.
6614
 
6615
      Tagged_Parent : Entity_Id := Empty;
6616
      --  This is set in the case of a derived tagged type for which we have
6617
      --  Is_Fully_Repped_Tagged_Type True (indicating that all components are
6618
      --  positioned by record representation clauses). In this case we must
6619
      --  check for overlap between components of this tagged type, and the
6620
      --  components of its parent. Tagged_Parent will point to this parent
6621
      --  type. For all other cases Tagged_Parent is left set to Empty.
6622
 
6623
      Parent_Last_Bit : Uint;
6624
      --  Relevant only if Tagged_Parent is set, Parent_Last_Bit indicates the
6625
      --  last bit position for any field in the parent type. We only need to
6626
      --  check overlap for fields starting below this point.
6627
 
6628
      Overlap_Check_Required : Boolean;
6629
      --  Used to keep track of whether or not an overlap check is required
6630
 
6631
      Overlap_Detected : Boolean := False;
6632
      --  Set True if an overlap is detected
6633
 
6634
      Ccount : Natural := 0;
6635
      --  Number of component clauses in record rep clause
6636
 
6637
      procedure Check_Component_Overlap (C1_Ent, C2_Ent : Entity_Id);
6638
      --  Given two entities for record components or discriminants, checks
6639
      --  if they have overlapping component clauses and issues errors if so.
6640
 
6641
      procedure Find_Component;
6642
      --  Finds component entity corresponding to current component clause (in
6643
      --  CC), and sets Comp to the entity, and Fbit/Lbit to the zero origin
6644
      --  start/stop bits for the field. If there is no matching component or
6645
      --  if the matching component does not have a component clause, then
6646
      --  that's an error and Comp is set to Empty, but no error message is
6647
      --  issued, since the message was already given. Comp is also set to
6648
      --  Empty if the current "component clause" is in fact a pragma.
6649
 
6650
      -----------------------------
6651
      -- Check_Component_Overlap --
6652
      -----------------------------
6653
 
6654
      procedure Check_Component_Overlap (C1_Ent, C2_Ent : Entity_Id) is
6655
         CC1 : constant Node_Id := Component_Clause (C1_Ent);
6656
         CC2 : constant Node_Id := Component_Clause (C2_Ent);
6657
 
6658
      begin
6659
         if Present (CC1) and then Present (CC2) then
6660
 
6661
            --  Exclude odd case where we have two tag fields in the same
6662
            --  record, both at location zero. This seems a bit strange, but
6663
            --  it seems to happen in some circumstances, perhaps on an error.
6664
 
6665
            if Chars (C1_Ent) = Name_uTag
6666
                 and then
6667
               Chars (C2_Ent) = Name_uTag
6668
            then
6669
               return;
6670
            end if;
6671
 
6672
            --  Here we check if the two fields overlap
6673
 
6674
            declare
6675
               S1 : constant Uint := Component_Bit_Offset (C1_Ent);
6676
               S2 : constant Uint := Component_Bit_Offset (C2_Ent);
6677
               E1 : constant Uint := S1 + Esize (C1_Ent);
6678
               E2 : constant Uint := S2 + Esize (C2_Ent);
6679
 
6680
            begin
6681
               if E2 <= S1 or else E1 <= S2 then
6682
                  null;
6683
               else
6684
                  Error_Msg_Node_2 := Component_Name (CC2);
6685
                  Error_Msg_Sloc := Sloc (Error_Msg_Node_2);
6686
                  Error_Msg_Node_1 := Component_Name (CC1);
6687
                  Error_Msg_N
6688
                    ("component& overlaps & #", Component_Name (CC1));
6689
                  Overlap_Detected := True;
6690
               end if;
6691
            end;
6692
         end if;
6693
      end Check_Component_Overlap;
6694
 
6695
      --------------------
6696
      -- Find_Component --
6697
      --------------------
6698
 
6699
      procedure Find_Component is
6700
 
6701
         procedure Search_Component (R : Entity_Id);
6702
         --  Search components of R for a match. If found, Comp is set.
6703
 
6704
         ----------------------
6705
         -- Search_Component --
6706
         ----------------------
6707
 
6708
         procedure Search_Component (R : Entity_Id) is
6709
         begin
6710
            Comp := First_Component_Or_Discriminant (R);
6711
            while Present (Comp) loop
6712
 
6713
               --  Ignore error of attribute name for component name (we
6714
               --  already gave an error message for this, so no need to
6715
               --  complain here)
6716
 
6717
               if Nkind (Component_Name (CC)) = N_Attribute_Reference then
6718
                  null;
6719
               else
6720
                  exit when Chars (Comp) = Chars (Component_Name (CC));
6721
               end if;
6722
 
6723
               Next_Component_Or_Discriminant (Comp);
6724
            end loop;
6725
         end Search_Component;
6726
 
6727
      --  Start of processing for Find_Component
6728
 
6729
      begin
6730
         --  Return with Comp set to Empty if we have a pragma
6731
 
6732
         if Nkind (CC) = N_Pragma then
6733
            Comp := Empty;
6734
            return;
6735
         end if;
6736
 
6737
         --  Search current record for matching component
6738
 
6739
         Search_Component (Rectype);
6740
 
6741
         --  If not found, maybe component of base type that is absent from
6742
         --  statically constrained first subtype.
6743
 
6744
         if No (Comp) then
6745
            Search_Component (Base_Type (Rectype));
6746
         end if;
6747
 
6748
         --  If no component, or the component does not reference the component
6749
         --  clause in question, then there was some previous error for which
6750
         --  we already gave a message, so just return with Comp Empty.
6751
 
6752
         if No (Comp)
6753
           or else Component_Clause (Comp) /= CC
6754
         then
6755
            Comp := Empty;
6756
 
6757
         --  Normal case where we have a component clause
6758
 
6759
         else
6760
            Fbit := Component_Bit_Offset (Comp);
6761
            Lbit := Fbit + Esize (Comp) - 1;
6762
         end if;
6763
      end Find_Component;
6764
 
6765
   --  Start of processing for Check_Record_Representation_Clause
6766
 
6767
   begin
6768
      Find_Type (Ident);
6769
      Rectype := Entity (Ident);
6770
 
6771
      if Rectype = Any_Type then
6772
         return;
6773
      else
6774
         Rectype := Underlying_Type (Rectype);
6775
      end if;
6776
 
6777
      --  See if we have a fully repped derived tagged type
6778
 
6779
      declare
6780
         PS : constant Entity_Id := Parent_Subtype (Rectype);
6781
 
6782
      begin
6783
         if Present (PS) and then Is_Fully_Repped_Tagged_Type (PS) then
6784
            Tagged_Parent := PS;
6785
 
6786
            --  Find maximum bit of any component of the parent type
6787
 
6788
            Parent_Last_Bit := UI_From_Int (System_Address_Size - 1);
6789
            Pcomp := First_Entity (Tagged_Parent);
6790
            while Present (Pcomp) loop
6791
               if Ekind_In (Pcomp, E_Discriminant, E_Component) then
6792
                  if Component_Bit_Offset (Pcomp) /= No_Uint
6793
                    and then Known_Static_Esize (Pcomp)
6794
                  then
6795
                     Parent_Last_Bit :=
6796
                       UI_Max
6797
                         (Parent_Last_Bit,
6798
                          Component_Bit_Offset (Pcomp) + Esize (Pcomp) - 1);
6799
                  end if;
6800
 
6801
                  Next_Entity (Pcomp);
6802
               end if;
6803
            end loop;
6804
         end if;
6805
      end;
6806
 
6807
      --  All done if no component clauses
6808
 
6809
      CC := First (Component_Clauses (N));
6810
 
6811
      if No (CC) then
6812
         return;
6813
      end if;
6814
 
6815
      --  If a tag is present, then create a component clause that places it
6816
      --  at the start of the record (otherwise gigi may place it after other
6817
      --  fields that have rep clauses).
6818
 
6819
      Fent := First_Entity (Rectype);
6820
 
6821
      if Nkind (Fent) = N_Defining_Identifier
6822
        and then Chars (Fent) = Name_uTag
6823
      then
6824
         Set_Component_Bit_Offset    (Fent, Uint_0);
6825
         Set_Normalized_Position     (Fent, Uint_0);
6826
         Set_Normalized_First_Bit    (Fent, Uint_0);
6827
         Set_Normalized_Position_Max (Fent, Uint_0);
6828
         Init_Esize                  (Fent, System_Address_Size);
6829
 
6830
         Set_Component_Clause (Fent,
6831
           Make_Component_Clause (Loc,
6832
             Component_Name => Make_Identifier (Loc, Name_uTag),
6833
 
6834
             Position  => Make_Integer_Literal (Loc, Uint_0),
6835
             First_Bit => Make_Integer_Literal (Loc, Uint_0),
6836
             Last_Bit  =>
6837
               Make_Integer_Literal (Loc,
6838
                 UI_From_Int (System_Address_Size))));
6839
 
6840
         Ccount := Ccount + 1;
6841
      end if;
6842
 
6843
      Max_Bit_So_Far := Uint_Minus_1;
6844
      Overlap_Check_Required := False;
6845
 
6846
      --  Process the component clauses
6847
 
6848
      while Present (CC) loop
6849
         Find_Component;
6850
 
6851
         if Present (Comp) then
6852
            Ccount := Ccount + 1;
6853
 
6854
            --  We need a full overlap check if record positions non-monotonic
6855
 
6856
            if Fbit <= Max_Bit_So_Far then
6857
               Overlap_Check_Required := True;
6858
            end if;
6859
 
6860
            Max_Bit_So_Far := Lbit;
6861
 
6862
            --  Check bit position out of range of specified size
6863
 
6864
            if Has_Size_Clause (Rectype)
6865
              and then RM_Size (Rectype) <= Lbit
6866
            then
6867
               Error_Msg_N
6868
                 ("bit number out of range of specified size",
6869
                  Last_Bit (CC));
6870
 
6871
               --  Check for overlap with tag field
6872
 
6873
            else
6874
               if Is_Tagged_Type (Rectype)
6875
                 and then Fbit < System_Address_Size
6876
               then
6877
                  Error_Msg_NE
6878
                    ("component overlaps tag field of&",
6879
                     Component_Name (CC), Rectype);
6880
                  Overlap_Detected := True;
6881
               end if;
6882
 
6883
               if Hbit < Lbit then
6884
                  Hbit := Lbit;
6885
               end if;
6886
            end if;
6887
 
6888
            --  Check parent overlap if component might overlap parent field
6889
 
6890
            if Present (Tagged_Parent)
6891
              and then Fbit <= Parent_Last_Bit
6892
            then
6893
               Pcomp := First_Component_Or_Discriminant (Tagged_Parent);
6894
               while Present (Pcomp) loop
6895
                  if not Is_Tag (Pcomp)
6896
                    and then Chars (Pcomp) /= Name_uParent
6897
                  then
6898
                     Check_Component_Overlap (Comp, Pcomp);
6899
                  end if;
6900
 
6901
                  Next_Component_Or_Discriminant (Pcomp);
6902
               end loop;
6903
            end if;
6904
         end if;
6905
 
6906
         Next (CC);
6907
      end loop;
6908
 
6909
      --  Now that we have processed all the component clauses, check for
6910
      --  overlap. We have to leave this till last, since the components can
6911
      --  appear in any arbitrary order in the representation clause.
6912
 
6913
      --  We do not need this check if all specified ranges were monotonic,
6914
      --  as recorded by Overlap_Check_Required being False at this stage.
6915
 
6916
      --  This first section checks if there are any overlapping entries at
6917
      --  all. It does this by sorting all entries and then seeing if there are
6918
      --  any overlaps. If there are none, then that is decisive, but if there
6919
      --  are overlaps, they may still be OK (they may result from fields in
6920
      --  different variants).
6921
 
6922
      if Overlap_Check_Required then
6923
         Overlap_Check1 : declare
6924
 
6925
            OC_Fbit : array (0 .. Ccount) of Uint;
6926
            --  First-bit values for component clauses, the value is the offset
6927
            --  of the first bit of the field from start of record. The zero
6928
            --  entry is for use in sorting.
6929
 
6930
            OC_Lbit : array (0 .. Ccount) of Uint;
6931
            --  Last-bit values for component clauses, the value is the offset
6932
            --  of the last bit of the field from start of record. The zero
6933
            --  entry is for use in sorting.
6934
 
6935
            OC_Count : Natural := 0;
6936
            --  Count of entries in OC_Fbit and OC_Lbit
6937
 
6938
            function OC_Lt (Op1, Op2 : Natural) return Boolean;
6939
            --  Compare routine for Sort
6940
 
6941
            procedure OC_Move (From : Natural; To : Natural);
6942
            --  Move routine for Sort
6943
 
6944
            package Sorting is new GNAT.Heap_Sort_G (OC_Move, OC_Lt);
6945
 
6946
            -----------
6947
            -- OC_Lt --
6948
            -----------
6949
 
6950
            function OC_Lt (Op1, Op2 : Natural) return Boolean is
6951
            begin
6952
               return OC_Fbit (Op1) < OC_Fbit (Op2);
6953
            end OC_Lt;
6954
 
6955
            -------------
6956
            -- OC_Move --
6957
            -------------
6958
 
6959
            procedure OC_Move (From : Natural; To : Natural) is
6960
            begin
6961
               OC_Fbit (To) := OC_Fbit (From);
6962
               OC_Lbit (To) := OC_Lbit (From);
6963
            end OC_Move;
6964
 
6965
            --  Start of processing for Overlap_Check
6966
 
6967
         begin
6968
            CC := First (Component_Clauses (N));
6969
            while Present (CC) loop
6970
 
6971
               --  Exclude component clause already marked in error
6972
 
6973
               if not Error_Posted (CC) then
6974
                  Find_Component;
6975
 
6976
                  if Present (Comp) then
6977
                     OC_Count := OC_Count + 1;
6978
                     OC_Fbit (OC_Count) := Fbit;
6979
                     OC_Lbit (OC_Count) := Lbit;
6980
                  end if;
6981
               end if;
6982
 
6983
               Next (CC);
6984
            end loop;
6985
 
6986
            Sorting.Sort (OC_Count);
6987
 
6988
            Overlap_Check_Required := False;
6989
            for J in 1 .. OC_Count - 1 loop
6990
               if OC_Lbit (J) >= OC_Fbit (J + 1) then
6991
                  Overlap_Check_Required := True;
6992
                  exit;
6993
               end if;
6994
            end loop;
6995
         end Overlap_Check1;
6996
      end if;
6997
 
6998
      --  If Overlap_Check_Required is still True, then we have to do the full
6999
      --  scale overlap check, since we have at least two fields that do
7000
      --  overlap, and we need to know if that is OK since they are in
7001
      --  different variant, or whether we have a definite problem.
7002
 
7003
      if Overlap_Check_Required then
7004
         Overlap_Check2 : declare
7005
            C1_Ent, C2_Ent : Entity_Id;
7006
            --  Entities of components being checked for overlap
7007
 
7008
            Clist : Node_Id;
7009
            --  Component_List node whose Component_Items are being checked
7010
 
7011
            Citem : Node_Id;
7012
            --  Component declaration for component being checked
7013
 
7014
         begin
7015
            C1_Ent := First_Entity (Base_Type (Rectype));
7016
 
7017
            --  Loop through all components in record. For each component check
7018
            --  for overlap with any of the preceding elements on the component
7019
            --  list containing the component and also, if the component is in
7020
            --  a variant, check against components outside the case structure.
7021
            --  This latter test is repeated recursively up the variant tree.
7022
 
7023
            Main_Component_Loop : while Present (C1_Ent) loop
7024
               if not Ekind_In (C1_Ent, E_Component, E_Discriminant) then
7025
                  goto Continue_Main_Component_Loop;
7026
               end if;
7027
 
7028
               --  Skip overlap check if entity has no declaration node. This
7029
               --  happens with discriminants in constrained derived types.
7030
               --  Possibly we are missing some checks as a result, but that
7031
               --  does not seem terribly serious.
7032
 
7033
               if No (Declaration_Node (C1_Ent)) then
7034
                  goto Continue_Main_Component_Loop;
7035
               end if;
7036
 
7037
               Clist := Parent (List_Containing (Declaration_Node (C1_Ent)));
7038
 
7039
               --  Loop through component lists that need checking. Check the
7040
               --  current component list and all lists in variants above us.
7041
 
7042
               Component_List_Loop : loop
7043
 
7044
                  --  If derived type definition, go to full declaration
7045
                  --  If at outer level, check discriminants if there are any.
7046
 
7047
                  if Nkind (Clist) = N_Derived_Type_Definition then
7048
                     Clist := Parent (Clist);
7049
                  end if;
7050
 
7051
                  --  Outer level of record definition, check discriminants
7052
 
7053
                  if Nkind_In (Clist, N_Full_Type_Declaration,
7054
                               N_Private_Type_Declaration)
7055
                  then
7056
                     if Has_Discriminants (Defining_Identifier (Clist)) then
7057
                        C2_Ent :=
7058
                          First_Discriminant (Defining_Identifier (Clist));
7059
                        while Present (C2_Ent) loop
7060
                           exit when C1_Ent = C2_Ent;
7061
                           Check_Component_Overlap (C1_Ent, C2_Ent);
7062
                           Next_Discriminant (C2_Ent);
7063
                        end loop;
7064
                     end if;
7065
 
7066
                     --  Record extension case
7067
 
7068
                  elsif Nkind (Clist) = N_Derived_Type_Definition then
7069
                     Clist := Empty;
7070
 
7071
                     --  Otherwise check one component list
7072
 
7073
                  else
7074
                     Citem := First (Component_Items (Clist));
7075
                     while Present (Citem) loop
7076
                        if Nkind (Citem) = N_Component_Declaration then
7077
                           C2_Ent := Defining_Identifier (Citem);
7078
                           exit when C1_Ent = C2_Ent;
7079
                           Check_Component_Overlap (C1_Ent, C2_Ent);
7080
                        end if;
7081
 
7082
                        Next (Citem);
7083
                     end loop;
7084
                  end if;
7085
 
7086
                  --  Check for variants above us (the parent of the Clist can
7087
                  --  be a variant, in which case its parent is a variant part,
7088
                  --  and the parent of the variant part is a component list
7089
                  --  whose components must all be checked against the current
7090
                  --  component for overlap).
7091
 
7092
                  if Nkind (Parent (Clist)) = N_Variant then
7093
                     Clist := Parent (Parent (Parent (Clist)));
7094
 
7095
                     --  Check for possible discriminant part in record, this
7096
                     --  is treated essentially as another level in the
7097
                     --  recursion. For this case the parent of the component
7098
                     --  list is the record definition, and its parent is the
7099
                     --  full type declaration containing the discriminant
7100
                     --  specifications.
7101
 
7102
                  elsif Nkind (Parent (Clist)) = N_Record_Definition then
7103
                     Clist := Parent (Parent ((Clist)));
7104
 
7105
                     --  If neither of these two cases, we are at the top of
7106
                     --  the tree.
7107
 
7108
                  else
7109
                     exit Component_List_Loop;
7110
                  end if;
7111
               end loop Component_List_Loop;
7112
 
7113
               <<Continue_Main_Component_Loop>>
7114
               Next_Entity (C1_Ent);
7115
 
7116
            end loop Main_Component_Loop;
7117
         end Overlap_Check2;
7118
      end if;
7119
 
7120
      --  The following circuit deals with warning on record holes (gaps). We
7121
      --  skip this check if overlap was detected, since it makes sense for the
7122
      --  programmer to fix this illegality before worrying about warnings.
7123
 
7124
      if not Overlap_Detected and Warn_On_Record_Holes then
7125
         Record_Hole_Check : declare
7126
            Decl : constant Node_Id := Declaration_Node (Base_Type (Rectype));
7127
            --  Full declaration of record type
7128
 
7129
            procedure Check_Component_List
7130
              (CL   : Node_Id;
7131
               Sbit : Uint;
7132
               DS   : List_Id);
7133
            --  Check component list CL for holes. The starting bit should be
7134
            --  Sbit. which is zero for the main record component list and set
7135
            --  appropriately for recursive calls for variants. DS is set to
7136
            --  a list of discriminant specifications to be included in the
7137
            --  consideration of components. It is No_List if none to consider.
7138
 
7139
            --------------------------
7140
            -- Check_Component_List --
7141
            --------------------------
7142
 
7143
            procedure Check_Component_List
7144
              (CL   : Node_Id;
7145
               Sbit : Uint;
7146
               DS   : List_Id)
7147
            is
7148
               Compl : Integer;
7149
 
7150
            begin
7151
               Compl := Integer (List_Length (Component_Items (CL)));
7152
 
7153
               if DS /= No_List then
7154
                  Compl := Compl + Integer (List_Length (DS));
7155
               end if;
7156
 
7157
               declare
7158
                  Comps : array (Natural range 0 .. Compl) of Entity_Id;
7159
                  --  Gather components (zero entry is for sort routine)
7160
 
7161
                  Ncomps : Natural := 0;
7162
                  --  Number of entries stored in Comps (starting at Comps (1))
7163
 
7164
                  Citem : Node_Id;
7165
                  --  One component item or discriminant specification
7166
 
7167
                  Nbit  : Uint;
7168
                  --  Starting bit for next component
7169
 
7170
                  CEnt  : Entity_Id;
7171
                  --  Component entity
7172
 
7173
                  Variant : Node_Id;
7174
                  --  One variant
7175
 
7176
                  function Lt (Op1, Op2 : Natural) return Boolean;
7177
                  --  Compare routine for Sort
7178
 
7179
                  procedure Move (From : Natural; To : Natural);
7180
                  --  Move routine for Sort
7181
 
7182
                  package Sorting is new GNAT.Heap_Sort_G (Move, Lt);
7183
 
7184
                  --------
7185
                  -- Lt --
7186
                  --------
7187
 
7188
                  function Lt (Op1, Op2 : Natural) return Boolean is
7189
                  begin
7190
                     return Component_Bit_Offset (Comps (Op1))
7191
                       <
7192
                       Component_Bit_Offset (Comps (Op2));
7193
                  end Lt;
7194
 
7195
                  ----------
7196
                  -- Move --
7197
                  ----------
7198
 
7199
                  procedure Move (From : Natural; To : Natural) is
7200
                  begin
7201
                     Comps (To) := Comps (From);
7202
                  end Move;
7203
 
7204
               begin
7205
                  --  Gather discriminants into Comp
7206
 
7207
                  if DS /= No_List then
7208
                     Citem := First (DS);
7209
                     while Present (Citem) loop
7210
                        if Nkind (Citem) = N_Discriminant_Specification then
7211
                           declare
7212
                              Ent : constant Entity_Id :=
7213
                                      Defining_Identifier (Citem);
7214
                           begin
7215
                              if Ekind (Ent) = E_Discriminant then
7216
                                 Ncomps := Ncomps + 1;
7217
                                 Comps (Ncomps) := Ent;
7218
                              end if;
7219
                           end;
7220
                        end if;
7221
 
7222
                        Next (Citem);
7223
                     end loop;
7224
                  end if;
7225
 
7226
                  --  Gather component entities into Comp
7227
 
7228
                  Citem := First (Component_Items (CL));
7229
                  while Present (Citem) loop
7230
                     if Nkind (Citem) = N_Component_Declaration then
7231
                        Ncomps := Ncomps + 1;
7232
                        Comps (Ncomps) := Defining_Identifier (Citem);
7233
                     end if;
7234
 
7235
                     Next (Citem);
7236
                  end loop;
7237
 
7238
                  --  Now sort the component entities based on the first bit.
7239
                  --  Note we already know there are no overlapping components.
7240
 
7241
                  Sorting.Sort (Ncomps);
7242
 
7243
                  --  Loop through entries checking for holes
7244
 
7245
                  Nbit := Sbit;
7246
                  for J in 1 .. Ncomps loop
7247
                     CEnt := Comps (J);
7248
                     Error_Msg_Uint_1 := Component_Bit_Offset (CEnt) - Nbit;
7249
 
7250
                     if Error_Msg_Uint_1 > 0 then
7251
                        Error_Msg_NE
7252
                          ("?^-bit gap before component&",
7253
                           Component_Name (Component_Clause (CEnt)), CEnt);
7254
                     end if;
7255
 
7256
                     Nbit := Component_Bit_Offset (CEnt) + Esize (CEnt);
7257
                  end loop;
7258
 
7259
                  --  Process variant parts recursively if present
7260
 
7261
                  if Present (Variant_Part (CL)) then
7262
                     Variant := First (Variants (Variant_Part (CL)));
7263
                     while Present (Variant) loop
7264
                        Check_Component_List
7265
                          (Component_List (Variant), Nbit, No_List);
7266
                        Next (Variant);
7267
                     end loop;
7268
                  end if;
7269
               end;
7270
            end Check_Component_List;
7271
 
7272
         --  Start of processing for Record_Hole_Check
7273
 
7274
         begin
7275
            declare
7276
               Sbit : Uint;
7277
 
7278
            begin
7279
               if Is_Tagged_Type (Rectype) then
7280
                  Sbit := UI_From_Int (System_Address_Size);
7281
               else
7282
                  Sbit := Uint_0;
7283
               end if;
7284
 
7285
               if Nkind (Decl) = N_Full_Type_Declaration
7286
                 and then Nkind (Type_Definition (Decl)) = N_Record_Definition
7287
               then
7288
                  Check_Component_List
7289
                    (Component_List (Type_Definition (Decl)),
7290
                     Sbit,
7291
                     Discriminant_Specifications (Decl));
7292
               end if;
7293
            end;
7294
         end Record_Hole_Check;
7295
      end if;
7296
 
7297
      --  For records that have component clauses for all components, and whose
7298
      --  size is less than or equal to 32, we need to know the size in the
7299
      --  front end to activate possible packed array processing where the
7300
      --  component type is a record.
7301
 
7302
      --  At this stage Hbit + 1 represents the first unused bit from all the
7303
      --  component clauses processed, so if the component clauses are
7304
      --  complete, then this is the length of the record.
7305
 
7306
      --  For records longer than System.Storage_Unit, and for those where not
7307
      --  all components have component clauses, the back end determines the
7308
      --  length (it may for example be appropriate to round up the size
7309
      --  to some convenient boundary, based on alignment considerations, etc).
7310
 
7311
      if Unknown_RM_Size (Rectype) and then Hbit + 1 <= 32 then
7312
 
7313
         --  Nothing to do if at least one component has no component clause
7314
 
7315
         Comp := First_Component_Or_Discriminant (Rectype);
7316
         while Present (Comp) loop
7317
            exit when No (Component_Clause (Comp));
7318
            Next_Component_Or_Discriminant (Comp);
7319
         end loop;
7320
 
7321
         --  If we fall out of loop, all components have component clauses
7322
         --  and so we can set the size to the maximum value.
7323
 
7324
         if No (Comp) then
7325
            Set_RM_Size (Rectype, Hbit + 1);
7326
         end if;
7327
      end if;
7328
   end Check_Record_Representation_Clause;
7329
 
7330
   ----------------
7331
   -- Check_Size --
7332
   ----------------
7333
 
7334
   procedure Check_Size
7335
     (N      : Node_Id;
7336
      T      : Entity_Id;
7337
      Siz    : Uint;
7338
      Biased : out Boolean)
7339
   is
7340
      UT : constant Entity_Id := Underlying_Type (T);
7341
      M  : Uint;
7342
 
7343
   begin
7344
      Biased := False;
7345
 
7346
      --  Dismiss cases for generic types or types with previous errors
7347
 
7348
      if No (UT)
7349
        or else UT = Any_Type
7350
        or else Is_Generic_Type (UT)
7351
        or else Is_Generic_Type (Root_Type (UT))
7352
      then
7353
         return;
7354
 
7355
      --  Check case of bit packed array
7356
 
7357
      elsif Is_Array_Type (UT)
7358
        and then Known_Static_Component_Size (UT)
7359
        and then Is_Bit_Packed_Array (UT)
7360
      then
7361
         declare
7362
            Asiz : Uint;
7363
            Indx : Node_Id;
7364
            Ityp : Entity_Id;
7365
 
7366
         begin
7367
            Asiz := Component_Size (UT);
7368
            Indx := First_Index (UT);
7369
            loop
7370
               Ityp := Etype (Indx);
7371
 
7372
               --  If non-static bound, then we are not in the business of
7373
               --  trying to check the length, and indeed an error will be
7374
               --  issued elsewhere, since sizes of non-static array types
7375
               --  cannot be set implicitly or explicitly.
7376
 
7377
               if not Is_Static_Subtype (Ityp) then
7378
                  return;
7379
               end if;
7380
 
7381
               --  Otherwise accumulate next dimension
7382
 
7383
               Asiz := Asiz * (Expr_Value (Type_High_Bound (Ityp)) -
7384
                               Expr_Value (Type_Low_Bound  (Ityp)) +
7385
                               Uint_1);
7386
 
7387
               Next_Index (Indx);
7388
               exit when No (Indx);
7389
            end loop;
7390
 
7391
            if Asiz <= Siz then
7392
               return;
7393
            else
7394
               Error_Msg_Uint_1 := Asiz;
7395
               Error_Msg_NE
7396
                 ("size for& too small, minimum allowed is ^", N, T);
7397
               Set_Esize   (T, Asiz);
7398
               Set_RM_Size (T, Asiz);
7399
            end if;
7400
         end;
7401
 
7402
      --  All other composite types are ignored
7403
 
7404
      elsif Is_Composite_Type (UT) then
7405
         return;
7406
 
7407
      --  For fixed-point types, don't check minimum if type is not frozen,
7408
      --  since we don't know all the characteristics of the type that can
7409
      --  affect the size (e.g. a specified small) till freeze time.
7410
 
7411
      elsif Is_Fixed_Point_Type (UT)
7412
        and then not Is_Frozen (UT)
7413
      then
7414
         null;
7415
 
7416
      --  Cases for which a minimum check is required
7417
 
7418
      else
7419
         --  Ignore if specified size is correct for the type
7420
 
7421
         if Known_Esize (UT) and then Siz = Esize (UT) then
7422
            return;
7423
         end if;
7424
 
7425
         --  Otherwise get minimum size
7426
 
7427
         M := UI_From_Int (Minimum_Size (UT));
7428
 
7429
         if Siz < M then
7430
 
7431
            --  Size is less than minimum size, but one possibility remains
7432
            --  that we can manage with the new size if we bias the type.
7433
 
7434
            M := UI_From_Int (Minimum_Size (UT, Biased => True));
7435
 
7436
            if Siz < M then
7437
               Error_Msg_Uint_1 := M;
7438
               Error_Msg_NE
7439
                 ("size for& too small, minimum allowed is ^", N, T);
7440
               Set_Esize (T, M);
7441
               Set_RM_Size (T, M);
7442
            else
7443
               Biased := True;
7444
            end if;
7445
         end if;
7446
      end if;
7447
   end Check_Size;
7448
 
7449
   -------------------------
7450
   -- Get_Alignment_Value --
7451
   -------------------------
7452
 
7453
   function Get_Alignment_Value (Expr : Node_Id) return Uint is
7454
      Align : constant Uint := Static_Integer (Expr);
7455
 
7456
   begin
7457
      if Align = No_Uint then
7458
         return No_Uint;
7459
 
7460
      elsif Align <= 0 then
7461
         Error_Msg_N ("alignment value must be positive", Expr);
7462
         return No_Uint;
7463
 
7464
      else
7465
         for J in Int range 0 .. 64 loop
7466
            declare
7467
               M : constant Uint := Uint_2 ** J;
7468
 
7469
            begin
7470
               exit when M = Align;
7471
 
7472
               if M > Align then
7473
                  Error_Msg_N
7474
                    ("alignment value must be power of 2", Expr);
7475
                  return No_Uint;
7476
               end if;
7477
            end;
7478
         end loop;
7479
 
7480
         return Align;
7481
      end if;
7482
   end Get_Alignment_Value;
7483
 
7484
   ----------------
7485
   -- Initialize --
7486
   ----------------
7487
 
7488
   procedure Initialize is
7489
   begin
7490
      Address_Clause_Checks.Init;
7491
      Independence_Checks.Init;
7492
      Unchecked_Conversions.Init;
7493
   end Initialize;
7494
 
7495
   -------------------------
7496
   -- Is_Operational_Item --
7497
   -------------------------
7498
 
7499
   function Is_Operational_Item (N : Node_Id) return Boolean is
7500
   begin
7501
      if Nkind (N) /= N_Attribute_Definition_Clause then
7502
         return False;
7503
      else
7504
         declare
7505
            Id    : constant Attribute_Id := Get_Attribute_Id (Chars (N));
7506
         begin
7507
            return   Id = Attribute_Input
7508
              or else Id = Attribute_Output
7509
              or else Id = Attribute_Read
7510
              or else Id = Attribute_Write
7511
              or else Id = Attribute_External_Tag;
7512
         end;
7513
      end if;
7514
   end Is_Operational_Item;
7515
 
7516
   ------------------
7517
   -- Minimum_Size --
7518
   ------------------
7519
 
7520
   function Minimum_Size
7521
     (T      : Entity_Id;
7522
      Biased : Boolean := False) return Nat
7523
   is
7524
      Lo     : Uint    := No_Uint;
7525
      Hi     : Uint    := No_Uint;
7526
      LoR    : Ureal   := No_Ureal;
7527
      HiR    : Ureal   := No_Ureal;
7528
      LoSet  : Boolean := False;
7529
      HiSet  : Boolean := False;
7530
      B      : Uint;
7531
      S      : Nat;
7532
      Ancest : Entity_Id;
7533
      R_Typ  : constant Entity_Id := Root_Type (T);
7534
 
7535
   begin
7536
      --  If bad type, return 0
7537
 
7538
      if T = Any_Type then
7539
         return 0;
7540
 
7541
      --  For generic types, just return zero. There cannot be any legitimate
7542
      --  need to know such a size, but this routine may be called with a
7543
      --  generic type as part of normal processing.
7544
 
7545
      elsif Is_Generic_Type (R_Typ)
7546
        or else R_Typ = Any_Type
7547
      then
7548
         return 0;
7549
 
7550
         --  Access types. Normally an access type cannot have a size smaller
7551
         --  than the size of System.Address. The exception is on VMS, where
7552
         --  we have short and long addresses, and it is possible for an access
7553
         --  type to have a short address size (and thus be less than the size
7554
         --  of System.Address itself). We simply skip the check for VMS, and
7555
         --  leave it to the back end to do the check.
7556
 
7557
      elsif Is_Access_Type (T) then
7558
         if OpenVMS_On_Target then
7559
            return 0;
7560
         else
7561
            return System_Address_Size;
7562
         end if;
7563
 
7564
      --  Floating-point types
7565
 
7566
      elsif Is_Floating_Point_Type (T) then
7567
         return UI_To_Int (Esize (R_Typ));
7568
 
7569
      --  Discrete types
7570
 
7571
      elsif Is_Discrete_Type (T) then
7572
 
7573
         --  The following loop is looking for the nearest compile time known
7574
         --  bounds following the ancestor subtype chain. The idea is to find
7575
         --  the most restrictive known bounds information.
7576
 
7577
         Ancest := T;
7578
         loop
7579
            if Ancest = Any_Type or else Etype (Ancest) = Any_Type then
7580
               return 0;
7581
            end if;
7582
 
7583
            if not LoSet then
7584
               if Compile_Time_Known_Value (Type_Low_Bound (Ancest)) then
7585
                  Lo := Expr_Rep_Value (Type_Low_Bound (Ancest));
7586
                  LoSet := True;
7587
                  exit when HiSet;
7588
               end if;
7589
            end if;
7590
 
7591
            if not HiSet then
7592
               if Compile_Time_Known_Value (Type_High_Bound (Ancest)) then
7593
                  Hi := Expr_Rep_Value (Type_High_Bound (Ancest));
7594
                  HiSet := True;
7595
                  exit when LoSet;
7596
               end if;
7597
            end if;
7598
 
7599
            Ancest := Ancestor_Subtype (Ancest);
7600
 
7601
            if No (Ancest) then
7602
               Ancest := Base_Type (T);
7603
 
7604
               if Is_Generic_Type (Ancest) then
7605
                  return 0;
7606
               end if;
7607
            end if;
7608
         end loop;
7609
 
7610
      --  Fixed-point types. We can't simply use Expr_Value to get the
7611
      --  Corresponding_Integer_Value values of the bounds, since these do not
7612
      --  get set till the type is frozen, and this routine can be called
7613
      --  before the type is frozen. Similarly the test for bounds being static
7614
      --  needs to include the case where we have unanalyzed real literals for
7615
      --  the same reason.
7616
 
7617
      elsif Is_Fixed_Point_Type (T) then
7618
 
7619
         --  The following loop is looking for the nearest compile time known
7620
         --  bounds following the ancestor subtype chain. The idea is to find
7621
         --  the most restrictive known bounds information.
7622
 
7623
         Ancest := T;
7624
         loop
7625
            if Ancest = Any_Type or else Etype (Ancest) = Any_Type then
7626
               return 0;
7627
            end if;
7628
 
7629
            --  Note: In the following two tests for LoSet and HiSet, it may
7630
            --  seem redundant to test for N_Real_Literal here since normally
7631
            --  one would assume that the test for the value being known at
7632
            --  compile time includes this case. However, there is a glitch.
7633
            --  If the real literal comes from folding a non-static expression,
7634
            --  then we don't consider any non- static expression to be known
7635
            --  at compile time if we are in configurable run time mode (needed
7636
            --  in some cases to give a clearer definition of what is and what
7637
            --  is not accepted). So the test is indeed needed. Without it, we
7638
            --  would set neither Lo_Set nor Hi_Set and get an infinite loop.
7639
 
7640
            if not LoSet then
7641
               if Nkind (Type_Low_Bound (Ancest)) = N_Real_Literal
7642
                 or else Compile_Time_Known_Value (Type_Low_Bound (Ancest))
7643
               then
7644
                  LoR := Expr_Value_R (Type_Low_Bound (Ancest));
7645
                  LoSet := True;
7646
                  exit when HiSet;
7647
               end if;
7648
            end if;
7649
 
7650
            if not HiSet then
7651
               if Nkind (Type_High_Bound (Ancest)) = N_Real_Literal
7652
                 or else Compile_Time_Known_Value (Type_High_Bound (Ancest))
7653
               then
7654
                  HiR := Expr_Value_R (Type_High_Bound (Ancest));
7655
                  HiSet := True;
7656
                  exit when LoSet;
7657
               end if;
7658
            end if;
7659
 
7660
            Ancest := Ancestor_Subtype (Ancest);
7661
 
7662
            if No (Ancest) then
7663
               Ancest := Base_Type (T);
7664
 
7665
               if Is_Generic_Type (Ancest) then
7666
                  return 0;
7667
               end if;
7668
            end if;
7669
         end loop;
7670
 
7671
         Lo := UR_To_Uint (LoR / Small_Value (T));
7672
         Hi := UR_To_Uint (HiR / Small_Value (T));
7673
 
7674
      --  No other types allowed
7675
 
7676
      else
7677
         raise Program_Error;
7678
      end if;
7679
 
7680
      --  Fall through with Hi and Lo set. Deal with biased case
7681
 
7682
      if (Biased
7683
           and then not Is_Fixed_Point_Type (T)
7684
           and then not (Is_Enumeration_Type (T)
7685
                          and then Has_Non_Standard_Rep (T)))
7686
        or else Has_Biased_Representation (T)
7687
      then
7688
         Hi := Hi - Lo;
7689
         Lo := Uint_0;
7690
      end if;
7691
 
7692
      --  Signed case. Note that we consider types like range 1 .. -1 to be
7693
      --  signed for the purpose of computing the size, since the bounds have
7694
      --  to be accommodated in the base type.
7695
 
7696
      if Lo < 0 or else Hi < 0 then
7697
         S := 1;
7698
         B := Uint_1;
7699
 
7700
         --  S = size, B = 2 ** (size - 1) (can accommodate -B .. +(B - 1))
7701
         --  Note that we accommodate the case where the bounds cross. This
7702
         --  can happen either because of the way the bounds are declared
7703
         --  or because of the algorithm in Freeze_Fixed_Point_Type.
7704
 
7705
         while Lo < -B
7706
           or else Hi < -B
7707
           or else Lo >= B
7708
           or else Hi >= B
7709
         loop
7710
            B := Uint_2 ** S;
7711
            S := S + 1;
7712
         end loop;
7713
 
7714
      --  Unsigned case
7715
 
7716
      else
7717
         --  If both bounds are positive, make sure that both are represen-
7718
         --  table in the case where the bounds are crossed. This can happen
7719
         --  either because of the way the bounds are declared, or because of
7720
         --  the algorithm in Freeze_Fixed_Point_Type.
7721
 
7722
         if Lo > Hi then
7723
            Hi := Lo;
7724
         end if;
7725
 
7726
         --  S = size, (can accommodate 0 .. (2**size - 1))
7727
 
7728
         S := 0;
7729
         while Hi >= Uint_2 ** S loop
7730
            S := S + 1;
7731
         end loop;
7732
      end if;
7733
 
7734
      return S;
7735
   end Minimum_Size;
7736
 
7737
   ---------------------------
7738
   -- New_Stream_Subprogram --
7739
   ---------------------------
7740
 
7741
   procedure New_Stream_Subprogram
7742
     (N     : Node_Id;
7743
      Ent   : Entity_Id;
7744
      Subp  : Entity_Id;
7745
      Nam   : TSS_Name_Type)
7746
   is
7747
      Loc       : constant Source_Ptr := Sloc (N);
7748
      Sname     : constant Name_Id    := Make_TSS_Name (Base_Type (Ent), Nam);
7749
      Subp_Id   : Entity_Id;
7750
      Subp_Decl : Node_Id;
7751
      F         : Entity_Id;
7752
      Etyp      : Entity_Id;
7753
 
7754
      Defer_Declaration : constant Boolean :=
7755
                            Is_Tagged_Type (Ent) or else Is_Private_Type (Ent);
7756
      --  For a tagged type, there is a declaration for each stream attribute
7757
      --  at the freeze point, and we must generate only a completion of this
7758
      --  declaration. We do the same for private types, because the full view
7759
      --  might be tagged. Otherwise we generate a declaration at the point of
7760
      --  the attribute definition clause.
7761
 
7762
      function Build_Spec return Node_Id;
7763
      --  Used for declaration and renaming declaration, so that this is
7764
      --  treated as a renaming_as_body.
7765
 
7766
      ----------------
7767
      -- Build_Spec --
7768
      ----------------
7769
 
7770
      function Build_Spec return Node_Id is
7771
         Out_P   : constant Boolean := (Nam = TSS_Stream_Read);
7772
         Formals : List_Id;
7773
         Spec    : Node_Id;
7774
         T_Ref   : constant Node_Id := New_Reference_To (Etyp, Loc);
7775
 
7776
      begin
7777
         Subp_Id := Make_Defining_Identifier (Loc, Sname);
7778
 
7779
         --  S : access Root_Stream_Type'Class
7780
 
7781
         Formals := New_List (
7782
                      Make_Parameter_Specification (Loc,
7783
                        Defining_Identifier =>
7784
                          Make_Defining_Identifier (Loc, Name_S),
7785
                        Parameter_Type =>
7786
                          Make_Access_Definition (Loc,
7787
                            Subtype_Mark =>
7788
                              New_Reference_To (
7789
                                Designated_Type (Etype (F)), Loc))));
7790
 
7791
         if Nam = TSS_Stream_Input then
7792
            Spec := Make_Function_Specification (Loc,
7793
                      Defining_Unit_Name       => Subp_Id,
7794
                      Parameter_Specifications => Formals,
7795
                      Result_Definition        => T_Ref);
7796
         else
7797
            --  V : [out] T
7798
 
7799
            Append_To (Formals,
7800
              Make_Parameter_Specification (Loc,
7801
                Defining_Identifier => Make_Defining_Identifier (Loc, Name_V),
7802
                Out_Present         => Out_P,
7803
                Parameter_Type      => T_Ref));
7804
 
7805
            Spec :=
7806
              Make_Procedure_Specification (Loc,
7807
                Defining_Unit_Name       => Subp_Id,
7808
                Parameter_Specifications => Formals);
7809
         end if;
7810
 
7811
         return Spec;
7812
      end Build_Spec;
7813
 
7814
   --  Start of processing for New_Stream_Subprogram
7815
 
7816
   begin
7817
      F := First_Formal (Subp);
7818
 
7819
      if Ekind (Subp) = E_Procedure then
7820
         Etyp := Etype (Next_Formal (F));
7821
      else
7822
         Etyp := Etype (Subp);
7823
      end if;
7824
 
7825
      --  Prepare subprogram declaration and insert it as an action on the
7826
      --  clause node. The visibility for this entity is used to test for
7827
      --  visibility of the attribute definition clause (in the sense of
7828
      --  8.3(23) as amended by AI-195).
7829
 
7830
      if not Defer_Declaration then
7831
         Subp_Decl :=
7832
           Make_Subprogram_Declaration (Loc,
7833
             Specification => Build_Spec);
7834
 
7835
      --  For a tagged type, there is always a visible declaration for each
7836
      --  stream TSS (it is a predefined primitive operation), and the
7837
      --  completion of this declaration occurs at the freeze point, which is
7838
      --  not always visible at places where the attribute definition clause is
7839
      --  visible. So, we create a dummy entity here for the purpose of
7840
      --  tracking the visibility of the attribute definition clause itself.
7841
 
7842
      else
7843
         Subp_Id :=
7844
           Make_Defining_Identifier (Loc, New_External_Name (Sname, 'V'));
7845
         Subp_Decl :=
7846
           Make_Object_Declaration (Loc,
7847
             Defining_Identifier => Subp_Id,
7848
             Object_Definition   => New_Occurrence_Of (Standard_Boolean, Loc));
7849
      end if;
7850
 
7851
      Insert_Action (N, Subp_Decl);
7852
      Set_Entity (N, Subp_Id);
7853
 
7854
      Subp_Decl :=
7855
        Make_Subprogram_Renaming_Declaration (Loc,
7856
          Specification => Build_Spec,
7857
          Name => New_Reference_To (Subp, Loc));
7858
 
7859
      if Defer_Declaration then
7860
         Set_TSS (Base_Type (Ent), Subp_Id);
7861
      else
7862
         Insert_Action (N, Subp_Decl);
7863
         Copy_TSS (Subp_Id, Base_Type (Ent));
7864
      end if;
7865
   end New_Stream_Subprogram;
7866
 
7867
   ------------------------
7868
   -- Rep_Item_Too_Early --
7869
   ------------------------
7870
 
7871
   function Rep_Item_Too_Early (T : Entity_Id; N : Node_Id) return Boolean is
7872
   begin
7873
      --  Cannot apply non-operational rep items to generic types
7874
 
7875
      if Is_Operational_Item (N) then
7876
         return False;
7877
 
7878
      elsif Is_Type (T)
7879
        and then Is_Generic_Type (Root_Type (T))
7880
      then
7881
         Error_Msg_N ("representation item not allowed for generic type", N);
7882
         return True;
7883
      end if;
7884
 
7885
      --  Otherwise check for incomplete type
7886
 
7887
      if Is_Incomplete_Or_Private_Type (T)
7888
        and then No (Underlying_Type (T))
7889
        and then
7890
          (Nkind (N) /= N_Pragma
7891
            or else Get_Pragma_Id (N) /= Pragma_Import)
7892
      then
7893
         Error_Msg_N
7894
           ("representation item must be after full type declaration", N);
7895
         return True;
7896
 
7897
      --  If the type has incomplete components, a representation clause is
7898
      --  illegal but stream attributes and Convention pragmas are correct.
7899
 
7900
      elsif Has_Private_Component (T) then
7901
         if Nkind (N) = N_Pragma then
7902
            return False;
7903
         else
7904
            Error_Msg_N
7905
              ("representation item must appear after type is fully defined",
7906
                N);
7907
            return True;
7908
         end if;
7909
      else
7910
         return False;
7911
      end if;
7912
   end Rep_Item_Too_Early;
7913
 
7914
   -----------------------
7915
   -- Rep_Item_Too_Late --
7916
   -----------------------
7917
 
7918
   function Rep_Item_Too_Late
7919
     (T     : Entity_Id;
7920
      N     : Node_Id;
7921
      FOnly : Boolean := False) return Boolean
7922
   is
7923
      S           : Entity_Id;
7924
      Parent_Type : Entity_Id;
7925
 
7926
      procedure Too_Late;
7927
      --  Output the too late message. Note that this is not considered a
7928
      --  serious error, since the effect is simply that we ignore the
7929
      --  representation clause in this case.
7930
 
7931
      --------------
7932
      -- Too_Late --
7933
      --------------
7934
 
7935
      procedure Too_Late is
7936
      begin
7937
         Error_Msg_N ("|representation item appears too late!", N);
7938
      end Too_Late;
7939
 
7940
   --  Start of processing for Rep_Item_Too_Late
7941
 
7942
   begin
7943
      --  First make sure entity is not frozen (RM 13.1(9))
7944
 
7945
      if Is_Frozen (T)
7946
 
7947
        --  Exclude imported types, which may be frozen if they appear in a
7948
        --  representation clause for a local type.
7949
 
7950
        and then not From_With_Type (T)
7951
 
7952
        --  Exclude generated entitiesa (not coming from source). The common
7953
        --  case is when we generate a renaming which prematurely freezes the
7954
        --  renamed internal entity, but we still want to be able to set copies
7955
        --  of attribute values such as Size/Alignment.
7956
 
7957
        and then Comes_From_Source (T)
7958
      then
7959
         Too_Late;
7960
         S := First_Subtype (T);
7961
 
7962
         if Present (Freeze_Node (S)) then
7963
            Error_Msg_NE
7964
              ("?no more representation items for }", Freeze_Node (S), S);
7965
         end if;
7966
 
7967
         return True;
7968
 
7969
      --  Check for case of non-tagged derived type whose parent either has
7970
      --  primitive operations, or is a by reference type (RM 13.1(10)).
7971
 
7972
      elsif Is_Type (T)
7973
        and then not FOnly
7974
        and then Is_Derived_Type (T)
7975
        and then not Is_Tagged_Type (T)
7976
      then
7977
         Parent_Type := Etype (Base_Type (T));
7978
 
7979
         if Has_Primitive_Operations (Parent_Type) then
7980
            Too_Late;
7981
            Error_Msg_NE
7982
              ("primitive operations already defined for&!", N, Parent_Type);
7983
            return True;
7984
 
7985
         elsif Is_By_Reference_Type (Parent_Type) then
7986
            Too_Late;
7987
            Error_Msg_NE
7988
              ("parent type & is a by reference type!", N, Parent_Type);
7989
            return True;
7990
         end if;
7991
      end if;
7992
 
7993
      --  No error, link item into head of chain of rep items for the entity,
7994
      --  but avoid chaining if we have an overloadable entity, and the pragma
7995
      --  is one that can apply to multiple overloaded entities.
7996
 
7997
      if Is_Overloadable (T)
7998
        and then Nkind (N) = N_Pragma
7999
      then
8000
         declare
8001
            Pname : constant Name_Id := Pragma_Name (N);
8002
         begin
8003
            if Pname = Name_Convention or else
8004
               Pname = Name_Import     or else
8005
               Pname = Name_Export     or else
8006
               Pname = Name_External   or else
8007
               Pname = Name_Interface
8008
            then
8009
               return False;
8010
            end if;
8011
         end;
8012
      end if;
8013
 
8014
      Record_Rep_Item (T, N);
8015
      return False;
8016
   end Rep_Item_Too_Late;
8017
 
8018
   -------------------------------------
8019
   -- Replace_Type_References_Generic --
8020
   -------------------------------------
8021
 
8022
   procedure Replace_Type_References_Generic (N : Node_Id; TName : Name_Id) is
8023
 
8024
      function Replace_Node (N : Node_Id) return Traverse_Result;
8025
      --  Processes a single node in the traversal procedure below, checking
8026
      --  if node N should be replaced, and if so, doing the replacement.
8027
 
8028
      procedure Replace_Type_Refs is new Traverse_Proc (Replace_Node);
8029
      --  This instantiation provides the body of Replace_Type_References
8030
 
8031
      ------------------
8032
      -- Replace_Node --
8033
      ------------------
8034
 
8035
      function Replace_Node (N : Node_Id) return Traverse_Result is
8036
         S : Entity_Id;
8037
         P : Node_Id;
8038
 
8039
      begin
8040
         --  Case of identifier
8041
 
8042
         if Nkind (N) = N_Identifier then
8043
 
8044
            --  If not the type name, all done with this node
8045
 
8046
            if Chars (N) /= TName then
8047
               return Skip;
8048
 
8049
            --  Otherwise do the replacement and we are done with this node
8050
 
8051
            else
8052
               Replace_Type_Reference (N);
8053
               return Skip;
8054
            end if;
8055
 
8056
         --  Case of selected component (which is what a qualification
8057
         --  looks like in the unanalyzed tree, which is what we have.
8058
 
8059
         elsif Nkind (N) = N_Selected_Component then
8060
 
8061
            --  If selector name is not our type, keeping going (we might
8062
            --  still have an occurrence of the type in the prefix).
8063
 
8064
            if Nkind (Selector_Name (N)) /= N_Identifier
8065
              or else Chars (Selector_Name (N)) /= TName
8066
            then
8067
               return OK;
8068
 
8069
            --  Selector name is our type, check qualification
8070
 
8071
            else
8072
               --  Loop through scopes and prefixes, doing comparison
8073
 
8074
               S := Current_Scope;
8075
               P := Prefix (N);
8076
               loop
8077
                  --  Continue if no more scopes or scope with no name
8078
 
8079
                  if No (S) or else Nkind (S) not in N_Has_Chars then
8080
                     return OK;
8081
                  end if;
8082
 
8083
                  --  Do replace if prefix is an identifier matching the
8084
                  --  scope that we are currently looking at.
8085
 
8086
                  if Nkind (P) = N_Identifier
8087
                    and then Chars (P) = Chars (S)
8088
                  then
8089
                     Replace_Type_Reference (N);
8090
                     return Skip;
8091
                  end if;
8092
 
8093
                  --  Go check scope above us if prefix is itself of the
8094
                  --  form of a selected component, whose selector matches
8095
                  --  the scope we are currently looking at.
8096
 
8097
                  if Nkind (P) = N_Selected_Component
8098
                    and then Nkind (Selector_Name (P)) = N_Identifier
8099
                    and then Chars (Selector_Name (P)) = Chars (S)
8100
                  then
8101
                     S := Scope (S);
8102
                     P := Prefix (P);
8103
 
8104
                  --  For anything else, we don't have a match, so keep on
8105
                  --  going, there are still some weird cases where we may
8106
                  --  still have a replacement within the prefix.
8107
 
8108
                  else
8109
                     return OK;
8110
                  end if;
8111
               end loop;
8112
            end if;
8113
 
8114
            --  Continue for any other node kind
8115
 
8116
         else
8117
            return OK;
8118
         end if;
8119
      end Replace_Node;
8120
 
8121
   begin
8122
      Replace_Type_Refs (N);
8123
   end Replace_Type_References_Generic;
8124
 
8125
   -------------------------
8126
   -- Same_Representation --
8127
   -------------------------
8128
 
8129
   function Same_Representation (Typ1, Typ2 : Entity_Id) return Boolean is
8130
      T1 : constant Entity_Id := Underlying_Type (Typ1);
8131
      T2 : constant Entity_Id := Underlying_Type (Typ2);
8132
 
8133
   begin
8134
      --  A quick check, if base types are the same, then we definitely have
8135
      --  the same representation, because the subtype specific representation
8136
      --  attributes (Size and Alignment) do not affect representation from
8137
      --  the point of view of this test.
8138
 
8139
      if Base_Type (T1) = Base_Type (T2) then
8140
         return True;
8141
 
8142
      elsif Is_Private_Type (Base_Type (T2))
8143
        and then Base_Type (T1) = Full_View (Base_Type (T2))
8144
      then
8145
         return True;
8146
      end if;
8147
 
8148
      --  Tagged types never have differing representations
8149
 
8150
      if Is_Tagged_Type (T1) then
8151
         return True;
8152
      end if;
8153
 
8154
      --  Representations are definitely different if conventions differ
8155
 
8156
      if Convention (T1) /= Convention (T2) then
8157
         return False;
8158
      end if;
8159
 
8160
      --  Representations are different if component alignments differ
8161
 
8162
      if (Is_Record_Type (T1) or else Is_Array_Type (T1))
8163
        and then
8164
         (Is_Record_Type (T2) or else Is_Array_Type (T2))
8165
        and then Component_Alignment (T1) /= Component_Alignment (T2)
8166
      then
8167
         return False;
8168
      end if;
8169
 
8170
      --  For arrays, the only real issue is component size. If we know the
8171
      --  component size for both arrays, and it is the same, then that's
8172
      --  good enough to know we don't have a change of representation.
8173
 
8174
      if Is_Array_Type (T1) then
8175
         if Known_Component_Size (T1)
8176
           and then Known_Component_Size (T2)
8177
           and then Component_Size (T1) = Component_Size (T2)
8178
         then
8179
            if VM_Target = No_VM then
8180
               return True;
8181
 
8182
            --  In VM targets the representation of arrays with aliased
8183
            --  components differs from arrays with non-aliased components
8184
 
8185
            else
8186
               return Has_Aliased_Components (Base_Type (T1))
8187
                        =
8188
                      Has_Aliased_Components (Base_Type (T2));
8189
            end if;
8190
         end if;
8191
      end if;
8192
 
8193
      --  Types definitely have same representation if neither has non-standard
8194
      --  representation since default representations are always consistent.
8195
      --  If only one has non-standard representation, and the other does not,
8196
      --  then we consider that they do not have the same representation. They
8197
      --  might, but there is no way of telling early enough.
8198
 
8199
      if Has_Non_Standard_Rep (T1) then
8200
         if not Has_Non_Standard_Rep (T2) then
8201
            return False;
8202
         end if;
8203
      else
8204
         return not Has_Non_Standard_Rep (T2);
8205
      end if;
8206
 
8207
      --  Here the two types both have non-standard representation, and we need
8208
      --  to determine if they have the same non-standard representation.
8209
 
8210
      --  For arrays, we simply need to test if the component sizes are the
8211
      --  same. Pragma Pack is reflected in modified component sizes, so this
8212
      --  check also deals with pragma Pack.
8213
 
8214
      if Is_Array_Type (T1) then
8215
         return Component_Size (T1) = Component_Size (T2);
8216
 
8217
      --  Tagged types always have the same representation, because it is not
8218
      --  possible to specify different representations for common fields.
8219
 
8220
      elsif Is_Tagged_Type (T1) then
8221
         return True;
8222
 
8223
      --  Case of record types
8224
 
8225
      elsif Is_Record_Type (T1) then
8226
 
8227
         --  Packed status must conform
8228
 
8229
         if Is_Packed (T1) /= Is_Packed (T2) then
8230
            return False;
8231
 
8232
         --  Otherwise we must check components. Typ2 maybe a constrained
8233
         --  subtype with fewer components, so we compare the components
8234
         --  of the base types.
8235
 
8236
         else
8237
            Record_Case : declare
8238
               CD1, CD2 : Entity_Id;
8239
 
8240
               function Same_Rep return Boolean;
8241
               --  CD1 and CD2 are either components or discriminants. This
8242
               --  function tests whether the two have the same representation
8243
 
8244
               --------------
8245
               -- Same_Rep --
8246
               --------------
8247
 
8248
               function Same_Rep return Boolean is
8249
               begin
8250
                  if No (Component_Clause (CD1)) then
8251
                     return No (Component_Clause (CD2));
8252
 
8253
                  else
8254
                     return
8255
                        Present (Component_Clause (CD2))
8256
                          and then
8257
                        Component_Bit_Offset (CD1) = Component_Bit_Offset (CD2)
8258
                          and then
8259
                        Esize (CD1) = Esize (CD2);
8260
                  end if;
8261
               end Same_Rep;
8262
 
8263
            --  Start of processing for Record_Case
8264
 
8265
            begin
8266
               if Has_Discriminants (T1) then
8267
                  CD1 := First_Discriminant (T1);
8268
                  CD2 := First_Discriminant (T2);
8269
 
8270
                  --  The number of discriminants may be different if the
8271
                  --  derived type has fewer (constrained by values). The
8272
                  --  invisible discriminants retain the representation of
8273
                  --  the original, so the discrepancy does not per se
8274
                  --  indicate a different representation.
8275
 
8276
                  while Present (CD1)
8277
                    and then Present (CD2)
8278
                  loop
8279
                     if not Same_Rep then
8280
                        return False;
8281
                     else
8282
                        Next_Discriminant (CD1);
8283
                        Next_Discriminant (CD2);
8284
                     end if;
8285
                  end loop;
8286
               end if;
8287
 
8288
               CD1 := First_Component (Underlying_Type (Base_Type (T1)));
8289
               CD2 := First_Component (Underlying_Type (Base_Type (T2)));
8290
 
8291
               while Present (CD1) loop
8292
                  if not Same_Rep then
8293
                     return False;
8294
                  else
8295
                     Next_Component (CD1);
8296
                     Next_Component (CD2);
8297
                  end if;
8298
               end loop;
8299
 
8300
               return True;
8301
            end Record_Case;
8302
         end if;
8303
 
8304
      --  For enumeration types, we must check each literal to see if the
8305
      --  representation is the same. Note that we do not permit enumeration
8306
      --  representation clauses for Character and Wide_Character, so these
8307
      --  cases were already dealt with.
8308
 
8309
      elsif Is_Enumeration_Type (T1) then
8310
         Enumeration_Case : declare
8311
            L1, L2 : Entity_Id;
8312
 
8313
         begin
8314
            L1 := First_Literal (T1);
8315
            L2 := First_Literal (T2);
8316
 
8317
            while Present (L1) loop
8318
               if Enumeration_Rep (L1) /= Enumeration_Rep (L2) then
8319
                  return False;
8320
               else
8321
                  Next_Literal (L1);
8322
                  Next_Literal (L2);
8323
               end if;
8324
            end loop;
8325
 
8326
            return True;
8327
 
8328
         end Enumeration_Case;
8329
 
8330
      --  Any other types have the same representation for these purposes
8331
 
8332
      else
8333
         return True;
8334
      end if;
8335
   end Same_Representation;
8336
 
8337
   ----------------
8338
   -- Set_Biased --
8339
   ----------------
8340
 
8341
   procedure Set_Biased
8342
     (E      : Entity_Id;
8343
      N      : Node_Id;
8344
      Msg    : String;
8345
      Biased : Boolean := True)
8346
   is
8347
   begin
8348
      if Biased then
8349
         Set_Has_Biased_Representation (E);
8350
 
8351
         if Warn_On_Biased_Representation then
8352
            Error_Msg_NE
8353
              ("?" & Msg & " forces biased representation for&", N, E);
8354
         end if;
8355
      end if;
8356
   end Set_Biased;
8357
 
8358
   --------------------
8359
   -- Set_Enum_Esize --
8360
   --------------------
8361
 
8362
   procedure Set_Enum_Esize (T : Entity_Id) is
8363
      Lo : Uint;
8364
      Hi : Uint;
8365
      Sz : Nat;
8366
 
8367
   begin
8368
      Init_Alignment (T);
8369
 
8370
      --  Find the minimum standard size (8,16,32,64) that fits
8371
 
8372
      Lo := Enumeration_Rep (Entity (Type_Low_Bound (T)));
8373
      Hi := Enumeration_Rep (Entity (Type_High_Bound (T)));
8374
 
8375
      if Lo < 0 then
8376
         if Lo >= -Uint_2**07 and then Hi < Uint_2**07 then
8377
            Sz := Standard_Character_Size;  -- May be > 8 on some targets
8378
 
8379
         elsif Lo >= -Uint_2**15 and then Hi < Uint_2**15 then
8380
            Sz := 16;
8381
 
8382
         elsif Lo >= -Uint_2**31 and then Hi < Uint_2**31 then
8383
            Sz := 32;
8384
 
8385
         else pragma Assert (Lo >= -Uint_2**63 and then Hi < Uint_2**63);
8386
            Sz := 64;
8387
         end if;
8388
 
8389
      else
8390
         if Hi < Uint_2**08 then
8391
            Sz := Standard_Character_Size;  -- May be > 8 on some targets
8392
 
8393
         elsif Hi < Uint_2**16 then
8394
            Sz := 16;
8395
 
8396
         elsif Hi < Uint_2**32 then
8397
            Sz := 32;
8398
 
8399
         else pragma Assert (Hi < Uint_2**63);
8400
            Sz := 64;
8401
         end if;
8402
      end if;
8403
 
8404
      --  That minimum is the proper size unless we have a foreign convention
8405
      --  and the size required is 32 or less, in which case we bump the size
8406
      --  up to 32. This is required for C and C++ and seems reasonable for
8407
      --  all other foreign conventions.
8408
 
8409
      if Has_Foreign_Convention (T)
8410
        and then Esize (T) < Standard_Integer_Size
8411
      then
8412
         Init_Esize (T, Standard_Integer_Size);
8413
      else
8414
         Init_Esize (T, Sz);
8415
      end if;
8416
   end Set_Enum_Esize;
8417
 
8418
   ------------------------------
8419
   -- Validate_Address_Clauses --
8420
   ------------------------------
8421
 
8422
   procedure Validate_Address_Clauses is
8423
   begin
8424
      for J in Address_Clause_Checks.First .. Address_Clause_Checks.Last loop
8425
         declare
8426
            ACCR : Address_Clause_Check_Record
8427
                     renames Address_Clause_Checks.Table (J);
8428
 
8429
            Expr : Node_Id;
8430
 
8431
            X_Alignment : Uint;
8432
            Y_Alignment : Uint;
8433
 
8434
            X_Size : Uint;
8435
            Y_Size : Uint;
8436
 
8437
         begin
8438
            --  Skip processing of this entry if warning already posted
8439
 
8440
            if not Address_Warning_Posted (ACCR.N) then
8441
 
8442
               Expr := Original_Node (Expression (ACCR.N));
8443
 
8444
               --  Get alignments
8445
 
8446
               X_Alignment := Alignment (ACCR.X);
8447
               Y_Alignment := Alignment (ACCR.Y);
8448
 
8449
               --  Similarly obtain sizes
8450
 
8451
               X_Size := Esize (ACCR.X);
8452
               Y_Size := Esize (ACCR.Y);
8453
 
8454
               --  Check for large object overlaying smaller one
8455
 
8456
               if Y_Size > Uint_0
8457
                 and then X_Size > Uint_0
8458
                 and then X_Size > Y_Size
8459
               then
8460
                  Error_Msg_NE
8461
                    ("?& overlays smaller object", ACCR.N, ACCR.X);
8462
                  Error_Msg_N
8463
                    ("\?program execution may be erroneous", ACCR.N);
8464
                  Error_Msg_Uint_1 := X_Size;
8465
                  Error_Msg_NE
8466
                    ("\?size of & is ^", ACCR.N, ACCR.X);
8467
                  Error_Msg_Uint_1 := Y_Size;
8468
                  Error_Msg_NE
8469
                    ("\?size of & is ^", ACCR.N, ACCR.Y);
8470
 
8471
               --  Check for inadequate alignment, both of the base object
8472
               --  and of the offset, if any.
8473
 
8474
               --  Note: we do not check the alignment if we gave a size
8475
               --  warning, since it would likely be redundant.
8476
 
8477
               elsif Y_Alignment /= Uint_0
8478
                 and then (Y_Alignment < X_Alignment
8479
                             or else (ACCR.Off
8480
                                        and then
8481
                                          Nkind (Expr) = N_Attribute_Reference
8482
                                        and then
8483
                                          Attribute_Name (Expr) = Name_Address
8484
                                        and then
8485
                                          Has_Compatible_Alignment
8486
                                            (ACCR.X, Prefix (Expr))
8487
                                             /= Known_Compatible))
8488
               then
8489
                  Error_Msg_NE
8490
                    ("?specified address for& may be inconsistent "
8491
                       & "with alignment",
8492
                     ACCR.N, ACCR.X);
8493
                  Error_Msg_N
8494
                    ("\?program execution may be erroneous (RM 13.3(27))",
8495
                     ACCR.N);
8496
                  Error_Msg_Uint_1 := X_Alignment;
8497
                  Error_Msg_NE
8498
                    ("\?alignment of & is ^",
8499
                     ACCR.N, ACCR.X);
8500
                  Error_Msg_Uint_1 := Y_Alignment;
8501
                  Error_Msg_NE
8502
                    ("\?alignment of & is ^",
8503
                     ACCR.N, ACCR.Y);
8504
                  if Y_Alignment >= X_Alignment then
8505
                     Error_Msg_N
8506
                      ("\?but offset is not multiple of alignment",
8507
                       ACCR.N);
8508
                  end if;
8509
               end if;
8510
            end if;
8511
         end;
8512
      end loop;
8513
   end Validate_Address_Clauses;
8514
 
8515
   ---------------------------
8516
   -- Validate_Independence --
8517
   ---------------------------
8518
 
8519
   procedure Validate_Independence is
8520
      SU   : constant Uint := UI_From_Int (System_Storage_Unit);
8521
      N    : Node_Id;
8522
      E    : Entity_Id;
8523
      IC   : Boolean;
8524
      Comp : Entity_Id;
8525
      Addr : Node_Id;
8526
      P    : Node_Id;
8527
 
8528
      procedure Check_Array_Type (Atyp : Entity_Id);
8529
      --  Checks if the array type Atyp has independent components, and
8530
      --  if not, outputs an appropriate set of error messages.
8531
 
8532
      procedure No_Independence;
8533
      --  Output message that independence cannot be guaranteed
8534
 
8535
      function OK_Component (C : Entity_Id) return Boolean;
8536
      --  Checks one component to see if it is independently accessible, and
8537
      --  if so yields True, otherwise yields False if independent access
8538
      --  cannot be guaranteed. This is a conservative routine, it only
8539
      --  returns True if it knows for sure, it returns False if it knows
8540
      --  there is a problem, or it cannot be sure there is no problem.
8541
 
8542
      procedure Reason_Bad_Component (C : Entity_Id);
8543
      --  Outputs continuation message if a reason can be determined for
8544
      --  the component C being bad.
8545
 
8546
      ----------------------
8547
      -- Check_Array_Type --
8548
      ----------------------
8549
 
8550
      procedure Check_Array_Type (Atyp : Entity_Id) is
8551
         Ctyp : constant Entity_Id := Component_Type (Atyp);
8552
 
8553
      begin
8554
         --  OK if no alignment clause, no pack, and no component size
8555
 
8556
         if not Has_Component_Size_Clause (Atyp)
8557
           and then not Has_Alignment_Clause (Atyp)
8558
           and then not Is_Packed (Atyp)
8559
         then
8560
            return;
8561
         end if;
8562
 
8563
         --  Check actual component size
8564
 
8565
         if not Known_Component_Size (Atyp)
8566
           or else not (Addressable (Component_Size (Atyp))
8567
                          and then Component_Size (Atyp) < 64)
8568
           or else Component_Size (Atyp) mod Esize (Ctyp) /= 0
8569
         then
8570
            No_Independence;
8571
 
8572
            --  Bad component size, check reason
8573
 
8574
            if Has_Component_Size_Clause (Atyp) then
8575
               P :=
8576
                 Get_Attribute_Definition_Clause
8577
                   (Atyp, Attribute_Component_Size);
8578
 
8579
               if Present (P) then
8580
                  Error_Msg_Sloc := Sloc (P);
8581
                  Error_Msg_N ("\because of Component_Size clause#", N);
8582
                  return;
8583
               end if;
8584
            end if;
8585
 
8586
            if Is_Packed (Atyp) then
8587
               P := Get_Rep_Pragma (Atyp, Name_Pack);
8588
 
8589
               if Present (P) then
8590
                  Error_Msg_Sloc := Sloc (P);
8591
                  Error_Msg_N ("\because of pragma Pack#", N);
8592
                  return;
8593
               end if;
8594
            end if;
8595
 
8596
            --  No reason found, just return
8597
 
8598
            return;
8599
         end if;
8600
 
8601
         --  Array type is OK independence-wise
8602
 
8603
         return;
8604
      end Check_Array_Type;
8605
 
8606
      ---------------------
8607
      -- No_Independence --
8608
      ---------------------
8609
 
8610
      procedure No_Independence is
8611
      begin
8612
         if Pragma_Name (N) = Name_Independent then
8613
            Error_Msg_NE
8614
              ("independence cannot be guaranteed for&", N, E);
8615
         else
8616
            Error_Msg_NE
8617
              ("independent components cannot be guaranteed for&", N, E);
8618
         end if;
8619
      end No_Independence;
8620
 
8621
      ------------------
8622
      -- OK_Component --
8623
      ------------------
8624
 
8625
      function OK_Component (C : Entity_Id) return Boolean is
8626
         Rec  : constant Entity_Id := Scope (C);
8627
         Ctyp : constant Entity_Id := Etype (C);
8628
 
8629
      begin
8630
         --  OK if no component clause, no Pack, and no alignment clause
8631
 
8632
         if No (Component_Clause (C))
8633
           and then not Is_Packed (Rec)
8634
           and then not Has_Alignment_Clause (Rec)
8635
         then
8636
            return True;
8637
         end if;
8638
 
8639
         --  Here we look at the actual component layout. A component is
8640
         --  addressable if its size is a multiple of the Esize of the
8641
         --  component type, and its starting position in the record has
8642
         --  appropriate alignment, and the record itself has appropriate
8643
         --  alignment to guarantee the component alignment.
8644
 
8645
         --  Make sure sizes are static, always assume the worst for any
8646
         --  cases where we cannot check static values.
8647
 
8648
         if not (Known_Static_Esize (C)
8649
                  and then Known_Static_Esize (Ctyp))
8650
         then
8651
            return False;
8652
         end if;
8653
 
8654
         --  Size of component must be addressable or greater than 64 bits
8655
         --  and a multiple of bytes.
8656
 
8657
         if not Addressable (Esize (C))
8658
           and then Esize (C) < Uint_64
8659
         then
8660
            return False;
8661
         end if;
8662
 
8663
         --  Check size is proper multiple
8664
 
8665
         if Esize (C) mod Esize (Ctyp) /= 0 then
8666
            return False;
8667
         end if;
8668
 
8669
         --  Check alignment of component is OK
8670
 
8671
         if not Known_Component_Bit_Offset (C)
8672
           or else Component_Bit_Offset (C) < Uint_0
8673
           or else Component_Bit_Offset (C) mod Esize (Ctyp) /= 0
8674
         then
8675
            return False;
8676
         end if;
8677
 
8678
         --  Check alignment of record type is OK
8679
 
8680
         if not Known_Alignment (Rec)
8681
           or else (Alignment (Rec) * SU) mod Esize (Ctyp) /= 0
8682
         then
8683
            return False;
8684
         end if;
8685
 
8686
         --  All tests passed, component is addressable
8687
 
8688
         return True;
8689
      end OK_Component;
8690
 
8691
      --------------------------
8692
      -- Reason_Bad_Component --
8693
      --------------------------
8694
 
8695
      procedure Reason_Bad_Component (C : Entity_Id) is
8696
         Rec  : constant Entity_Id := Scope (C);
8697
         Ctyp : constant Entity_Id := Etype (C);
8698
 
8699
      begin
8700
         --  If component clause present assume that's the problem
8701
 
8702
         if Present (Component_Clause (C)) then
8703
            Error_Msg_Sloc := Sloc (Component_Clause (C));
8704
            Error_Msg_N ("\because of Component_Clause#", N);
8705
            return;
8706
         end if;
8707
 
8708
         --  If pragma Pack clause present, assume that's the problem
8709
 
8710
         if Is_Packed (Rec) then
8711
            P := Get_Rep_Pragma (Rec, Name_Pack);
8712
 
8713
            if Present (P) then
8714
               Error_Msg_Sloc := Sloc (P);
8715
               Error_Msg_N ("\because of pragma Pack#", N);
8716
               return;
8717
            end if;
8718
         end if;
8719
 
8720
         --  See if record has bad alignment clause
8721
 
8722
         if Has_Alignment_Clause (Rec)
8723
           and then Known_Alignment (Rec)
8724
           and then (Alignment (Rec) * SU) mod Esize (Ctyp) /= 0
8725
         then
8726
            P := Get_Attribute_Definition_Clause (Rec, Attribute_Alignment);
8727
 
8728
            if Present (P) then
8729
               Error_Msg_Sloc := Sloc (P);
8730
               Error_Msg_N ("\because of Alignment clause#", N);
8731
            end if;
8732
         end if;
8733
 
8734
         --  Couldn't find a reason, so return without a message
8735
 
8736
         return;
8737
      end Reason_Bad_Component;
8738
 
8739
   --  Start of processing for Validate_Independence
8740
 
8741
   begin
8742
      for J in Independence_Checks.First .. Independence_Checks.Last loop
8743
         N  := Independence_Checks.Table (J).N;
8744
         E  := Independence_Checks.Table (J).E;
8745
         IC := Pragma_Name (N) = Name_Independent_Components;
8746
 
8747
         --  Deal with component case
8748
 
8749
         if Ekind (E) = E_Discriminant or else Ekind (E) = E_Component then
8750
            if not OK_Component (E) then
8751
               No_Independence;
8752
               Reason_Bad_Component (E);
8753
               goto Continue;
8754
            end if;
8755
         end if;
8756
 
8757
         --  Deal with record with Independent_Components
8758
 
8759
         if IC and then Is_Record_Type (E) then
8760
            Comp := First_Component_Or_Discriminant (E);
8761
            while Present (Comp) loop
8762
               if not OK_Component (Comp) then
8763
                  No_Independence;
8764
                  Reason_Bad_Component (Comp);
8765
                  goto Continue;
8766
               end if;
8767
 
8768
               Next_Component_Or_Discriminant (Comp);
8769
            end loop;
8770
         end if;
8771
 
8772
         --  Deal with address clause case
8773
 
8774
         if Is_Object (E) then
8775
            Addr := Address_Clause (E);
8776
 
8777
            if Present (Addr) then
8778
               No_Independence;
8779
               Error_Msg_Sloc := Sloc (Addr);
8780
               Error_Msg_N ("\because of Address clause#", N);
8781
               goto Continue;
8782
            end if;
8783
         end if;
8784
 
8785
         --  Deal with independent components for array type
8786
 
8787
         if IC and then Is_Array_Type (E) then
8788
            Check_Array_Type (E);
8789
         end if;
8790
 
8791
         --  Deal with independent components for array object
8792
 
8793
         if IC and then Is_Object (E) and then Is_Array_Type (Etype (E)) then
8794
            Check_Array_Type (Etype (E));
8795
         end if;
8796
 
8797
      <<Continue>> null;
8798
      end loop;
8799
   end Validate_Independence;
8800
 
8801
   -----------------------------------
8802
   -- Validate_Unchecked_Conversion --
8803
   -----------------------------------
8804
 
8805
   procedure Validate_Unchecked_Conversion
8806
     (N        : Node_Id;
8807
      Act_Unit : Entity_Id)
8808
   is
8809
      Source : Entity_Id;
8810
      Target : Entity_Id;
8811
      Vnode  : Node_Id;
8812
 
8813
   begin
8814
      --  Obtain source and target types. Note that we call Ancestor_Subtype
8815
      --  here because the processing for generic instantiation always makes
8816
      --  subtypes, and we want the original frozen actual types.
8817
 
8818
      --  If we are dealing with private types, then do the check on their
8819
      --  fully declared counterparts if the full declarations have been
8820
      --  encountered (they don't have to be visible, but they must exist!)
8821
 
8822
      Source := Ancestor_Subtype (Etype (First_Formal (Act_Unit)));
8823
 
8824
      if Is_Private_Type (Source)
8825
        and then Present (Underlying_Type (Source))
8826
      then
8827
         Source := Underlying_Type (Source);
8828
      end if;
8829
 
8830
      Target := Ancestor_Subtype (Etype (Act_Unit));
8831
 
8832
      --  If either type is generic, the instantiation happens within a generic
8833
      --  unit, and there is nothing to check. The proper check will happen
8834
      --  when the enclosing generic is instantiated.
8835
 
8836
      if Is_Generic_Type (Source) or else Is_Generic_Type (Target) then
8837
         return;
8838
      end if;
8839
 
8840
      if Is_Private_Type (Target)
8841
        and then Present (Underlying_Type (Target))
8842
      then
8843
         Target := Underlying_Type (Target);
8844
      end if;
8845
 
8846
      --  Source may be unconstrained array, but not target
8847
 
8848
      if Is_Array_Type (Target)
8849
        and then not Is_Constrained (Target)
8850
      then
8851
         Error_Msg_N
8852
           ("unchecked conversion to unconstrained array not allowed", N);
8853
         return;
8854
      end if;
8855
 
8856
      --  Warn if conversion between two different convention pointers
8857
 
8858
      if Is_Access_Type (Target)
8859
        and then Is_Access_Type (Source)
8860
        and then Convention (Target) /= Convention (Source)
8861
        and then Warn_On_Unchecked_Conversion
8862
      then
8863
         --  Give warnings for subprogram pointers only on most targets. The
8864
         --  exception is VMS, where data pointers can have different lengths
8865
         --  depending on the pointer convention.
8866
 
8867
         if Is_Access_Subprogram_Type (Target)
8868
           or else Is_Access_Subprogram_Type (Source)
8869
           or else OpenVMS_On_Target
8870
         then
8871
            Error_Msg_N
8872
              ("?conversion between pointers with different conventions!", N);
8873
         end if;
8874
      end if;
8875
 
8876
      --  Warn if one of the operands is Ada.Calendar.Time. Do not emit a
8877
      --  warning when compiling GNAT-related sources.
8878
 
8879
      if Warn_On_Unchecked_Conversion
8880
        and then not In_Predefined_Unit (N)
8881
        and then RTU_Loaded (Ada_Calendar)
8882
        and then
8883
          (Chars (Source) = Name_Time
8884
             or else
8885
           Chars (Target) = Name_Time)
8886
      then
8887
         --  If Ada.Calendar is loaded and the name of one of the operands is
8888
         --  Time, there is a good chance that this is Ada.Calendar.Time.
8889
 
8890
         declare
8891
            Calendar_Time : constant Entity_Id :=
8892
                              Full_View (RTE (RO_CA_Time));
8893
         begin
8894
            pragma Assert (Present (Calendar_Time));
8895
 
8896
            if Source = Calendar_Time
8897
              or else Target = Calendar_Time
8898
            then
8899
               Error_Msg_N
8900
                 ("?representation of 'Time values may change between " &
8901
                  "'G'N'A'T versions", N);
8902
            end if;
8903
         end;
8904
      end if;
8905
 
8906
      --  Make entry in unchecked conversion table for later processing by
8907
      --  Validate_Unchecked_Conversions, which will check sizes and alignments
8908
      --  (using values set by the back-end where possible). This is only done
8909
      --  if the appropriate warning is active.
8910
 
8911
      if Warn_On_Unchecked_Conversion then
8912
         Unchecked_Conversions.Append
8913
           (New_Val => UC_Entry'
8914
              (Eloc   => Sloc (N),
8915
               Source => Source,
8916
               Target => Target));
8917
 
8918
         --  If both sizes are known statically now, then back end annotation
8919
         --  is not required to do a proper check but if either size is not
8920
         --  known statically, then we need the annotation.
8921
 
8922
         if Known_Static_RM_Size (Source)
8923
           and then Known_Static_RM_Size (Target)
8924
         then
8925
            null;
8926
         else
8927
            Back_Annotate_Rep_Info := True;
8928
         end if;
8929
      end if;
8930
 
8931
      --  If unchecked conversion to access type, and access type is declared
8932
      --  in the same unit as the unchecked conversion, then set the flag
8933
      --  No_Strict_Aliasing (no strict aliasing is implicit here)
8934
 
8935
      if Is_Access_Type (Target) and then
8936
        In_Same_Source_Unit (Target, N)
8937
      then
8938
         Set_No_Strict_Aliasing (Implementation_Base_Type (Target));
8939
      end if;
8940
 
8941
      --  Generate N_Validate_Unchecked_Conversion node for back end in case
8942
      --  the back end needs to perform special validation checks.
8943
 
8944
      --  Shouldn't this be in Exp_Ch13, since the check only gets done if we
8945
      --  have full expansion and the back end is called ???
8946
 
8947
      Vnode :=
8948
        Make_Validate_Unchecked_Conversion (Sloc (N));
8949
      Set_Source_Type (Vnode, Source);
8950
      Set_Target_Type (Vnode, Target);
8951
 
8952
      --  If the unchecked conversion node is in a list, just insert before it.
8953
      --  If not we have some strange case, not worth bothering about.
8954
 
8955
      if Is_List_Member (N) then
8956
         Insert_After (N, Vnode);
8957
      end if;
8958
   end Validate_Unchecked_Conversion;
8959
 
8960
   ------------------------------------
8961
   -- Validate_Unchecked_Conversions --
8962
   ------------------------------------
8963
 
8964
   procedure Validate_Unchecked_Conversions is
8965
   begin
8966
      for N in Unchecked_Conversions.First .. Unchecked_Conversions.Last loop
8967
         declare
8968
            T : UC_Entry renames Unchecked_Conversions.Table (N);
8969
 
8970
            Eloc   : constant Source_Ptr := T.Eloc;
8971
            Source : constant Entity_Id  := T.Source;
8972
            Target : constant Entity_Id  := T.Target;
8973
 
8974
            Source_Siz : Uint;
8975
            Target_Siz : Uint;
8976
 
8977
         begin
8978
            --  This validation check, which warns if we have unequal sizes for
8979
            --  unchecked conversion, and thus potentially implementation
8980
            --  dependent semantics, is one of the few occasions on which we
8981
            --  use the official RM size instead of Esize. See description in
8982
            --  Einfo "Handling of Type'Size Values" for details.
8983
 
8984
            if Serious_Errors_Detected = 0
8985
              and then Known_Static_RM_Size (Source)
8986
              and then Known_Static_RM_Size (Target)
8987
 
8988
              --  Don't do the check if warnings off for either type, note the
8989
              --  deliberate use of OR here instead of OR ELSE to get the flag
8990
              --  Warnings_Off_Used set for both types if appropriate.
8991
 
8992
              and then not (Has_Warnings_Off (Source)
8993
                              or
8994
                            Has_Warnings_Off (Target))
8995
            then
8996
               Source_Siz := RM_Size (Source);
8997
               Target_Siz := RM_Size (Target);
8998
 
8999
               if Source_Siz /= Target_Siz then
9000
                  Error_Msg
9001
                    ("?types for unchecked conversion have different sizes!",
9002
                     Eloc);
9003
 
9004
                  if All_Errors_Mode then
9005
                     Error_Msg_Name_1 := Chars (Source);
9006
                     Error_Msg_Uint_1 := Source_Siz;
9007
                     Error_Msg_Name_2 := Chars (Target);
9008
                     Error_Msg_Uint_2 := Target_Siz;
9009
                     Error_Msg ("\size of % is ^, size of % is ^?", Eloc);
9010
 
9011
                     Error_Msg_Uint_1 := UI_Abs (Source_Siz - Target_Siz);
9012
 
9013
                     if Is_Discrete_Type (Source)
9014
                       and then Is_Discrete_Type (Target)
9015
                     then
9016
                        if Source_Siz > Target_Siz then
9017
                           Error_Msg
9018
                             ("\?^ high order bits of source will be ignored!",
9019
                              Eloc);
9020
 
9021
                        elsif Is_Unsigned_Type (Source) then
9022
                           Error_Msg
9023
                             ("\?source will be extended with ^ high order " &
9024
                              "zero bits?!", Eloc);
9025
 
9026
                        else
9027
                           Error_Msg
9028
                             ("\?source will be extended with ^ high order " &
9029
                              "sign bits!",
9030
                              Eloc);
9031
                        end if;
9032
 
9033
                     elsif Source_Siz < Target_Siz then
9034
                        if Is_Discrete_Type (Target) then
9035
                           if Bytes_Big_Endian then
9036
                              Error_Msg
9037
                                ("\?target value will include ^ undefined " &
9038
                                 "low order bits!",
9039
                                 Eloc);
9040
                           else
9041
                              Error_Msg
9042
                                ("\?target value will include ^ undefined " &
9043
                                 "high order bits!",
9044
                                 Eloc);
9045
                           end if;
9046
 
9047
                        else
9048
                           Error_Msg
9049
                             ("\?^ trailing bits of target value will be " &
9050
                              "undefined!", Eloc);
9051
                        end if;
9052
 
9053
                     else pragma Assert (Source_Siz > Target_Siz);
9054
                        Error_Msg
9055
                          ("\?^ trailing bits of source will be ignored!",
9056
                           Eloc);
9057
                     end if;
9058
                  end if;
9059
               end if;
9060
            end if;
9061
 
9062
            --  If both types are access types, we need to check the alignment.
9063
            --  If the alignment of both is specified, we can do it here.
9064
 
9065
            if Serious_Errors_Detected = 0
9066
              and then Ekind (Source) in Access_Kind
9067
              and then Ekind (Target) in Access_Kind
9068
              and then Target_Strict_Alignment
9069
              and then Present (Designated_Type (Source))
9070
              and then Present (Designated_Type (Target))
9071
            then
9072
               declare
9073
                  D_Source : constant Entity_Id := Designated_Type (Source);
9074
                  D_Target : constant Entity_Id := Designated_Type (Target);
9075
 
9076
               begin
9077
                  if Known_Alignment (D_Source)
9078
                    and then Known_Alignment (D_Target)
9079
                  then
9080
                     declare
9081
                        Source_Align : constant Uint := Alignment (D_Source);
9082
                        Target_Align : constant Uint := Alignment (D_Target);
9083
 
9084
                     begin
9085
                        if Source_Align < Target_Align
9086
                          and then not Is_Tagged_Type (D_Source)
9087
 
9088
                          --  Suppress warning if warnings suppressed on either
9089
                          --  type or either designated type. Note the use of
9090
                          --  OR here instead of OR ELSE. That is intentional,
9091
                          --  we would like to set flag Warnings_Off_Used in
9092
                          --  all types for which warnings are suppressed.
9093
 
9094
                          and then not (Has_Warnings_Off (D_Source)
9095
                                          or
9096
                                        Has_Warnings_Off (D_Target)
9097
                                          or
9098
                                        Has_Warnings_Off (Source)
9099
                                          or
9100
                                        Has_Warnings_Off (Target))
9101
                        then
9102
                           Error_Msg_Uint_1 := Target_Align;
9103
                           Error_Msg_Uint_2 := Source_Align;
9104
                           Error_Msg_Node_1 := D_Target;
9105
                           Error_Msg_Node_2 := D_Source;
9106
                           Error_Msg
9107
                             ("?alignment of & (^) is stricter than " &
9108
                              "alignment of & (^)!", Eloc);
9109
                           Error_Msg
9110
                             ("\?resulting access value may have invalid " &
9111
                              "alignment!", Eloc);
9112
                        end if;
9113
                     end;
9114
                  end if;
9115
               end;
9116
            end if;
9117
         end;
9118
      end loop;
9119
   end Validate_Unchecked_Conversions;
9120
 
9121
end Sem_Ch13;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.