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

Subversion Repositories openrisc

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

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 _ A U X                               --
6
--                                                                          --
7
--                                 B o d y                                  --
8
--                                                                          --
9
--          Copyright (C) 1992-2011, 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
-- As a special exception,  if other files  instantiate  generics from this --
22
-- unit, or you link  this unit with other files  to produce an executable, --
23
-- this  unit  does not  by itself cause  the resulting  executable  to  be --
24
-- covered  by the  GNU  General  Public  License.  This exception does not --
25
-- however invalidate  any other reasons why  the executable file  might be --
26
-- covered by the  GNU Public License.                                      --
27
--                                                                          --
28
-- GNAT was originally developed  by the GNAT team at  New York University. --
29
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
30
--                                                                          --
31
------------------------------------------------------------------------------
32
 
33
with Atree;  use Atree;
34
with Einfo;  use Einfo;
35
with Namet;  use Namet;
36
with Sinfo;  use Sinfo;
37
with Snames; use Snames;
38
with Stand;  use Stand;
39
 
40
package body Sem_Aux is
41
 
42
   ----------------------
43
   -- Ancestor_Subtype --
44
   ----------------------
45
 
46
   function Ancestor_Subtype (Typ : Entity_Id) return Entity_Id is
47
   begin
48
      --  If this is first subtype, or is a base type, then there is no
49
      --  ancestor subtype, so we return Empty to indicate this fact.
50
 
51
      if Is_First_Subtype (Typ) or else Is_Base_Type (Typ) then
52
         return Empty;
53
      end if;
54
 
55
      declare
56
         D : constant Node_Id := Declaration_Node (Typ);
57
 
58
      begin
59
         --  If we have a subtype declaration, get the ancestor subtype
60
 
61
         if Nkind (D) = N_Subtype_Declaration then
62
            if Nkind (Subtype_Indication (D)) = N_Subtype_Indication then
63
               return Entity (Subtype_Mark (Subtype_Indication (D)));
64
            else
65
               return Entity (Subtype_Indication (D));
66
            end if;
67
 
68
         --  If not, then no subtype indication is available
69
 
70
         else
71
            return Empty;
72
         end if;
73
      end;
74
   end Ancestor_Subtype;
75
 
76
   --------------------
77
   -- Available_View --
78
   --------------------
79
 
80
   function Available_View (Typ : Entity_Id) return Entity_Id is
81
   begin
82
      if Is_Incomplete_Type (Typ)
83
        and then Present (Non_Limited_View (Typ))
84
      then
85
         --  The non-limited view may itself be an incomplete type, in which
86
         --  case get its full view.
87
 
88
         return Get_Full_View (Non_Limited_View (Typ));
89
 
90
      elsif Is_Class_Wide_Type (Typ)
91
        and then Is_Incomplete_Type (Etype (Typ))
92
        and then Present (Non_Limited_View (Etype (Typ)))
93
      then
94
         return Class_Wide_Type (Non_Limited_View (Etype (Typ)));
95
 
96
      else
97
         return Typ;
98
      end if;
99
   end Available_View;
100
 
101
   --------------------
102
   -- Constant_Value --
103
   --------------------
104
 
105
   function Constant_Value (Ent : Entity_Id) return Node_Id is
106
      D      : constant Node_Id := Declaration_Node (Ent);
107
      Full_D : Node_Id;
108
 
109
   begin
110
      --  If we have no declaration node, then return no constant value. Not
111
      --  clear how this can happen, but it does sometimes and this is the
112
      --  safest approach.
113
 
114
      if No (D) then
115
         return Empty;
116
 
117
      --  Normal case where a declaration node is present
118
 
119
      elsif Nkind (D) = N_Object_Renaming_Declaration then
120
         return Renamed_Object (Ent);
121
 
122
      --  If this is a component declaration whose entity is a constant, it is
123
      --  a prival within a protected function (and so has no constant value).
124
 
125
      elsif Nkind (D) = N_Component_Declaration then
126
         return Empty;
127
 
128
      --  If there is an expression, return it
129
 
130
      elsif Present (Expression (D)) then
131
         return (Expression (D));
132
 
133
      --  For a constant, see if we have a full view
134
 
135
      elsif Ekind (Ent) = E_Constant
136
        and then Present (Full_View (Ent))
137
      then
138
         Full_D := Parent (Full_View (Ent));
139
 
140
         --  The full view may have been rewritten as an object renaming
141
 
142
         if Nkind (Full_D) = N_Object_Renaming_Declaration then
143
            return Name (Full_D);
144
         else
145
            return Expression (Full_D);
146
         end if;
147
 
148
      --  Otherwise we have no expression to return
149
 
150
      else
151
         return Empty;
152
      end if;
153
   end Constant_Value;
154
 
155
   ----------------------------------------------
156
   -- Effectively_Has_Constrained_Partial_View --
157
   ----------------------------------------------
158
 
159
   function Effectively_Has_Constrained_Partial_View
160
     (Typ  : Entity_Id;
161
      Scop : Entity_Id) return Boolean
162
   is
163
   begin
164
      return Has_Constrained_Partial_View (Typ)
165
        or else (In_Generic_Body (Scop)
166
                   and then Is_Generic_Type (Base_Type (Typ))
167
                   and then Is_Private_Type (Base_Type (Typ))
168
                   and then not Is_Tagged_Type (Typ)
169
                   and then not (Is_Array_Type (Typ)
170
                                   and then not Is_Constrained (Typ))
171
                   and then Has_Discriminants (Typ));
172
   end Effectively_Has_Constrained_Partial_View;
173
 
174
   -----------------------------
175
   -- Enclosing_Dynamic_Scope --
176
   -----------------------------
177
 
178
   function Enclosing_Dynamic_Scope (Ent : Entity_Id) return Entity_Id is
179
      S : Entity_Id;
180
 
181
   begin
182
      --  The following test is an error defense against some syntax errors
183
      --  that can leave scopes very messed up.
184
 
185
      if Ent = Standard_Standard then
186
         return Ent;
187
      end if;
188
 
189
      --  Normal case, search enclosing scopes
190
 
191
      --  Note: the test for Present (S) should not be required, it defends
192
      --  against an ill-formed tree.
193
 
194
      S := Scope (Ent);
195
      loop
196
         --  If we somehow got an empty value for Scope, the tree must be
197
         --  malformed. Rather than blow up we return Standard in this case.
198
 
199
         if No (S) then
200
            return Standard_Standard;
201
 
202
         --  Quit if we get to standard or a dynamic scope. We must also
203
         --  handle enclosing scopes that have a full view; required to
204
         --  locate enclosing scopes that are synchronized private types
205
         --  whose full view is a task type.
206
 
207
         elsif S = Standard_Standard
208
           or else Is_Dynamic_Scope (S)
209
           or else (Is_Private_Type (S)
210
                     and then Present (Full_View (S))
211
                     and then Is_Dynamic_Scope (Full_View (S)))
212
         then
213
            return S;
214
 
215
         --  Otherwise keep climbing
216
 
217
         else
218
            S := Scope (S);
219
         end if;
220
      end loop;
221
   end Enclosing_Dynamic_Scope;
222
 
223
   ------------------------
224
   -- First_Discriminant --
225
   ------------------------
226
 
227
   function First_Discriminant (Typ : Entity_Id) return Entity_Id is
228
      Ent : Entity_Id;
229
 
230
   begin
231
      pragma Assert
232
        (Has_Discriminants (Typ) or else Has_Unknown_Discriminants (Typ));
233
 
234
      Ent := First_Entity (Typ);
235
 
236
      --  The discriminants are not necessarily contiguous, because access
237
      --  discriminants will generate itypes. They are not the first entities
238
      --  either because the tag must be ahead of them.
239
 
240
      if Chars (Ent) = Name_uTag then
241
         Ent := Next_Entity (Ent);
242
      end if;
243
 
244
      --  Skip all hidden stored discriminants if any
245
 
246
      while Present (Ent) loop
247
         exit when Ekind (Ent) = E_Discriminant
248
           and then not Is_Completely_Hidden (Ent);
249
 
250
         Ent := Next_Entity (Ent);
251
      end loop;
252
 
253
      pragma Assert (Ekind (Ent) = E_Discriminant);
254
 
255
      return Ent;
256
   end First_Discriminant;
257
 
258
   -------------------------------
259
   -- First_Stored_Discriminant --
260
   -------------------------------
261
 
262
   function First_Stored_Discriminant (Typ : Entity_Id) return Entity_Id is
263
      Ent : Entity_Id;
264
 
265
      function Has_Completely_Hidden_Discriminant
266
        (Typ : Entity_Id) return Boolean;
267
      --  Scans the Discriminants to see whether any are Completely_Hidden
268
      --  (the mechanism for describing non-specified stored discriminants)
269
 
270
      ----------------------------------------
271
      -- Has_Completely_Hidden_Discriminant --
272
      ----------------------------------------
273
 
274
      function Has_Completely_Hidden_Discriminant
275
        (Typ : Entity_Id) return Boolean
276
      is
277
         Ent : Entity_Id;
278
 
279
      begin
280
         pragma Assert (Ekind (Typ) = E_Discriminant);
281
 
282
         Ent := Typ;
283
         while Present (Ent) and then Ekind (Ent) = E_Discriminant loop
284
            if Is_Completely_Hidden (Ent) then
285
               return True;
286
            end if;
287
 
288
            Ent := Next_Entity (Ent);
289
         end loop;
290
 
291
         return False;
292
      end Has_Completely_Hidden_Discriminant;
293
 
294
   --  Start of processing for First_Stored_Discriminant
295
 
296
   begin
297
      pragma Assert
298
        (Has_Discriminants (Typ)
299
          or else Has_Unknown_Discriminants (Typ));
300
 
301
      Ent := First_Entity (Typ);
302
 
303
      if Chars (Ent) = Name_uTag then
304
         Ent := Next_Entity (Ent);
305
      end if;
306
 
307
      if Has_Completely_Hidden_Discriminant (Ent) then
308
         while Present (Ent) loop
309
            exit when Is_Completely_Hidden (Ent);
310
            Ent := Next_Entity (Ent);
311
         end loop;
312
      end if;
313
 
314
      pragma Assert (Ekind (Ent) = E_Discriminant);
315
 
316
      return Ent;
317
   end First_Stored_Discriminant;
318
 
319
   -------------------
320
   -- First_Subtype --
321
   -------------------
322
 
323
   function First_Subtype (Typ : Entity_Id) return Entity_Id is
324
      B   : constant Entity_Id := Base_Type (Typ);
325
      F   : constant Node_Id   := Freeze_Node (B);
326
      Ent : Entity_Id;
327
 
328
   begin
329
      --  If the base type has no freeze node, it is a type in Standard, and
330
      --  always acts as its own first subtype, except where it is one of the
331
      --  predefined integer types. If the type is formal, it is also a first
332
      --  subtype, and its base type has no freeze node. On the other hand, a
333
      --  subtype of a generic formal is not its own first subtype. Its base
334
      --  type, if anonymous, is attached to the formal type decl. from which
335
      --  the first subtype is obtained.
336
 
337
      if No (F) then
338
         if B = Base_Type (Standard_Integer) then
339
            return Standard_Integer;
340
 
341
         elsif B = Base_Type (Standard_Long_Integer) then
342
            return Standard_Long_Integer;
343
 
344
         elsif B = Base_Type (Standard_Short_Short_Integer) then
345
            return Standard_Short_Short_Integer;
346
 
347
         elsif B = Base_Type (Standard_Short_Integer) then
348
            return Standard_Short_Integer;
349
 
350
         elsif B = Base_Type (Standard_Long_Long_Integer) then
351
            return Standard_Long_Long_Integer;
352
 
353
         elsif Is_Generic_Type (Typ) then
354
            if Present (Parent (B)) then
355
               return Defining_Identifier (Parent (B));
356
            else
357
               return Defining_Identifier (Associated_Node_For_Itype (B));
358
            end if;
359
 
360
         else
361
            return B;
362
         end if;
363
 
364
      --  Otherwise we check the freeze node, if it has a First_Subtype_Link
365
      --  then we use that link, otherwise (happens with some Itypes), we use
366
      --  the base type itself.
367
 
368
      else
369
         Ent := First_Subtype_Link (F);
370
 
371
         if Present (Ent) then
372
            return Ent;
373
         else
374
            return B;
375
         end if;
376
      end if;
377
   end First_Subtype;
378
 
379
   -------------------------
380
   -- First_Tag_Component --
381
   -------------------------
382
 
383
   function First_Tag_Component (Typ : Entity_Id) return Entity_Id is
384
      Comp : Entity_Id;
385
      Ctyp : Entity_Id;
386
 
387
   begin
388
      Ctyp := Typ;
389
      pragma Assert (Is_Tagged_Type (Ctyp));
390
 
391
      if Is_Class_Wide_Type (Ctyp) then
392
         Ctyp := Root_Type (Ctyp);
393
      end if;
394
 
395
      if Is_Private_Type (Ctyp) then
396
         Ctyp := Underlying_Type (Ctyp);
397
 
398
         --  If the underlying type is missing then the source program has
399
         --  errors and there is nothing else to do (the full-type declaration
400
         --  associated with the private type declaration is missing).
401
 
402
         if No (Ctyp) then
403
            return Empty;
404
         end if;
405
      end if;
406
 
407
      Comp := First_Entity (Ctyp);
408
      while Present (Comp) loop
409
         if Is_Tag (Comp) then
410
            return Comp;
411
         end if;
412
 
413
         Comp := Next_Entity (Comp);
414
      end loop;
415
 
416
      --  No tag component found
417
 
418
      return Empty;
419
   end First_Tag_Component;
420
 
421
   -------------------------------
422
   -- Initialization_Suppressed --
423
   -------------------------------
424
 
425
   function Initialization_Suppressed (Typ : Entity_Id) return Boolean is
426
   begin
427
      return Suppress_Initialization (Typ)
428
        or else Suppress_Initialization (Base_Type (Typ));
429
   end Initialization_Suppressed;
430
 
431
   ----------------
432
   -- Initialize --
433
   ----------------
434
 
435
   procedure Initialize is
436
   begin
437
      Obsolescent_Warnings.Init;
438
   end Initialize;
439
 
440
   ---------------------
441
   -- In_Generic_Body --
442
   ---------------------
443
 
444
   function In_Generic_Body (Id : Entity_Id) return Boolean is
445
      S : Entity_Id;
446
 
447
   begin
448
      --  Climb scopes looking for generic body
449
 
450
      S := Id;
451
      while Present (S) and then S /= Standard_Standard loop
452
 
453
         --  Generic package body
454
 
455
         if Ekind (S) = E_Generic_Package
456
           and then In_Package_Body (S)
457
         then
458
            return True;
459
 
460
         --  Generic subprogram body
461
 
462
         elsif Is_Subprogram (S)
463
           and then Nkind (Unit_Declaration_Node (S))
464
                      = N_Generic_Subprogram_Declaration
465
         then
466
            return True;
467
         end if;
468
 
469
         S := Scope (S);
470
      end loop;
471
 
472
      --  False if top of scope stack without finding a generic body
473
 
474
      return False;
475
   end In_Generic_Body;
476
 
477
   ---------------------
478
   -- Is_By_Copy_Type --
479
   ---------------------
480
 
481
   function Is_By_Copy_Type (Ent : Entity_Id) return Boolean is
482
   begin
483
      --  If Id is a private type whose full declaration has not been seen,
484
      --  we assume for now that it is not a By_Copy type. Clearly this
485
      --  attribute should not be used before the type is frozen, but it is
486
      --  needed to build the associated record of a protected type. Another
487
      --  place where some lookahead for a full view is needed ???
488
 
489
      return
490
        Is_Elementary_Type (Ent)
491
          or else (Is_Private_Type (Ent)
492
                     and then Present (Underlying_Type (Ent))
493
                     and then Is_Elementary_Type (Underlying_Type (Ent)));
494
   end Is_By_Copy_Type;
495
 
496
   --------------------------
497
   -- Is_By_Reference_Type --
498
   --------------------------
499
 
500
   function Is_By_Reference_Type (Ent : Entity_Id) return Boolean is
501
      Btype : constant Entity_Id := Base_Type (Ent);
502
 
503
   begin
504
      if Error_Posted (Ent) or else Error_Posted (Btype) then
505
         return False;
506
 
507
      elsif Is_Private_Type (Btype) then
508
         declare
509
            Utyp : constant Entity_Id := Underlying_Type (Btype);
510
         begin
511
            if No (Utyp) then
512
               return False;
513
            else
514
               return Is_By_Reference_Type (Utyp);
515
            end if;
516
         end;
517
 
518
      elsif Is_Incomplete_Type (Btype) then
519
         declare
520
            Ftyp : constant Entity_Id := Full_View (Btype);
521
         begin
522
            if No (Ftyp) then
523
               return False;
524
            else
525
               return Is_By_Reference_Type (Ftyp);
526
            end if;
527
         end;
528
 
529
      elsif Is_Concurrent_Type (Btype) then
530
         return True;
531
 
532
      elsif Is_Record_Type (Btype) then
533
         if Is_Limited_Record (Btype)
534
           or else Is_Tagged_Type (Btype)
535
           or else Is_Volatile (Btype)
536
         then
537
            return True;
538
 
539
         else
540
            declare
541
               C : Entity_Id;
542
 
543
            begin
544
               C := First_Component (Btype);
545
               while Present (C) loop
546
                  if Is_By_Reference_Type (Etype (C))
547
                    or else Is_Volatile (Etype (C))
548
                  then
549
                     return True;
550
                  end if;
551
 
552
                  C := Next_Component (C);
553
               end loop;
554
            end;
555
 
556
            return False;
557
         end if;
558
 
559
      elsif Is_Array_Type (Btype) then
560
         return
561
           Is_Volatile (Btype)
562
             or else Is_By_Reference_Type (Component_Type (Btype))
563
             or else Is_Volatile (Component_Type (Btype))
564
             or else Has_Volatile_Components (Btype);
565
 
566
      else
567
         return False;
568
      end if;
569
   end Is_By_Reference_Type;
570
 
571
   ---------------------
572
   -- Is_Derived_Type --
573
   ---------------------
574
 
575
   function Is_Derived_Type (Ent : E) return B is
576
      Par : Node_Id;
577
 
578
   begin
579
      if Is_Type (Ent)
580
        and then Base_Type (Ent) /= Root_Type (Ent)
581
        and then not Is_Class_Wide_Type (Ent)
582
      then
583
         if not Is_Numeric_Type (Root_Type (Ent)) then
584
            return True;
585
 
586
         else
587
            Par := Parent (First_Subtype (Ent));
588
 
589
            return Present (Par)
590
              and then Nkind (Par) = N_Full_Type_Declaration
591
              and then Nkind (Type_Definition (Par)) =
592
                         N_Derived_Type_Definition;
593
         end if;
594
 
595
      else
596
         return False;
597
      end if;
598
   end Is_Derived_Type;
599
 
600
   -----------------------
601
   -- Is_Generic_Formal --
602
   -----------------------
603
 
604
   function Is_Generic_Formal (E : Entity_Id) return Boolean is
605
      Kind : Node_Kind;
606
   begin
607
      if No (E) then
608
         return False;
609
      else
610
         Kind := Nkind (Parent (E));
611
         return
612
           Nkind_In (Kind, N_Formal_Object_Declaration,
613
                           N_Formal_Package_Declaration,
614
                           N_Formal_Type_Declaration)
615
             or else Is_Formal_Subprogram (E);
616
      end if;
617
   end Is_Generic_Formal;
618
 
619
   ---------------------------
620
   -- Is_Indefinite_Subtype --
621
   ---------------------------
622
 
623
   function Is_Indefinite_Subtype (Ent : Entity_Id) return Boolean is
624
      K : constant Entity_Kind := Ekind (Ent);
625
 
626
   begin
627
      if Is_Constrained (Ent) then
628
         return False;
629
 
630
      elsif K in Array_Kind
631
        or else K in Class_Wide_Kind
632
        or else Has_Unknown_Discriminants (Ent)
633
      then
634
         return True;
635
 
636
      --  Known discriminants: indefinite if there are no default values
637
 
638
      elsif K in Record_Kind
639
        or else Is_Incomplete_Or_Private_Type (Ent)
640
        or else Is_Concurrent_Type (Ent)
641
      then
642
         return (Has_Discriminants (Ent)
643
           and then
644
             No (Discriminant_Default_Value (First_Discriminant (Ent))));
645
 
646
      else
647
         return False;
648
      end if;
649
   end Is_Indefinite_Subtype;
650
 
651
   -------------------------------
652
   -- Is_Immutably_Limited_Type --
653
   -------------------------------
654
 
655
   function Is_Immutably_Limited_Type (Ent : Entity_Id) return Boolean is
656
      Btype : constant Entity_Id := Available_View (Base_Type (Ent));
657
 
658
   begin
659
      if Is_Limited_Record (Btype) then
660
         return True;
661
 
662
      elsif Ekind (Btype) = E_Limited_Private_Type
663
        and then Nkind (Parent (Btype)) = N_Formal_Type_Declaration
664
      then
665
         return not In_Package_Body (Scope ((Btype)));
666
 
667
      elsif Is_Private_Type (Btype) then
668
 
669
         --  AI05-0063: A type derived from a limited private formal type is
670
         --  not immutably limited in a generic body.
671
 
672
         if Is_Derived_Type (Btype)
673
           and then Is_Generic_Type (Etype (Btype))
674
         then
675
            if not Is_Limited_Type (Etype (Btype)) then
676
               return False;
677
 
678
            --  A descendant of a limited formal type is not immutably limited
679
            --  in the generic body, or in the body of a generic child.
680
 
681
            elsif Ekind (Scope (Etype (Btype))) = E_Generic_Package then
682
               return not In_Package_Body (Scope (Btype));
683
 
684
            else
685
               return False;
686
            end if;
687
 
688
         else
689
            declare
690
               Utyp : constant Entity_Id := Underlying_Type (Btype);
691
            begin
692
               if No (Utyp) then
693
                  return False;
694
               else
695
                  return Is_Immutably_Limited_Type (Utyp);
696
               end if;
697
            end;
698
         end if;
699
 
700
      elsif Is_Concurrent_Type (Btype) then
701
         return True;
702
 
703
      elsif Is_Record_Type (Btype) then
704
 
705
         --  Note that we return True for all limited interfaces, even though
706
         --  (unsynchronized) limited interfaces can have descendants that are
707
         --  nonlimited, because this is a predicate on the type itself, and
708
         --  things like functions with limited interface results need to be
709
         --  handled as build in place even though they might return objects
710
         --  of a type that is not inherently limited.
711
 
712
         if Is_Class_Wide_Type (Btype) then
713
            return Is_Immutably_Limited_Type (Root_Type (Btype));
714
 
715
         else
716
            declare
717
               C : Entity_Id;
718
 
719
            begin
720
               C := First_Component (Btype);
721
               while Present (C) loop
722
 
723
                  --  Don't consider components with interface types (which can
724
                  --  only occur in the case of a _parent component anyway).
725
                  --  They don't have any components, plus it would cause this
726
                  --  function to return true for nonlimited types derived from
727
                  --  limited interfaces.
728
 
729
                  if not Is_Interface (Etype (C))
730
                    and then Is_Immutably_Limited_Type (Etype (C))
731
                  then
732
                     return True;
733
                  end if;
734
 
735
                  C := Next_Component (C);
736
               end loop;
737
            end;
738
 
739
            return False;
740
         end if;
741
 
742
      elsif Is_Array_Type (Btype) then
743
         return Is_Immutably_Limited_Type (Component_Type (Btype));
744
 
745
      else
746
         return False;
747
      end if;
748
   end Is_Immutably_Limited_Type;
749
 
750
   ---------------------
751
   -- Is_Limited_Type --
752
   ---------------------
753
 
754
   function Is_Limited_Type (Ent : Entity_Id) return Boolean is
755
      Btype : constant E := Base_Type (Ent);
756
      Rtype : constant E := Root_Type (Btype);
757
 
758
   begin
759
      if not Is_Type (Ent) then
760
         return False;
761
 
762
      elsif Ekind (Btype) = E_Limited_Private_Type
763
        or else Is_Limited_Composite (Btype)
764
      then
765
         return True;
766
 
767
      elsif Is_Concurrent_Type (Btype) then
768
         return True;
769
 
770
         --  The Is_Limited_Record flag normally indicates that the type is
771
         --  limited. The exception is that a type does not inherit limitedness
772
         --  from its interface ancestor. So the type may be derived from a
773
         --  limited interface, but is not limited.
774
 
775
      elsif Is_Limited_Record (Ent)
776
        and then not Is_Interface (Ent)
777
      then
778
         return True;
779
 
780
      --  Otherwise we will look around to see if there is some other reason
781
      --  for it to be limited, except that if an error was posted on the
782
      --  entity, then just assume it is non-limited, because it can cause
783
      --  trouble to recurse into a murky erroneous entity!
784
 
785
      elsif Error_Posted (Ent) then
786
         return False;
787
 
788
      elsif Is_Record_Type (Btype) then
789
 
790
         if Is_Limited_Interface (Ent) then
791
            return True;
792
 
793
         --  AI-419: limitedness is not inherited from a limited interface
794
 
795
         elsif Is_Limited_Record (Rtype) then
796
            return not Is_Interface (Rtype)
797
              or else Is_Protected_Interface (Rtype)
798
              or else Is_Synchronized_Interface (Rtype)
799
              or else Is_Task_Interface (Rtype);
800
 
801
         elsif Is_Class_Wide_Type (Btype) then
802
            return Is_Limited_Type (Rtype);
803
 
804
         else
805
            declare
806
               C : E;
807
 
808
            begin
809
               C := First_Component (Btype);
810
               while Present (C) loop
811
                  if Is_Limited_Type (Etype (C)) then
812
                     return True;
813
                  end if;
814
 
815
                  C := Next_Component (C);
816
               end loop;
817
            end;
818
 
819
            return False;
820
         end if;
821
 
822
      elsif Is_Array_Type (Btype) then
823
         return Is_Limited_Type (Component_Type (Btype));
824
 
825
      else
826
         return False;
827
      end if;
828
   end Is_Limited_Type;
829
 
830
   ----------------------
831
   -- Nearest_Ancestor --
832
   ----------------------
833
 
834
   function Nearest_Ancestor (Typ : Entity_Id) return Entity_Id is
835
         D : constant Node_Id := Declaration_Node (Typ);
836
 
837
   begin
838
      --  If we have a subtype declaration, get the ancestor subtype
839
 
840
      if Nkind (D) = N_Subtype_Declaration then
841
         if Nkind (Subtype_Indication (D)) = N_Subtype_Indication then
842
            return Entity (Subtype_Mark (Subtype_Indication (D)));
843
         else
844
            return Entity (Subtype_Indication (D));
845
         end if;
846
 
847
      --  If derived type declaration, find who we are derived from
848
 
849
      elsif Nkind (D) = N_Full_Type_Declaration
850
        and then Nkind (Type_Definition (D)) = N_Derived_Type_Definition
851
      then
852
         declare
853
            DTD : constant Entity_Id := Type_Definition (D);
854
            SI  : constant Entity_Id := Subtype_Indication (DTD);
855
         begin
856
            if Is_Entity_Name (SI) then
857
               return Entity (SI);
858
            else
859
               return Entity (Subtype_Mark (SI));
860
            end if;
861
         end;
862
 
863
      --  Otherwise, nothing useful to return, return Empty
864
 
865
      else
866
         return Empty;
867
      end if;
868
   end Nearest_Ancestor;
869
 
870
   ---------------------------
871
   -- Nearest_Dynamic_Scope --
872
   ---------------------------
873
 
874
   function Nearest_Dynamic_Scope (Ent : Entity_Id) return Entity_Id is
875
   begin
876
      if Is_Dynamic_Scope (Ent) then
877
         return Ent;
878
      else
879
         return Enclosing_Dynamic_Scope (Ent);
880
      end if;
881
   end Nearest_Dynamic_Scope;
882
 
883
   ------------------------
884
   -- Next_Tag_Component --
885
   ------------------------
886
 
887
   function Next_Tag_Component (Tag : Entity_Id) return Entity_Id is
888
      Comp : Entity_Id;
889
 
890
   begin
891
      pragma Assert (Is_Tag (Tag));
892
 
893
      --  Loop to look for next tag component
894
 
895
      Comp := Next_Entity (Tag);
896
      while Present (Comp) loop
897
         if Is_Tag (Comp) then
898
            pragma Assert (Chars (Comp) /= Name_uTag);
899
            return Comp;
900
         end if;
901
 
902
         Comp := Next_Entity (Comp);
903
      end loop;
904
 
905
      --  No tag component found
906
 
907
      return Empty;
908
   end Next_Tag_Component;
909
 
910
   --------------------------
911
   -- Number_Discriminants --
912
   --------------------------
913
 
914
   function Number_Discriminants (Typ : Entity_Id) return Pos is
915
      N     : Int;
916
      Discr : Entity_Id;
917
 
918
   begin
919
      N := 0;
920
      Discr := First_Discriminant (Typ);
921
      while Present (Discr) loop
922
         N := N + 1;
923
         Discr := Next_Discriminant (Discr);
924
      end loop;
925
 
926
      return N;
927
   end Number_Discriminants;
928
 
929
   ---------------
930
   -- Tree_Read --
931
   ---------------
932
 
933
   procedure Tree_Read is
934
   begin
935
      Obsolescent_Warnings.Tree_Read;
936
   end Tree_Read;
937
 
938
   ----------------
939
   -- Tree_Write --
940
   ----------------
941
 
942
   procedure Tree_Write is
943
   begin
944
      Obsolescent_Warnings.Tree_Write;
945
   end Tree_Write;
946
 
947
   --------------------
948
   -- Ultimate_Alias --
949
   --------------------
950
 
951
   function Ultimate_Alias (Prim : Entity_Id) return Entity_Id is
952
      E : Entity_Id := Prim;
953
 
954
   begin
955
      while Present (Alias (E)) loop
956
         pragma Assert (Alias (E) /= E);
957
         E := Alias (E);
958
      end loop;
959
 
960
      return E;
961
   end Ultimate_Alias;
962
 
963
   --------------------------
964
   -- Unit_Declaration_Node --
965
   --------------------------
966
 
967
   function Unit_Declaration_Node (Unit_Id : Entity_Id) return Node_Id is
968
      N : Node_Id := Parent (Unit_Id);
969
 
970
   begin
971
      --  Predefined operators do not have a full function declaration
972
 
973
      if Ekind (Unit_Id) = E_Operator then
974
         return N;
975
      end if;
976
 
977
      --  Isn't there some better way to express the following ???
978
 
979
      while Nkind (N) /= N_Abstract_Subprogram_Declaration
980
        and then Nkind (N) /= N_Formal_Package_Declaration
981
        and then Nkind (N) /= N_Function_Instantiation
982
        and then Nkind (N) /= N_Generic_Package_Declaration
983
        and then Nkind (N) /= N_Generic_Subprogram_Declaration
984
        and then Nkind (N) /= N_Package_Declaration
985
        and then Nkind (N) /= N_Package_Body
986
        and then Nkind (N) /= N_Package_Instantiation
987
        and then Nkind (N) /= N_Package_Renaming_Declaration
988
        and then Nkind (N) /= N_Procedure_Instantiation
989
        and then Nkind (N) /= N_Protected_Body
990
        and then Nkind (N) /= N_Subprogram_Declaration
991
        and then Nkind (N) /= N_Subprogram_Body
992
        and then Nkind (N) /= N_Subprogram_Body_Stub
993
        and then Nkind (N) /= N_Subprogram_Renaming_Declaration
994
        and then Nkind (N) /= N_Task_Body
995
        and then Nkind (N) /= N_Task_Type_Declaration
996
        and then Nkind (N) not in N_Formal_Subprogram_Declaration
997
        and then Nkind (N) not in N_Generic_Renaming_Declaration
998
      loop
999
         N := Parent (N);
1000
 
1001
         --  We don't use Assert here, because that causes an infinite loop
1002
         --  when assertions are turned off. Better to crash.
1003
 
1004
         if No (N) then
1005
            raise Program_Error;
1006
         end if;
1007
      end loop;
1008
 
1009
      return N;
1010
   end Unit_Declaration_Node;
1011
 
1012
end Sem_Aux;

powered by: WebSVN 2.1.0

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