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

Subversion Repositories openrisc

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

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 _ T Y P E                              --
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
-- 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 Atree;    use Atree;
27
with Alloc;
28
with Debug;    use Debug;
29
with Einfo;    use Einfo;
30
with Elists;   use Elists;
31
with Nlists;   use Nlists;
32
with Errout;   use Errout;
33
with Lib;      use Lib;
34
with Namet;    use Namet;
35
with Opt;      use Opt;
36
with Output;   use Output;
37
with Sem;      use Sem;
38
with Sem_Aux;  use Sem_Aux;
39
with Sem_Ch6;  use Sem_Ch6;
40
with Sem_Ch8;  use Sem_Ch8;
41
with Sem_Ch12; use Sem_Ch12;
42
with Sem_Disp; use Sem_Disp;
43
with Sem_Dist; use Sem_Dist;
44
with Sem_Util; use Sem_Util;
45
with Stand;    use Stand;
46
with Sinfo;    use Sinfo;
47
with Snames;   use Snames;
48
with Table;
49
with Treepr;   use Treepr;
50
with Uintp;    use Uintp;
51
 
52
package body Sem_Type is
53
 
54
   ---------------------
55
   -- Data Structures --
56
   ---------------------
57
 
58
   --  The following data structures establish a mapping between nodes and
59
   --  their interpretations. An overloaded node has an entry in Interp_Map,
60
   --  which in turn contains a pointer into the All_Interp array. The
61
   --  interpretations of a given node are contiguous in All_Interp. Each set
62
   --  of interpretations is terminated with the marker No_Interp. In order to
63
   --  speed up the retrieval of the interpretations of an overloaded node, the
64
   --  Interp_Map table is accessed by means of a simple hashing scheme, and
65
   --  the entries in Interp_Map are chained. The heads of clash lists are
66
   --  stored in array Headers.
67
 
68
   --              Headers        Interp_Map          All_Interp
69
 
70
   --                 _            +-----+             +--------+
71
   --                |_|           |_____|         --->|interp1 |
72
   --                |_|---------->|node |         |   |interp2 |
73
   --                |_|           |index|---------|   |nointerp|
74
   --                |_|           |next |             |        |
75
   --                              |-----|             |        |
76
   --                              +-----+             +--------+
77
 
78
   --  This scheme does not currently reclaim interpretations. In principle,
79
   --  after a unit is compiled, all overloadings have been resolved, and the
80
   --  candidate interpretations should be deleted. This should be easier
81
   --  now than with the previous scheme???
82
 
83
   package All_Interp is new Table.Table (
84
     Table_Component_Type => Interp,
85
     Table_Index_Type     => Interp_Index,
86
     Table_Low_Bound      => 0,
87
     Table_Initial        => Alloc.All_Interp_Initial,
88
     Table_Increment      => Alloc.All_Interp_Increment,
89
     Table_Name           => "All_Interp");
90
 
91
   type Interp_Ref is record
92
      Node  : Node_Id;
93
      Index : Interp_Index;
94
      Next  : Int;
95
   end record;
96
 
97
   Header_Size : constant Int := 2 ** 12;
98
   No_Entry    : constant Int := -1;
99
   Headers     : array (0 .. Header_Size) of Int := (others => No_Entry);
100
 
101
   package Interp_Map is new Table.Table (
102
     Table_Component_Type => Interp_Ref,
103
     Table_Index_Type     => Int,
104
     Table_Low_Bound      => 0,
105
     Table_Initial        => Alloc.Interp_Map_Initial,
106
     Table_Increment      => Alloc.Interp_Map_Increment,
107
     Table_Name           => "Interp_Map");
108
 
109
   function Hash (N : Node_Id) return Int;
110
   --  A trivial hashing function for nodes, used to insert an overloaded
111
   --  node into the Interp_Map table.
112
 
113
   -------------------------------------
114
   -- Handling of Overload Resolution --
115
   -------------------------------------
116
 
117
   --  Overload resolution uses two passes over the syntax tree of a complete
118
   --  context. In the first, bottom-up pass, the types of actuals in calls
119
   --  are used to resolve possibly overloaded subprogram and operator names.
120
   --  In the second top-down pass, the type of the context (for example the
121
   --  condition in a while statement) is used to resolve a possibly ambiguous
122
   --  call, and the unique subprogram name in turn imposes a specific context
123
   --  on each of its actuals.
124
 
125
   --  Most expressions are in fact unambiguous, and the bottom-up pass is
126
   --  sufficient  to resolve most everything. To simplify the common case,
127
   --  names and expressions carry a flag Is_Overloaded to indicate whether
128
   --  they have more than one interpretation. If the flag is off, then each
129
   --  name has already a unique meaning and type, and the bottom-up pass is
130
   --  sufficient (and much simpler).
131
 
132
   --------------------------
133
   -- Operator Overloading --
134
   --------------------------
135
 
136
   --  The visibility of operators is handled differently from that of other
137
   --  entities. We do not introduce explicit versions of primitive operators
138
   --  for each type definition. As a result, there is only one entity
139
   --  corresponding to predefined addition on all numeric types, etc. The
140
   --  back-end resolves predefined operators according to their type. The
141
   --  visibility of primitive operations then reduces to the visibility of the
142
   --  resulting type: (a + b) is a legal interpretation of some primitive
143
   --  operator + if the type of the result (which must also be the type of a
144
   --  and b) is directly visible (either immediately visible or use-visible).
145
 
146
   --  User-defined operators are treated like other functions, but the
147
   --  visibility of these user-defined operations must be special-cased
148
   --  to determine whether they hide or are hidden by predefined operators.
149
   --  The form P."+" (x, y) requires additional handling.
150
 
151
   --  Concatenation is treated more conventionally: for every one-dimensional
152
   --  array type we introduce a explicit concatenation operator. This is
153
   --  necessary to handle the case of (element & element => array) which
154
   --  cannot be handled conveniently if there is no explicit instance of
155
   --  resulting type of the operation.
156
 
157
   -----------------------
158
   -- Local Subprograms --
159
   -----------------------
160
 
161
   procedure All_Overloads;
162
   pragma Warnings (Off, All_Overloads);
163
   --  Debugging procedure: list full contents of Overloads table
164
 
165
   function Binary_Op_Interp_Has_Abstract_Op
166
     (N : Node_Id;
167
      E : Entity_Id) return Entity_Id;
168
   --  Given the node and entity of a binary operator, determine whether the
169
   --  actuals of E contain an abstract interpretation with regards to the
170
   --  types of their corresponding formals. Return the abstract operation or
171
   --  Empty.
172
 
173
   function Function_Interp_Has_Abstract_Op
174
     (N : Node_Id;
175
      E : Entity_Id) return Entity_Id;
176
   --  Given the node and entity of a function call, determine whether the
177
   --  actuals of E contain an abstract interpretation with regards to the
178
   --  types of their corresponding formals. Return the abstract operation or
179
   --  Empty.
180
 
181
   function Has_Abstract_Op
182
     (N   : Node_Id;
183
      Typ : Entity_Id) return Entity_Id;
184
   --  Subsidiary routine to Binary_Op_Interp_Has_Abstract_Op and Function_
185
   --  Interp_Has_Abstract_Op. Determine whether an overloaded node has an
186
   --  abstract interpretation which yields type Typ.
187
 
188
   procedure New_Interps (N : Node_Id);
189
   --  Initialize collection of interpretations for the given node, which is
190
   --  either an overloaded entity, or an operation whose arguments have
191
   --  multiple interpretations. Interpretations can be added to only one
192
   --  node at a time.
193
 
194
   function Specific_Type (Typ_1, Typ_2 : Entity_Id) return Entity_Id;
195
   --  If Typ_1 and Typ_2 are compatible, return the one that is not universal
196
   --  or is not a "class" type (any_character, etc).
197
 
198
   --------------------
199
   -- Add_One_Interp --
200
   --------------------
201
 
202
   procedure Add_One_Interp
203
     (N         : Node_Id;
204
      E         : Entity_Id;
205
      T         : Entity_Id;
206
      Opnd_Type : Entity_Id := Empty)
207
   is
208
      Vis_Type : Entity_Id;
209
 
210
      procedure Add_Entry (Name : Entity_Id; Typ : Entity_Id);
211
      --  Add one interpretation to an overloaded node. Add a new entry if
212
      --  not hidden by previous one, and remove previous one if hidden by
213
      --  new one.
214
 
215
      function Is_Universal_Operation (Op : Entity_Id) return Boolean;
216
      --  True if the entity is a predefined operator and the operands have
217
      --  a universal Interpretation.
218
 
219
      ---------------
220
      -- Add_Entry --
221
      ---------------
222
 
223
      procedure Add_Entry (Name : Entity_Id; Typ : Entity_Id) is
224
         Abstr_Op : Entity_Id := Empty;
225
         I        : Interp_Index;
226
         It       : Interp;
227
 
228
      --  Start of processing for Add_Entry
229
 
230
      begin
231
         --  Find out whether the new entry references interpretations that
232
         --  are abstract or disabled by abstract operators.
233
 
234
         if Ada_Version >= Ada_2005 then
235
            if Nkind (N) in N_Binary_Op then
236
               Abstr_Op := Binary_Op_Interp_Has_Abstract_Op (N, Name);
237
            elsif Nkind (N) = N_Function_Call then
238
               Abstr_Op := Function_Interp_Has_Abstract_Op (N, Name);
239
            end if;
240
         end if;
241
 
242
         Get_First_Interp (N, I, It);
243
         while Present (It.Nam) loop
244
 
245
            --  A user-defined subprogram hides another declared at an outer
246
            --  level, or one that is use-visible. So return if previous
247
            --  definition hides new one (which is either in an outer
248
            --  scope, or use-visible). Note that for functions use-visible
249
            --  is the same as potentially use-visible. If new one hides
250
            --  previous one, replace entry in table of interpretations.
251
            --  If this is a universal operation, retain the operator in case
252
            --  preference rule applies.
253
 
254
            if (((Ekind (Name) = E_Function or else Ekind (Name) = E_Procedure)
255
                 and then Ekind (Name) = Ekind (It.Nam))
256
                or else (Ekind (Name) = E_Operator
257
              and then Ekind (It.Nam) = E_Function))
258
 
259
              and then Is_Immediately_Visible (It.Nam)
260
              and then Type_Conformant (Name, It.Nam)
261
              and then Base_Type (It.Typ) = Base_Type (T)
262
            then
263
               if Is_Universal_Operation (Name) then
264
                  exit;
265
 
266
               --  If node is an operator symbol, we have no actuals with
267
               --  which to check hiding, and this is done in full in the
268
               --  caller (Analyze_Subprogram_Renaming) so we include the
269
               --  predefined operator in any case.
270
 
271
               elsif Nkind (N) = N_Operator_Symbol
272
                 or else (Nkind (N) = N_Expanded_Name
273
                            and then
274
                          Nkind (Selector_Name (N)) = N_Operator_Symbol)
275
               then
276
                  exit;
277
 
278
               elsif not In_Open_Scopes (Scope (Name))
279
                 or else Scope_Depth (Scope (Name)) <=
280
                         Scope_Depth (Scope (It.Nam))
281
               then
282
                  --  If ambiguity within instance, and entity is not an
283
                  --  implicit operation, save for later disambiguation.
284
 
285
                  if Scope (Name) = Scope (It.Nam)
286
                    and then not Is_Inherited_Operation (Name)
287
                    and then In_Instance
288
                  then
289
                     exit;
290
                  else
291
                     return;
292
                  end if;
293
 
294
               else
295
                  All_Interp.Table (I).Nam := Name;
296
                  return;
297
               end if;
298
 
299
            --  Avoid making duplicate entries in overloads
300
 
301
            elsif Name = It.Nam
302
              and then Base_Type (It.Typ) = Base_Type (T)
303
            then
304
               return;
305
 
306
            --  Otherwise keep going
307
 
308
            else
309
               Get_Next_Interp (I, It);
310
            end if;
311
 
312
         end loop;
313
 
314
         All_Interp.Table (All_Interp.Last) := (Name, Typ, Abstr_Op);
315
         All_Interp.Append (No_Interp);
316
      end Add_Entry;
317
 
318
      ----------------------------
319
      -- Is_Universal_Operation --
320
      ----------------------------
321
 
322
      function Is_Universal_Operation (Op : Entity_Id) return Boolean is
323
         Arg : Node_Id;
324
 
325
      begin
326
         if Ekind (Op) /= E_Operator then
327
            return False;
328
 
329
         elsif Nkind (N) in N_Binary_Op then
330
            return Present (Universal_Interpretation (Left_Opnd (N)))
331
              and then Present (Universal_Interpretation (Right_Opnd (N)));
332
 
333
         elsif Nkind (N) in N_Unary_Op then
334
            return Present (Universal_Interpretation (Right_Opnd (N)));
335
 
336
         elsif Nkind (N) = N_Function_Call then
337
            Arg := First_Actual (N);
338
            while Present (Arg) loop
339
               if No (Universal_Interpretation (Arg)) then
340
                  return False;
341
               end if;
342
 
343
               Next_Actual (Arg);
344
            end loop;
345
 
346
            return True;
347
 
348
         else
349
            return False;
350
         end if;
351
      end Is_Universal_Operation;
352
 
353
   --  Start of processing for Add_One_Interp
354
 
355
   begin
356
      --  If the interpretation is a predefined operator, verify that the
357
      --  result type is visible, or that the entity has already been
358
      --  resolved (case of an instantiation node that refers to a predefined
359
      --  operation, or an internally generated operator node, or an operator
360
      --  given as an expanded name). If the operator is a comparison or
361
      --  equality, it is the type of the operand that matters to determine
362
      --  whether the operator is visible. In an instance, the check is not
363
      --  performed, given that the operator was visible in the generic.
364
 
365
      if Ekind (E) = E_Operator then
366
         if Present (Opnd_Type) then
367
            Vis_Type := Opnd_Type;
368
         else
369
            Vis_Type := Base_Type (T);
370
         end if;
371
 
372
         if In_Open_Scopes (Scope (Vis_Type))
373
           or else Is_Potentially_Use_Visible (Vis_Type)
374
           or else In_Use (Vis_Type)
375
           or else (In_Use (Scope (Vis_Type))
376
                      and then not Is_Hidden (Vis_Type))
377
           or else Nkind (N) = N_Expanded_Name
378
           or else (Nkind (N) in N_Op and then E = Entity (N))
379
           or else In_Instance
380
           or else Ekind (Vis_Type) = E_Anonymous_Access_Type
381
         then
382
            null;
383
 
384
         --  If the node is given in functional notation and the prefix
385
         --  is an expanded name, then the operator is visible if the
386
         --  prefix is the scope of the result type as well. If the
387
         --  operator is (implicitly) defined in an extension of system,
388
         --  it is know to be valid (see Defined_In_Scope, sem_ch4.adb).
389
 
390
         elsif Nkind (N) = N_Function_Call
391
           and then Nkind (Name (N)) = N_Expanded_Name
392
           and then (Entity (Prefix (Name (N))) = Scope (Base_Type (T))
393
                       or else Entity (Prefix (Name (N))) = Scope (Vis_Type)
394
                       or else Scope (Vis_Type) = System_Aux_Id)
395
         then
396
            null;
397
 
398
         --  Save type for subsequent error message, in case no other
399
         --  interpretation is found.
400
 
401
         else
402
            Candidate_Type := Vis_Type;
403
            return;
404
         end if;
405
 
406
      --  In an instance, an abstract non-dispatching operation cannot be a
407
      --  candidate interpretation, because it could not have been one in the
408
      --  generic (it may be a spurious overloading in the instance).
409
 
410
      elsif In_Instance
411
        and then Is_Overloadable (E)
412
        and then Is_Abstract_Subprogram (E)
413
        and then not Is_Dispatching_Operation (E)
414
      then
415
         return;
416
 
417
      --  An inherited interface operation that is implemented by some derived
418
      --  type does not participate in overload resolution, only the
419
      --  implementation operation does.
420
 
421
      elsif Is_Hidden (E)
422
        and then Is_Subprogram (E)
423
        and then Present (Interface_Alias (E))
424
      then
425
         --  Ada 2005 (AI-251): If this primitive operation corresponds with
426
         --  an immediate ancestor interface there is no need to add it to the
427
         --  list of interpretations. The corresponding aliased primitive is
428
         --  also in this list of primitive operations and will be used instead
429
         --  because otherwise we have a dummy ambiguity between the two
430
         --  subprograms which are in fact the same.
431
 
432
         if not Is_Ancestor
433
                  (Find_Dispatching_Type (Interface_Alias (E)),
434
                   Find_Dispatching_Type (E))
435
         then
436
            Add_One_Interp (N, Interface_Alias (E), T);
437
         end if;
438
 
439
         return;
440
 
441
      --  Calling stubs for an RACW operation never participate in resolution,
442
      --  they are executed only through dispatching calls.
443
 
444
      elsif Is_RACW_Stub_Type_Operation (E) then
445
         return;
446
      end if;
447
 
448
      --  If this is the first interpretation of N, N has type Any_Type.
449
      --  In that case place the new type on the node. If one interpretation
450
      --  already exists, indicate that the node is overloaded, and store
451
      --  both the previous and the new interpretation in All_Interp. If
452
      --  this is a later interpretation, just add it to the set.
453
 
454
      if Etype (N) = Any_Type then
455
         if Is_Type (E) then
456
            Set_Etype (N, T);
457
 
458
         else
459
            --  Record both the operator or subprogram name, and its type
460
 
461
            if Nkind (N) in N_Op or else Is_Entity_Name (N) then
462
               Set_Entity (N, E);
463
            end if;
464
 
465
            Set_Etype (N, T);
466
         end if;
467
 
468
      --  Either there is no current interpretation in the table for any
469
      --  node or the interpretation that is present is for a different
470
      --  node. In both cases add a new interpretation to the table.
471
 
472
      elsif Interp_Map.Last < 0
473
        or else
474
          (Interp_Map.Table (Interp_Map.Last).Node /= N
475
             and then not Is_Overloaded (N))
476
      then
477
         New_Interps (N);
478
 
479
         if (Nkind (N) in N_Op or else Is_Entity_Name (N))
480
           and then Present (Entity (N))
481
         then
482
            Add_Entry (Entity (N), Etype (N));
483
 
484
         elsif Nkind_In (N, N_Function_Call, N_Procedure_Call_Statement)
485
           and then Is_Entity_Name (Name (N))
486
         then
487
            Add_Entry (Entity (Name (N)), Etype (N));
488
 
489
         --  If this is an indirect call there will be no name associated
490
         --  with the previous entry. To make diagnostics clearer, save
491
         --  Subprogram_Type of first interpretation, so that the error will
492
         --  point to the anonymous access to subprogram, not to the result
493
         --  type of the call itself.
494
 
495
         elsif (Nkind (N)) = N_Function_Call
496
           and then Nkind (Name (N)) = N_Explicit_Dereference
497
           and then Is_Overloaded (Name (N))
498
         then
499
            declare
500
               It : Interp;
501
 
502
               Itn : Interp_Index;
503
               pragma Warnings (Off, Itn);
504
 
505
            begin
506
               Get_First_Interp (Name (N), Itn, It);
507
               Add_Entry (It.Nam, Etype (N));
508
            end;
509
 
510
         else
511
            --  Overloaded prefix in indexed or selected component, or call
512
            --  whose name is an expression or another call.
513
 
514
            Add_Entry (Etype (N), Etype (N));
515
         end if;
516
 
517
         Add_Entry (E, T);
518
 
519
      else
520
         Add_Entry (E, T);
521
      end if;
522
   end Add_One_Interp;
523
 
524
   -------------------
525
   -- All_Overloads --
526
   -------------------
527
 
528
   procedure All_Overloads is
529
   begin
530
      for J in All_Interp.First .. All_Interp.Last loop
531
 
532
         if Present (All_Interp.Table (J).Nam) then
533
            Write_Entity_Info (All_Interp.Table (J). Nam, " ");
534
         else
535
            Write_Str ("No Interp");
536
            Write_Eol;
537
         end if;
538
 
539
         Write_Str ("=================");
540
         Write_Eol;
541
      end loop;
542
   end All_Overloads;
543
 
544
   --------------------------------------
545
   -- Binary_Op_Interp_Has_Abstract_Op --
546
   --------------------------------------
547
 
548
   function Binary_Op_Interp_Has_Abstract_Op
549
     (N : Node_Id;
550
      E : Entity_Id) return Entity_Id
551
   is
552
      Abstr_Op : Entity_Id;
553
      E_Left   : constant Node_Id := First_Formal (E);
554
      E_Right  : constant Node_Id := Next_Formal (E_Left);
555
 
556
   begin
557
      Abstr_Op := Has_Abstract_Op (Left_Opnd (N), Etype (E_Left));
558
      if Present (Abstr_Op) then
559
         return Abstr_Op;
560
      end if;
561
 
562
      return Has_Abstract_Op (Right_Opnd (N), Etype (E_Right));
563
   end Binary_Op_Interp_Has_Abstract_Op;
564
 
565
   ---------------------
566
   -- Collect_Interps --
567
   ---------------------
568
 
569
   procedure Collect_Interps (N : Node_Id) is
570
      Ent          : constant Entity_Id := Entity (N);
571
      H            : Entity_Id;
572
      First_Interp : Interp_Index;
573
 
574
      function Within_Instance (E : Entity_Id) return Boolean;
575
      --  Within an instance there can be spurious ambiguities between a local
576
      --  entity and one declared outside of the instance. This can only happen
577
      --  for subprograms, because otherwise the local entity hides the outer
578
      --  one. For an overloadable entity, this predicate determines whether it
579
      --  is a candidate within the instance, or must be ignored.
580
 
581
      ---------------------
582
      -- Within_Instance --
583
      ---------------------
584
 
585
      function Within_Instance (E : Entity_Id) return Boolean is
586
         Inst : Entity_Id;
587
         Scop : Entity_Id;
588
 
589
      begin
590
         if not In_Instance then
591
            return False;
592
         end if;
593
 
594
         Inst := Current_Scope;
595
         while Present (Inst) and then not Is_Generic_Instance (Inst) loop
596
            Inst := Scope (Inst);
597
         end loop;
598
 
599
         Scop := Scope (E);
600
         while Present (Scop) and then Scop /= Standard_Standard loop
601
            if Scop = Inst then
602
               return True;
603
            end if;
604
            Scop := Scope (Scop);
605
         end loop;
606
 
607
         return False;
608
      end Within_Instance;
609
 
610
   --  Start of processing for Collect_Interps
611
 
612
   begin
613
      New_Interps (N);
614
 
615
      --  Unconditionally add the entity that was initially matched
616
 
617
      First_Interp := All_Interp.Last;
618
      Add_One_Interp (N, Ent, Etype (N));
619
 
620
      --  For expanded name, pick up all additional entities from the
621
      --  same scope, since these are obviously also visible. Note that
622
      --  these are not necessarily contiguous on the homonym chain.
623
 
624
      if Nkind (N) = N_Expanded_Name then
625
         H := Homonym (Ent);
626
         while Present (H) loop
627
            if Scope (H) = Scope (Entity (N)) then
628
               Add_One_Interp (N, H, Etype (H));
629
            end if;
630
 
631
            H := Homonym (H);
632
         end loop;
633
 
634
      --  Case of direct name
635
 
636
      else
637
         --  First, search the homonym chain for directly visible entities
638
 
639
         H := Current_Entity (Ent);
640
         while Present (H) loop
641
            exit when (not Is_Overloadable (H))
642
              and then Is_Immediately_Visible (H);
643
 
644
            if Is_Immediately_Visible (H)
645
              and then H /= Ent
646
            then
647
               --  Only add interpretation if not hidden by an inner
648
               --  immediately visible one.
649
 
650
               for J in First_Interp .. All_Interp.Last - 1 loop
651
 
652
                  --  Current homograph is not hidden. Add to overloads
653
 
654
                  if not Is_Immediately_Visible (All_Interp.Table (J).Nam) then
655
                     exit;
656
 
657
                  --  Homograph is hidden, unless it is a predefined operator
658
 
659
                  elsif Type_Conformant (H, All_Interp.Table (J).Nam) then
660
 
661
                     --  A homograph in the same scope can occur within an
662
                     --  instantiation, the resulting ambiguity has to be
663
                     --  resolved later. The homographs may both be local
664
                     --  functions or actuals, or may be declared at different
665
                     --  levels within the instance. The renaming of an actual
666
                     --  within the instance must not be included.
667
 
668
                     if Within_Instance (H)
669
                       and then H /= Renamed_Entity (Ent)
670
                       and then not Is_Inherited_Operation (H)
671
                     then
672
                        All_Interp.Table (All_Interp.Last) :=
673
                          (H, Etype (H), Empty);
674
                        All_Interp.Append (No_Interp);
675
                        goto Next_Homograph;
676
 
677
                     elsif Scope (H) /= Standard_Standard then
678
                        goto Next_Homograph;
679
                     end if;
680
                  end if;
681
               end loop;
682
 
683
               --  On exit, we know that current homograph is not hidden
684
 
685
               Add_One_Interp (N, H, Etype (H));
686
 
687
               if Debug_Flag_E then
688
                  Write_Str ("Add overloaded interpretation ");
689
                  Write_Int (Int (H));
690
                  Write_Eol;
691
               end if;
692
            end if;
693
 
694
            <<Next_Homograph>>
695
               H := Homonym (H);
696
         end loop;
697
 
698
         --  Scan list of homographs for use-visible entities only
699
 
700
         H := Current_Entity (Ent);
701
 
702
         while Present (H) loop
703
            if Is_Potentially_Use_Visible (H)
704
              and then H /= Ent
705
              and then Is_Overloadable (H)
706
            then
707
               for J in First_Interp .. All_Interp.Last - 1 loop
708
 
709
                  if not Is_Immediately_Visible (All_Interp.Table (J).Nam) then
710
                     exit;
711
 
712
                  elsif Type_Conformant (H, All_Interp.Table (J).Nam) then
713
                     goto Next_Use_Homograph;
714
                  end if;
715
               end loop;
716
 
717
               Add_One_Interp (N, H, Etype (H));
718
            end if;
719
 
720
            <<Next_Use_Homograph>>
721
               H := Homonym (H);
722
         end loop;
723
      end if;
724
 
725
      if All_Interp.Last = First_Interp + 1 then
726
 
727
         --  The final interpretation is in fact not overloaded. Note that the
728
         --  unique legal interpretation may or may not be the original one,
729
         --  so we need to update N's entity and etype now, because once N
730
         --  is marked as not overloaded it is also expected to carry the
731
         --  proper interpretation.
732
 
733
         Set_Is_Overloaded (N, False);
734
         Set_Entity (N, All_Interp.Table (First_Interp).Nam);
735
         Set_Etype  (N, All_Interp.Table (First_Interp).Typ);
736
      end if;
737
   end Collect_Interps;
738
 
739
   ------------
740
   -- Covers --
741
   ------------
742
 
743
   function Covers (T1, T2 : Entity_Id) return Boolean is
744
 
745
      BT1 : Entity_Id;
746
      BT2 : Entity_Id;
747
 
748
      function Full_View_Covers (Typ1, Typ2 : Entity_Id) return Boolean;
749
      --  In an instance the proper view may not always be correct for
750
      --  private types, but private and full view are compatible. This
751
      --  removes spurious errors from nested instantiations that involve,
752
      --  among other things, types derived from private types.
753
 
754
      ----------------------
755
      -- Full_View_Covers --
756
      ----------------------
757
 
758
      function Full_View_Covers (Typ1, Typ2 : Entity_Id) return Boolean is
759
      begin
760
         return
761
           Is_Private_Type (Typ1)
762
             and then
763
              ((Present (Full_View (Typ1))
764
                    and then Covers (Full_View (Typ1), Typ2))
765
                 or else Base_Type (Typ1) = Typ2
766
                 or else Base_Type (Typ2) = Typ1);
767
      end Full_View_Covers;
768
 
769
   --  Start of processing for Covers
770
 
771
   begin
772
      --  If either operand missing, then this is an error, but ignore it (and
773
      --  pretend we have a cover) if errors already detected, since this may
774
      --  simply mean we have malformed trees or a semantic error upstream.
775
 
776
      if No (T1) or else No (T2) then
777
         if Total_Errors_Detected /= 0 then
778
            return True;
779
         else
780
            raise Program_Error;
781
         end if;
782
      end if;
783
 
784
      --  Trivial case: same types are always compatible
785
 
786
      if T1 = T2 then
787
         return True;
788
      end if;
789
 
790
      --  First check for Standard_Void_Type, which is special. Subsequent
791
      --  processing in this routine assumes T1 and T2 are bona fide types;
792
      --  Standard_Void_Type is a special entity that has some, but not all,
793
      --  properties of types.
794
 
795
      if (T1 = Standard_Void_Type) /= (T2 = Standard_Void_Type) then
796
         return False;
797
      end if;
798
 
799
      BT1 := Base_Type (T1);
800
      BT2 := Base_Type (T2);
801
 
802
      --  Handle underlying view of records with unknown discriminants
803
      --  using the original entity that motivated the construction of
804
      --  this underlying record view (see Build_Derived_Private_Type).
805
 
806
      if Is_Underlying_Record_View (BT1) then
807
         BT1 := Underlying_Record_View (BT1);
808
      end if;
809
 
810
      if Is_Underlying_Record_View (BT2) then
811
         BT2 := Underlying_Record_View (BT2);
812
      end if;
813
 
814
      --  Simplest case: types that have the same base type and are not generic
815
      --  actuals are compatible. Generic actuals belong to their class but are
816
      --  not compatible with other types of their class, and in particular
817
      --  with other generic actuals. They are however compatible with their
818
      --  own subtypes, and itypes with the same base are compatible as well.
819
      --  Similarly, constrained subtypes obtained from expressions of an
820
      --  unconstrained nominal type are compatible with the base type (may
821
      --  lead to spurious ambiguities in obscure cases ???)
822
 
823
      --  Generic actuals require special treatment to avoid spurious ambi-
824
      --  guities in an instance, when two formal types are instantiated with
825
      --  the same actual, so that different subprograms end up with the same
826
      --  signature in the instance.
827
 
828
      if BT1 = BT2
829
        or else BT1 = T2
830
        or else BT2 = T1
831
      then
832
         if not Is_Generic_Actual_Type (T1) then
833
            return True;
834
         else
835
            return (not Is_Generic_Actual_Type (T2)
836
                     or else Is_Itype (T1)
837
                     or else Is_Itype (T2)
838
                     or else Is_Constr_Subt_For_U_Nominal (T1)
839
                     or else Is_Constr_Subt_For_U_Nominal (T2)
840
                     or else Scope (T1) /= Scope (T2));
841
         end if;
842
 
843
      --  Literals are compatible with types in a given "class"
844
 
845
      elsif     (T2 = Universal_Integer and then Is_Integer_Type (T1))
846
        or else (T2 = Universal_Real    and then Is_Real_Type (T1))
847
        or else (T2 = Universal_Fixed   and then Is_Fixed_Point_Type (T1))
848
        or else (T2 = Any_Fixed         and then Is_Fixed_Point_Type (T1))
849
        or else (T2 = Any_String        and then Is_String_Type (T1))
850
        or else (T2 = Any_Character     and then Is_Character_Type (T1))
851
        or else (T2 = Any_Access        and then Is_Access_Type (T1))
852
      then
853
         return True;
854
 
855
      --  The context may be class wide, and a class-wide type is compatible
856
      --  with any member of the class.
857
 
858
      elsif Is_Class_Wide_Type (T1)
859
        and then Is_Ancestor (Root_Type (T1), T2)
860
      then
861
         return True;
862
 
863
      elsif Is_Class_Wide_Type (T1)
864
        and then Is_Class_Wide_Type (T2)
865
        and then Base_Type (Etype (T1)) = Base_Type (Etype (T2))
866
      then
867
         return True;
868
 
869
      --  Ada 2005 (AI-345): A class-wide abstract interface type covers a
870
      --  task_type or protected_type that implements the interface.
871
 
872
      elsif Ada_Version >= Ada_2005
873
        and then Is_Class_Wide_Type (T1)
874
        and then Is_Interface (Etype (T1))
875
        and then Is_Concurrent_Type (T2)
876
        and then Interface_Present_In_Ancestor
877
                   (Typ => BT2, Iface => Etype (T1))
878
      then
879
         return True;
880
 
881
      --  Ada 2005 (AI-251): A class-wide abstract interface type T1 covers an
882
      --  object T2 implementing T1.
883
 
884
      elsif Ada_Version >= Ada_2005
885
        and then Is_Class_Wide_Type (T1)
886
        and then Is_Interface (Etype (T1))
887
        and then Is_Tagged_Type (T2)
888
      then
889
         if Interface_Present_In_Ancestor (Typ   => T2,
890
                                           Iface => Etype (T1))
891
         then
892
            return True;
893
         end if;
894
 
895
         declare
896
            E    : Entity_Id;
897
            Elmt : Elmt_Id;
898
 
899
         begin
900
            if Is_Concurrent_Type (BT2) then
901
               E := Corresponding_Record_Type (BT2);
902
            else
903
               E := BT2;
904
            end if;
905
 
906
            --  Ada 2005 (AI-251): A class-wide abstract interface type T1
907
            --  covers an object T2 that implements a direct derivation of T1.
908
            --  Note: test for presence of E is defense against previous error.
909
 
910
            if Present (E)
911
              and then Present (Interfaces (E))
912
            then
913
               Elmt := First_Elmt (Interfaces (E));
914
               while Present (Elmt) loop
915
                  if Is_Ancestor (Etype (T1), Node (Elmt)) then
916
                     return True;
917
                  end if;
918
 
919
                  Next_Elmt (Elmt);
920
               end loop;
921
            end if;
922
 
923
            --  We should also check the case in which T1 is an ancestor of
924
            --  some implemented interface???
925
 
926
            return False;
927
         end;
928
 
929
      --  In a dispatching call, the formal is of some specific type, and the
930
      --  actual is of the corresponding class-wide type, including a subtype
931
      --  of the class-wide type.
932
 
933
      elsif Is_Class_Wide_Type (T2)
934
        and then
935
          (Class_Wide_Type (T1) = Class_Wide_Type (T2)
936
             or else Base_Type (Root_Type (T2)) = BT1)
937
      then
938
         return True;
939
 
940
      --  Some contexts require a class of types rather than a specific type.
941
      --  For example, conditions require any boolean type, fixed point
942
      --  attributes require some real type, etc. The built-in types Any_XXX
943
      --  represent these classes.
944
 
945
      elsif (T1 = Any_Integer and then Is_Integer_Type (T2))
946
        or else (T1 = Any_Boolean and then Is_Boolean_Type (T2))
947
        or else (T1 = Any_Real and then Is_Real_Type (T2))
948
        or else (T1 = Any_Fixed and then Is_Fixed_Point_Type (T2))
949
        or else (T1 = Any_Discrete and then Is_Discrete_Type (T2))
950
      then
951
         return True;
952
 
953
      --  An aggregate is compatible with an array or record type
954
 
955
      elsif T2 = Any_Composite
956
        and then Is_Aggregate_Type (T1)
957
      then
958
         return True;
959
 
960
      --  If the expected type is an anonymous access, the designated type must
961
      --  cover that of the expression. Use the base type for this check: even
962
      --  though access subtypes are rare in sources, they are generated for
963
      --  actuals in instantiations.
964
 
965
      elsif Ekind (BT1) = E_Anonymous_Access_Type
966
        and then Is_Access_Type (T2)
967
        and then Covers (Designated_Type (T1), Designated_Type (T2))
968
      then
969
         return True;
970
 
971
      --  Ada 2012 (AI05-0149): Allow an anonymous access type in the context
972
      --  of a named general access type. An implicit conversion will be
973
      --  applied. For the resolution, one designated type must cover the
974
      --  other.
975
 
976
      elsif Ada_Version >= Ada_2012
977
        and then Ekind (BT1) = E_General_Access_Type
978
        and then Ekind (BT2) = E_Anonymous_Access_Type
979
        and then (Covers (Designated_Type (T1), Designated_Type (T2))
980
                   or else Covers (Designated_Type (T2), Designated_Type (T1)))
981
      then
982
         return True;
983
 
984
      --  An Access_To_Subprogram is compatible with itself, or with an
985
      --  anonymous type created for an attribute reference Access.
986
 
987
      elsif (Ekind (BT1) = E_Access_Subprogram_Type
988
               or else
989
             Ekind (BT1) = E_Access_Protected_Subprogram_Type)
990
        and then Is_Access_Type (T2)
991
        and then (not Comes_From_Source (T1)
992
                   or else not Comes_From_Source (T2))
993
        and then (Is_Overloadable (Designated_Type (T2))
994
                    or else
995
                  Ekind (Designated_Type (T2)) = E_Subprogram_Type)
996
        and then
997
          Type_Conformant (Designated_Type (T1), Designated_Type (T2))
998
        and then
999
          Mode_Conformant (Designated_Type (T1), Designated_Type (T2))
1000
      then
1001
         return True;
1002
 
1003
      --  Ada 2005 (AI-254): An Anonymous_Access_To_Subprogram is compatible
1004
      --  with itself, or with an anonymous type created for an attribute
1005
      --  reference Access.
1006
 
1007
      elsif (Ekind (BT1) = E_Anonymous_Access_Subprogram_Type
1008
               or else
1009
             Ekind (BT1)
1010
                      = E_Anonymous_Access_Protected_Subprogram_Type)
1011
        and then Is_Access_Type (T2)
1012
        and then (not Comes_From_Source (T1)
1013
                   or else not Comes_From_Source (T2))
1014
        and then (Is_Overloadable (Designated_Type (T2))
1015
                    or else
1016
                  Ekind (Designated_Type (T2)) = E_Subprogram_Type)
1017
        and then
1018
           Type_Conformant (Designated_Type (T1), Designated_Type (T2))
1019
        and then
1020
           Mode_Conformant (Designated_Type (T1), Designated_Type (T2))
1021
      then
1022
         return True;
1023
 
1024
      --  The context can be a remote access type, and the expression the
1025
      --  corresponding source type declared in a categorized package, or
1026
      --  vice versa.
1027
 
1028
      elsif Is_Record_Type (T1)
1029
        and then (Is_Remote_Call_Interface (T1)
1030
                   or else Is_Remote_Types (T1))
1031
        and then Present (Corresponding_Remote_Type (T1))
1032
      then
1033
         return Covers (Corresponding_Remote_Type (T1), T2);
1034
 
1035
      --  and conversely.
1036
 
1037
      elsif Is_Record_Type (T2)
1038
        and then (Is_Remote_Call_Interface (T2)
1039
                   or else Is_Remote_Types (T2))
1040
        and then Present (Corresponding_Remote_Type (T2))
1041
      then
1042
         return Covers (Corresponding_Remote_Type (T2), T1);
1043
 
1044
      --  Synchronized types are represented at run time by their corresponding
1045
      --  record type. During expansion one is replaced with the other, but
1046
      --  they are compatible views of the same type.
1047
 
1048
      elsif Is_Record_Type (T1)
1049
        and then Is_Concurrent_Type (T2)
1050
        and then Present (Corresponding_Record_Type (T2))
1051
      then
1052
         return Covers (T1, Corresponding_Record_Type (T2));
1053
 
1054
      elsif Is_Concurrent_Type (T1)
1055
        and then Present (Corresponding_Record_Type (T1))
1056
        and then Is_Record_Type (T2)
1057
      then
1058
         return Covers (Corresponding_Record_Type (T1), T2);
1059
 
1060
      --  During analysis, an attribute reference 'Access has a special type
1061
      --  kind: Access_Attribute_Type, to be replaced eventually with the type
1062
      --  imposed by context.
1063
 
1064
      elsif Ekind (T2) = E_Access_Attribute_Type
1065
        and then Ekind_In (BT1, E_General_Access_Type, E_Access_Type)
1066
        and then Covers (Designated_Type (T1), Designated_Type (T2))
1067
      then
1068
         --  If the target type is a RACW type while the source is an access
1069
         --  attribute type, we are building a RACW that may be exported.
1070
 
1071
         if Is_Remote_Access_To_Class_Wide_Type (BT1) then
1072
            Set_Has_RACW (Current_Sem_Unit);
1073
         end if;
1074
 
1075
         return True;
1076
 
1077
      --  Ditto for allocators, which eventually resolve to the context type
1078
 
1079
      elsif Ekind (T2) = E_Allocator_Type
1080
        and then Is_Access_Type (T1)
1081
      then
1082
         return Covers (Designated_Type (T1), Designated_Type (T2))
1083
          or else
1084
            (From_With_Type (Designated_Type (T1))
1085
              and then Covers (Designated_Type (T2), Designated_Type (T1)));
1086
 
1087
      --  A boolean operation on integer literals is compatible with modular
1088
      --  context.
1089
 
1090
      elsif T2 = Any_Modular
1091
        and then Is_Modular_Integer_Type (T1)
1092
      then
1093
         return True;
1094
 
1095
      --  The actual type may be the result of a previous error
1096
 
1097
      elsif BT2 = Any_Type then
1098
         return True;
1099
 
1100
      --  A packed array type covers its corresponding non-packed type. This is
1101
      --  not legitimate Ada, but allows the omission of a number of otherwise
1102
      --  useless unchecked conversions, and since this can only arise in
1103
      --  (known correct) expanded code, no harm is done.
1104
 
1105
      elsif Is_Array_Type (T2)
1106
        and then Is_Packed (T2)
1107
        and then T1 = Packed_Array_Type (T2)
1108
      then
1109
         return True;
1110
 
1111
      --  Similarly an array type covers its corresponding packed array type
1112
 
1113
      elsif Is_Array_Type (T1)
1114
        and then Is_Packed (T1)
1115
        and then T2 = Packed_Array_Type (T1)
1116
      then
1117
         return True;
1118
 
1119
      --  In instances, or with types exported from instantiations, check
1120
      --  whether a partial and a full view match. Verify that types are
1121
      --  legal, to prevent cascaded errors.
1122
 
1123
      elsif In_Instance
1124
        and then
1125
          (Full_View_Covers (T1, T2)
1126
            or else Full_View_Covers (T2, T1))
1127
      then
1128
         return True;
1129
 
1130
      elsif Is_Type (T2)
1131
        and then Is_Generic_Actual_Type (T2)
1132
        and then Full_View_Covers (T1, T2)
1133
      then
1134
         return True;
1135
 
1136
      elsif Is_Type (T1)
1137
        and then Is_Generic_Actual_Type (T1)
1138
        and then Full_View_Covers (T2, T1)
1139
      then
1140
         return True;
1141
 
1142
      --  In the expansion of inlined bodies, types are compatible if they
1143
      --  are structurally equivalent.
1144
 
1145
      elsif In_Inlined_Body
1146
        and then (Underlying_Type (T1) = Underlying_Type (T2)
1147
                   or else (Is_Access_Type (T1)
1148
                              and then Is_Access_Type (T2)
1149
                              and then
1150
                                Designated_Type (T1) = Designated_Type (T2))
1151
                   or else (T1 = Any_Access
1152
                              and then Is_Access_Type (Underlying_Type (T2)))
1153
                   or else (T2 = Any_Composite
1154
                              and then
1155
                                Is_Composite_Type (Underlying_Type (T1))))
1156
      then
1157
         return True;
1158
 
1159
      --  Ada 2005 (AI-50217): Additional branches to make the shadow entity
1160
      --  obtained through a limited_with compatible with its real entity.
1161
 
1162
      elsif From_With_Type (T1) then
1163
 
1164
         --  If the expected type is the non-limited view of a type, the
1165
         --  expression may have the limited view. If that one in turn is
1166
         --  incomplete, get full view if available.
1167
 
1168
         if Is_Incomplete_Type (T1) then
1169
            return Covers (Get_Full_View (Non_Limited_View (T1)), T2);
1170
 
1171
         elsif Ekind (T1) = E_Class_Wide_Type then
1172
            return
1173
              Covers (Class_Wide_Type (Non_Limited_View (Etype (T1))), T2);
1174
         else
1175
            return False;
1176
         end if;
1177
 
1178
      elsif From_With_Type (T2) then
1179
 
1180
         --  If units in the context have Limited_With clauses on each other,
1181
         --  either type might have a limited view. Checks performed elsewhere
1182
         --  verify that the context type is the nonlimited view.
1183
 
1184
         if Is_Incomplete_Type (T2) then
1185
            return Covers (T1, Get_Full_View (Non_Limited_View (T2)));
1186
 
1187
         elsif Ekind (T2) = E_Class_Wide_Type then
1188
            return
1189
              Present (Non_Limited_View (Etype (T2)))
1190
                and then
1191
                  Covers (T1, Class_Wide_Type (Non_Limited_View (Etype (T2))));
1192
         else
1193
            return False;
1194
         end if;
1195
 
1196
      --  Ada 2005 (AI-412): Coverage for regular incomplete subtypes
1197
 
1198
      elsif Ekind (T1) = E_Incomplete_Subtype then
1199
         return Covers (Full_View (Etype (T1)), T2);
1200
 
1201
      elsif Ekind (T2) = E_Incomplete_Subtype then
1202
         return Covers (T1, Full_View (Etype (T2)));
1203
 
1204
      --  Ada 2005 (AI-423): Coverage of formal anonymous access types
1205
      --  and actual anonymous access types in the context of generic
1206
      --  instantiations. We have the following situation:
1207
 
1208
      --     generic
1209
      --        type Formal is private;
1210
      --        Formal_Obj : access Formal;  --  T1
1211
      --     package G is ...
1212
 
1213
      --     package P is
1214
      --        type Actual is ...
1215
      --        Actual_Obj : access Actual;  --  T2
1216
      --        package Instance is new G (Formal     => Actual,
1217
      --                                   Formal_Obj => Actual_Obj);
1218
 
1219
      elsif Ada_Version >= Ada_2005
1220
        and then Ekind (T1) = E_Anonymous_Access_Type
1221
        and then Ekind (T2) = E_Anonymous_Access_Type
1222
        and then Is_Generic_Type (Directly_Designated_Type (T1))
1223
        and then Get_Instance_Of (Directly_Designated_Type (T1)) =
1224
                   Directly_Designated_Type (T2)
1225
      then
1226
         return True;
1227
 
1228
      --  Otherwise, types are not compatible!
1229
 
1230
      else
1231
         return False;
1232
      end if;
1233
   end Covers;
1234
 
1235
   ------------------
1236
   -- Disambiguate --
1237
   ------------------
1238
 
1239
   function Disambiguate
1240
     (N      : Node_Id;
1241
      I1, I2 : Interp_Index;
1242
      Typ    : Entity_Id) return Interp
1243
   is
1244
      I           : Interp_Index;
1245
      It          : Interp;
1246
      It1, It2    : Interp;
1247
      Nam1, Nam2  : Entity_Id;
1248
      Predef_Subp : Entity_Id;
1249
      User_Subp   : Entity_Id;
1250
 
1251
      function Inherited_From_Actual (S : Entity_Id) return Boolean;
1252
      --  Determine whether one of the candidates is an operation inherited by
1253
      --  a type that is derived from an actual in an instantiation.
1254
 
1255
      function In_Same_Declaration_List
1256
        (Typ     : Entity_Id;
1257
         Op_Decl : Entity_Id) return Boolean;
1258
      --  AI05-0020: a spurious ambiguity may arise when equality on anonymous
1259
      --  access types is declared on the partial view of a designated type, so
1260
      --  that the type declaration and equality are not in the same list of
1261
      --  declarations. This AI gives a preference rule for the user-defined
1262
      --  operation. Same rule applies for arithmetic operations on private
1263
      --  types completed with fixed-point types: the predefined operation is
1264
      --  hidden;  this is already handled properly in GNAT.
1265
 
1266
      function Is_Actual_Subprogram (S : Entity_Id) return Boolean;
1267
      --  Determine whether a subprogram is an actual in an enclosing instance.
1268
      --  An overloading between such a subprogram and one declared outside the
1269
      --  instance is resolved in favor of the first, because it resolved in
1270
      --  the generic.
1271
 
1272
      function Matches (Actual, Formal : Node_Id) return Boolean;
1273
      --  Look for exact type match in an instance, to remove spurious
1274
      --  ambiguities when two formal types have the same actual.
1275
 
1276
      function Operand_Type return Entity_Id;
1277
      --  Determine type of operand for an equality operation, to apply
1278
      --  Ada 2005 rules to equality on anonymous access types.
1279
 
1280
      function Standard_Operator return Boolean;
1281
      --  Check whether subprogram is predefined operator declared in Standard.
1282
      --  It may given by an operator name, or by an expanded name whose prefix
1283
      --  is Standard.
1284
 
1285
      function Remove_Conversions return Interp;
1286
      --  Last chance for pathological cases involving comparisons on literals,
1287
      --  and user overloadings of the same operator. Such pathologies have
1288
      --  been removed from the ACVC, but still appear in two DEC tests, with
1289
      --  the following notable quote from Ben Brosgol:
1290
      --
1291
      --  [Note: I disclaim all credit/responsibility/blame for coming up with
1292
      --  this example; Robert Dewar brought it to our attention, since it is
1293
      --  apparently found in the ACVC 1.5. I did not attempt to find the
1294
      --  reason in the Reference Manual that makes the example legal, since I
1295
      --  was too nauseated by it to want to pursue it further.]
1296
      --
1297
      --  Accordingly, this is not a fully recursive solution, but it handles
1298
      --  DEC tests c460vsa, c460vsb. It also handles ai00136a, which pushes
1299
      --  pathology in the other direction with calls whose multiple overloaded
1300
      --  actuals make them truly unresolvable.
1301
 
1302
      --  The new rules concerning abstract operations create additional need
1303
      --  for special handling of expressions with universal operands, see
1304
      --  comments to Has_Abstract_Interpretation below.
1305
 
1306
      ---------------------------
1307
      -- Inherited_From_Actual --
1308
      ---------------------------
1309
 
1310
      function Inherited_From_Actual (S : Entity_Id) return Boolean is
1311
         Par : constant Node_Id := Parent (S);
1312
      begin
1313
         if Nkind (Par) /= N_Full_Type_Declaration
1314
           or else Nkind (Type_Definition (Par)) /= N_Derived_Type_Definition
1315
         then
1316
            return False;
1317
         else
1318
            return Is_Entity_Name (Subtype_Indication (Type_Definition (Par)))
1319
              and then
1320
               Is_Generic_Actual_Type (
1321
                 Entity (Subtype_Indication (Type_Definition (Par))));
1322
         end if;
1323
      end Inherited_From_Actual;
1324
 
1325
      ------------------------------
1326
      -- In_Same_Declaration_List --
1327
      ------------------------------
1328
 
1329
      function In_Same_Declaration_List
1330
        (Typ     : Entity_Id;
1331
         Op_Decl : Entity_Id) return Boolean
1332
      is
1333
         Scop : constant Entity_Id := Scope (Typ);
1334
 
1335
      begin
1336
         return In_Same_List (Parent (Typ), Op_Decl)
1337
           or else
1338
             (Ekind_In (Scop, E_Package, E_Generic_Package)
1339
                and then List_Containing (Op_Decl) =
1340
                  Visible_Declarations (Parent (Scop))
1341
                and then List_Containing (Parent (Typ)) =
1342
                  Private_Declarations (Parent (Scop)));
1343
      end In_Same_Declaration_List;
1344
 
1345
      --------------------------
1346
      -- Is_Actual_Subprogram --
1347
      --------------------------
1348
 
1349
      function Is_Actual_Subprogram (S : Entity_Id) return Boolean is
1350
      begin
1351
         return In_Open_Scopes (Scope (S))
1352
           and then
1353
             (Is_Generic_Instance (Scope (S))
1354
               or else Is_Wrapper_Package (Scope (S)));
1355
      end Is_Actual_Subprogram;
1356
 
1357
      -------------
1358
      -- Matches --
1359
      -------------
1360
 
1361
      function Matches (Actual, Formal : Node_Id) return Boolean is
1362
         T1 : constant Entity_Id := Etype (Actual);
1363
         T2 : constant Entity_Id := Etype (Formal);
1364
      begin
1365
         return T1 = T2
1366
           or else
1367
             (Is_Numeric_Type (T2)
1368
               and then (T1 = Universal_Real or else T1 = Universal_Integer));
1369
      end Matches;
1370
 
1371
      ------------------
1372
      -- Operand_Type --
1373
      ------------------
1374
 
1375
      function Operand_Type return Entity_Id is
1376
         Opnd : Node_Id;
1377
 
1378
      begin
1379
         if Nkind (N) = N_Function_Call then
1380
            Opnd := First_Actual (N);
1381
         else
1382
            Opnd := Left_Opnd (N);
1383
         end if;
1384
 
1385
         return Etype (Opnd);
1386
      end Operand_Type;
1387
 
1388
      ------------------------
1389
      -- Remove_Conversions --
1390
      ------------------------
1391
 
1392
      function Remove_Conversions return Interp is
1393
         I    : Interp_Index;
1394
         It   : Interp;
1395
         It1  : Interp;
1396
         F1   : Entity_Id;
1397
         Act1 : Node_Id;
1398
         Act2 : Node_Id;
1399
 
1400
         function Has_Abstract_Interpretation (N : Node_Id) return Boolean;
1401
         --  If an operation has universal operands the universal operation
1402
         --  is present among its interpretations. If there is an abstract
1403
         --  interpretation for the operator, with a numeric result, this
1404
         --  interpretation was already removed in sem_ch4, but the universal
1405
         --  one is still visible. We must rescan the list of operators and
1406
         --  remove the universal interpretation to resolve the ambiguity.
1407
 
1408
         ---------------------------------
1409
         -- Has_Abstract_Interpretation --
1410
         ---------------------------------
1411
 
1412
         function Has_Abstract_Interpretation (N : Node_Id) return Boolean is
1413
            E : Entity_Id;
1414
 
1415
         begin
1416
            if Nkind (N) not in N_Op
1417
              or else Ada_Version < Ada_2005
1418
              or else not Is_Overloaded (N)
1419
              or else No (Universal_Interpretation (N))
1420
            then
1421
               return False;
1422
 
1423
            else
1424
               E := Get_Name_Entity_Id (Chars (N));
1425
               while Present (E) loop
1426
                  if Is_Overloadable (E)
1427
                    and then Is_Abstract_Subprogram (E)
1428
                    and then Is_Numeric_Type (Etype (E))
1429
                  then
1430
                     return True;
1431
                  else
1432
                     E := Homonym (E);
1433
                  end if;
1434
               end loop;
1435
 
1436
               --  Finally, if an operand of the binary operator is itself
1437
               --  an operator, recurse to see whether its own abstract
1438
               --  interpretation is responsible for the spurious ambiguity.
1439
 
1440
               if Nkind (N) in N_Binary_Op then
1441
                  return Has_Abstract_Interpretation (Left_Opnd (N))
1442
                    or else Has_Abstract_Interpretation (Right_Opnd (N));
1443
 
1444
               elsif Nkind (N) in N_Unary_Op then
1445
                  return Has_Abstract_Interpretation (Right_Opnd (N));
1446
 
1447
               else
1448
                  return False;
1449
               end if;
1450
            end if;
1451
         end Has_Abstract_Interpretation;
1452
 
1453
      --  Start of processing for Remove_Conversions
1454
 
1455
      begin
1456
         It1 := No_Interp;
1457
 
1458
         Get_First_Interp (N, I, It);
1459
         while Present (It.Typ) loop
1460
            if not Is_Overloadable (It.Nam) then
1461
               return No_Interp;
1462
            end if;
1463
 
1464
            F1 := First_Formal (It.Nam);
1465
 
1466
            if No (F1) then
1467
               return It1;
1468
 
1469
            else
1470
               if Nkind (N) = N_Function_Call
1471
                 or else Nkind (N) = N_Procedure_Call_Statement
1472
               then
1473
                  Act1 := First_Actual (N);
1474
 
1475
                  if Present (Act1) then
1476
                     Act2 := Next_Actual (Act1);
1477
                  else
1478
                     Act2 := Empty;
1479
                  end if;
1480
 
1481
               elsif Nkind (N) in N_Unary_Op then
1482
                  Act1 := Right_Opnd (N);
1483
                  Act2 := Empty;
1484
 
1485
               elsif Nkind (N) in N_Binary_Op then
1486
                  Act1 := Left_Opnd (N);
1487
                  Act2 := Right_Opnd (N);
1488
 
1489
                  --  Use type of second formal, so as to include
1490
                  --  exponentiation, where the exponent may be
1491
                  --  ambiguous and the result non-universal.
1492
 
1493
                  Next_Formal (F1);
1494
 
1495
               else
1496
                  return It1;
1497
               end if;
1498
 
1499
               if Nkind (Act1) in N_Op
1500
                 and then Is_Overloaded (Act1)
1501
                 and then (Nkind (Right_Opnd (Act1)) = N_Integer_Literal
1502
                            or else Nkind (Right_Opnd (Act1)) = N_Real_Literal)
1503
                 and then Has_Compatible_Type (Act1, Standard_Boolean)
1504
                 and then Etype (F1) = Standard_Boolean
1505
               then
1506
                  --  If the two candidates are the original ones, the
1507
                  --  ambiguity is real. Otherwise keep the original, further
1508
                  --  calls to Disambiguate will take care of others in the
1509
                  --  list of candidates.
1510
 
1511
                  if It1 /= No_Interp then
1512
                     if It = Disambiguate.It1
1513
                       or else It = Disambiguate.It2
1514
                     then
1515
                        if It1 = Disambiguate.It1
1516
                          or else It1 = Disambiguate.It2
1517
                        then
1518
                           return No_Interp;
1519
                        else
1520
                           It1 := It;
1521
                        end if;
1522
                     end if;
1523
 
1524
                  elsif Present (Act2)
1525
                    and then Nkind (Act2) in N_Op
1526
                    and then Is_Overloaded (Act2)
1527
                    and then Nkind_In (Right_Opnd (Act2), N_Integer_Literal,
1528
                                                          N_Real_Literal)
1529
                    and then Has_Compatible_Type (Act2, Standard_Boolean)
1530
                  then
1531
                     --  The preference rule on the first actual is not
1532
                     --  sufficient to disambiguate.
1533
 
1534
                     goto Next_Interp;
1535
 
1536
                  else
1537
                     It1 := It;
1538
                  end if;
1539
 
1540
               elsif Is_Numeric_Type (Etype (F1))
1541
                 and then Has_Abstract_Interpretation (Act1)
1542
               then
1543
                  --  Current interpretation is not the right one because it
1544
                  --  expects a numeric operand. Examine all the other ones.
1545
 
1546
                  declare
1547
                     I  : Interp_Index;
1548
                     It : Interp;
1549
 
1550
                  begin
1551
                     Get_First_Interp (N, I, It);
1552
                     while Present (It.Typ) loop
1553
                        if
1554
                          not Is_Numeric_Type (Etype (First_Formal (It.Nam)))
1555
                        then
1556
                           if No (Act2)
1557
                             or else not Has_Abstract_Interpretation (Act2)
1558
                             or else not
1559
                               Is_Numeric_Type
1560
                                 (Etype (Next_Formal (First_Formal (It.Nam))))
1561
                           then
1562
                              return It;
1563
                           end if;
1564
                        end if;
1565
 
1566
                        Get_Next_Interp (I, It);
1567
                     end loop;
1568
 
1569
                     return No_Interp;
1570
                  end;
1571
               end if;
1572
            end if;
1573
 
1574
            <<Next_Interp>>
1575
               Get_Next_Interp (I, It);
1576
         end loop;
1577
 
1578
         --  After some error, a formal may have Any_Type and yield a spurious
1579
         --  match. To avoid cascaded errors if possible, check for such a
1580
         --  formal in either candidate.
1581
 
1582
         if Serious_Errors_Detected > 0 then
1583
            declare
1584
               Formal : Entity_Id;
1585
 
1586
            begin
1587
               Formal := First_Formal (Nam1);
1588
               while Present (Formal) loop
1589
                  if Etype (Formal) = Any_Type then
1590
                     return Disambiguate.It2;
1591
                  end if;
1592
 
1593
                  Next_Formal (Formal);
1594
               end loop;
1595
 
1596
               Formal := First_Formal (Nam2);
1597
               while Present (Formal) loop
1598
                  if Etype (Formal) = Any_Type then
1599
                     return Disambiguate.It1;
1600
                  end if;
1601
 
1602
                  Next_Formal (Formal);
1603
               end loop;
1604
            end;
1605
         end if;
1606
 
1607
         return It1;
1608
      end Remove_Conversions;
1609
 
1610
      -----------------------
1611
      -- Standard_Operator --
1612
      -----------------------
1613
 
1614
      function Standard_Operator return Boolean is
1615
         Nam : Node_Id;
1616
 
1617
      begin
1618
         if Nkind (N) in N_Op then
1619
            return True;
1620
 
1621
         elsif Nkind (N) = N_Function_Call then
1622
            Nam := Name (N);
1623
 
1624
            if Nkind (Nam) /= N_Expanded_Name then
1625
               return True;
1626
            else
1627
               return Entity (Prefix (Nam)) = Standard_Standard;
1628
            end if;
1629
         else
1630
            return False;
1631
         end if;
1632
      end Standard_Operator;
1633
 
1634
   --  Start of processing for Disambiguate
1635
 
1636
   begin
1637
      --  Recover the two legal interpretations
1638
 
1639
      Get_First_Interp (N, I, It);
1640
      while I /= I1 loop
1641
         Get_Next_Interp (I, It);
1642
      end loop;
1643
 
1644
      It1  := It;
1645
      Nam1 := It.Nam;
1646
      while I /= I2 loop
1647
         Get_Next_Interp (I, It);
1648
      end loop;
1649
 
1650
      It2  := It;
1651
      Nam2 := It.Nam;
1652
 
1653
      --  Check whether one of the entities is an Ada 2005/2012 and we are
1654
      --  operating in an earlier mode, in which case we discard the Ada
1655
      --  2005/2012 entity, so that we get proper Ada 95 overload resolution.
1656
 
1657
      if Ada_Version < Ada_2005 then
1658
         if Is_Ada_2005_Only (Nam1) or else Is_Ada_2012_Only (Nam1) then
1659
            return It2;
1660
         elsif Is_Ada_2005_Only (Nam2) or else Is_Ada_2012_Only (Nam1) then
1661
            return It1;
1662
         end if;
1663
      end if;
1664
 
1665
      --  Check whether one of the entities is an Ada 2012 entity and we are
1666
      --  operating in Ada 2005 mode, in which case we discard the Ada 2012
1667
      --  entity, so that we get proper Ada 2005 overload resolution.
1668
 
1669
      if Ada_Version = Ada_2005 then
1670
         if Is_Ada_2012_Only (Nam1) then
1671
            return It2;
1672
         elsif Is_Ada_2012_Only (Nam2) then
1673
            return It1;
1674
         end if;
1675
      end if;
1676
 
1677
      --  Check for overloaded CIL convention stuff because the CIL libraries
1678
      --  do sick things like Console.Write_Line where it matches two different
1679
      --  overloads, so just pick the first ???
1680
 
1681
      if Convention (Nam1) = Convention_CIL
1682
        and then Convention (Nam2) = Convention_CIL
1683
        and then Ekind (Nam1) = Ekind (Nam2)
1684
        and then (Ekind (Nam1) = E_Procedure
1685
                   or else Ekind (Nam1) = E_Function)
1686
      then
1687
         return It2;
1688
      end if;
1689
 
1690
      --  If the context is universal, the predefined operator is preferred.
1691
      --  This includes bounds in numeric type declarations, and expressions
1692
      --  in type conversions. If no interpretation yields a universal type,
1693
      --  then we must check whether the user-defined entity hides the prede-
1694
      --  fined one.
1695
 
1696
      if Chars (Nam1) in Any_Operator_Name
1697
        and then Standard_Operator
1698
      then
1699
         if        Typ = Universal_Integer
1700
           or else Typ = Universal_Real
1701
           or else Typ = Any_Integer
1702
           or else Typ = Any_Discrete
1703
           or else Typ = Any_Real
1704
           or else Typ = Any_Type
1705
         then
1706
            --  Find an interpretation that yields the universal type, or else
1707
            --  a predefined operator that yields a predefined numeric type.
1708
 
1709
            declare
1710
               Candidate : Interp := No_Interp;
1711
 
1712
            begin
1713
               Get_First_Interp (N, I, It);
1714
               while Present (It.Typ) loop
1715
                  if (Covers (Typ, It.Typ)
1716
                        or else Typ = Any_Type)
1717
                    and then
1718
                     (It.Typ = Universal_Integer
1719
                       or else It.Typ = Universal_Real)
1720
                  then
1721
                     return It;
1722
 
1723
                  elsif Covers (Typ, It.Typ)
1724
                    and then Scope (It.Typ) = Standard_Standard
1725
                    and then Scope (It.Nam) = Standard_Standard
1726
                    and then Is_Numeric_Type (It.Typ)
1727
                  then
1728
                     Candidate := It;
1729
                  end if;
1730
 
1731
                  Get_Next_Interp (I, It);
1732
               end loop;
1733
 
1734
               if Candidate /= No_Interp then
1735
                  return Candidate;
1736
               end if;
1737
            end;
1738
 
1739
         elsif Chars (Nam1) /= Name_Op_Not
1740
           and then (Typ = Standard_Boolean or else Typ = Any_Boolean)
1741
         then
1742
            --  Equality or comparison operation. Choose predefined operator if
1743
            --  arguments are universal. The node may be an operator, name, or
1744
            --  a function call, so unpack arguments accordingly.
1745
 
1746
            declare
1747
               Arg1, Arg2 : Node_Id;
1748
 
1749
            begin
1750
               if Nkind (N) in N_Op then
1751
                  Arg1 := Left_Opnd  (N);
1752
                  Arg2 := Right_Opnd (N);
1753
 
1754
               elsif Is_Entity_Name (N) then
1755
                  Arg1 := First_Entity (Entity (N));
1756
                  Arg2 := Next_Entity (Arg1);
1757
 
1758
               else
1759
                  Arg1 := First_Actual (N);
1760
                  Arg2 := Next_Actual (Arg1);
1761
               end if;
1762
 
1763
               if Present (Arg2)
1764
                 and then Present (Universal_Interpretation (Arg1))
1765
                 and then Universal_Interpretation (Arg2) =
1766
                          Universal_Interpretation (Arg1)
1767
               then
1768
                  Get_First_Interp (N, I, It);
1769
                  while Scope (It.Nam) /= Standard_Standard loop
1770
                     Get_Next_Interp (I, It);
1771
                  end loop;
1772
 
1773
                  return It;
1774
               end if;
1775
            end;
1776
         end if;
1777
      end if;
1778
 
1779
      --  If no universal interpretation, check whether user-defined operator
1780
      --  hides predefined one, as well as other special cases. If the node
1781
      --  is a range, then one or both bounds are ambiguous. Each will have
1782
      --  to be disambiguated w.r.t. the context type. The type of the range
1783
      --  itself is imposed by the context, so we can return either legal
1784
      --  interpretation.
1785
 
1786
      if Ekind (Nam1) = E_Operator then
1787
         Predef_Subp := Nam1;
1788
         User_Subp   := Nam2;
1789
 
1790
      elsif Ekind (Nam2) = E_Operator then
1791
         Predef_Subp := Nam2;
1792
         User_Subp   := Nam1;
1793
 
1794
      elsif Nkind (N) = N_Range then
1795
         return It1;
1796
 
1797
      --  Implement AI05-105: A renaming declaration with an access
1798
      --  definition must resolve to an anonymous access type. This
1799
      --  is a resolution rule and can be used to disambiguate.
1800
 
1801
      elsif Nkind (Parent (N)) = N_Object_Renaming_Declaration
1802
        and then Present (Access_Definition (Parent (N)))
1803
      then
1804
         if Ekind_In (It1.Typ, E_Anonymous_Access_Type,
1805
                               E_Anonymous_Access_Subprogram_Type)
1806
         then
1807
            if Ekind (It2.Typ) = Ekind (It1.Typ) then
1808
 
1809
               --  True ambiguity
1810
 
1811
               return No_Interp;
1812
 
1813
            else
1814
               return It1;
1815
            end if;
1816
 
1817
         elsif Ekind_In (It2.Typ, E_Anonymous_Access_Type,
1818
                                  E_Anonymous_Access_Subprogram_Type)
1819
         then
1820
            return It2;
1821
 
1822
         --  No legal interpretation
1823
 
1824
         else
1825
            return No_Interp;
1826
         end if;
1827
 
1828
      --  If two user defined-subprograms are visible, it is a true ambiguity,
1829
      --  unless one of them is an entry and the context is a conditional or
1830
      --  timed entry call, or unless we are within an instance and this is
1831
      --  results from two formals types with the same actual.
1832
 
1833
      else
1834
         if Nkind (N) = N_Procedure_Call_Statement
1835
           and then Nkind (Parent (N)) = N_Entry_Call_Alternative
1836
           and then N = Entry_Call_Statement (Parent (N))
1837
         then
1838
            if Ekind (Nam2) = E_Entry then
1839
               return It2;
1840
            elsif Ekind (Nam1) = E_Entry then
1841
               return It1;
1842
            else
1843
               return No_Interp;
1844
            end if;
1845
 
1846
         --  If the ambiguity occurs within an instance, it is due to several
1847
         --  formal types with the same actual. Look for an exact match between
1848
         --  the types of the formals of the overloadable entities, and the
1849
         --  actuals in the call, to recover the unambiguous match in the
1850
         --  original generic.
1851
 
1852
         --  The ambiguity can also be due to an overloading between a formal
1853
         --  subprogram and a subprogram declared outside the generic. If the
1854
         --  node is overloaded, it did not resolve to the global entity in
1855
         --  the generic, and we choose the formal subprogram.
1856
 
1857
         --  Finally, the ambiguity can be between an explicit subprogram and
1858
         --  one inherited (with different defaults) from an actual. In this
1859
         --  case the resolution was to the explicit declaration in the
1860
         --  generic, and remains so in the instance.
1861
 
1862
         --  The same sort of disambiguation needed for calls is also required
1863
         --  for the name given in a subprogram renaming, and that case is
1864
         --  handled here as well. We test Comes_From_Source to exclude this
1865
         --  treatment for implicit renamings created for formal subprograms.
1866
 
1867
         elsif In_Instance
1868
           and then not In_Generic_Actual (N)
1869
         then
1870
            if Nkind (N) = N_Function_Call
1871
              or else Nkind (N) = N_Procedure_Call_Statement
1872
              or else
1873
                (Nkind (N) in N_Has_Entity
1874
                  and then
1875
                    Nkind (Parent (N)) = N_Subprogram_Renaming_Declaration
1876
                  and then Comes_From_Source (Parent (N)))
1877
            then
1878
               declare
1879
                  Actual  : Node_Id;
1880
                  Formal  : Entity_Id;
1881
                  Renam   : Entity_Id        := Empty;
1882
                  Is_Act1 : constant Boolean := Is_Actual_Subprogram (Nam1);
1883
                  Is_Act2 : constant Boolean := Is_Actual_Subprogram (Nam2);
1884
 
1885
               begin
1886
                  if Is_Act1 and then not Is_Act2 then
1887
                     return It1;
1888
 
1889
                  elsif Is_Act2 and then not Is_Act1 then
1890
                     return It2;
1891
 
1892
                  elsif Inherited_From_Actual (Nam1)
1893
                    and then Comes_From_Source (Nam2)
1894
                  then
1895
                     return It2;
1896
 
1897
                  elsif Inherited_From_Actual (Nam2)
1898
                    and then Comes_From_Source (Nam1)
1899
                  then
1900
                     return It1;
1901
                  end if;
1902
 
1903
                  --  In the case of a renamed subprogram, pick up the entity
1904
                  --  of the renaming declaration so we can traverse its
1905
                  --  formal parameters.
1906
 
1907
                  if Nkind (N) in N_Has_Entity then
1908
                     Renam := Defining_Unit_Name (Specification (Parent (N)));
1909
                  end if;
1910
 
1911
                  if Present (Renam) then
1912
                     Actual := First_Formal (Renam);
1913
                  else
1914
                     Actual := First_Actual (N);
1915
                  end if;
1916
 
1917
                  Formal := First_Formal (Nam1);
1918
                  while Present (Actual) loop
1919
                     if Etype (Actual) /= Etype (Formal) then
1920
                        return It2;
1921
                     end if;
1922
 
1923
                     if Present (Renam) then
1924
                        Next_Formal (Actual);
1925
                     else
1926
                        Next_Actual (Actual);
1927
                     end if;
1928
 
1929
                     Next_Formal (Formal);
1930
                  end loop;
1931
 
1932
                  return It1;
1933
               end;
1934
 
1935
            elsif Nkind (N) in N_Binary_Op then
1936
               if Matches (Left_Opnd (N), First_Formal (Nam1))
1937
                 and then
1938
                   Matches (Right_Opnd (N), Next_Formal (First_Formal (Nam1)))
1939
               then
1940
                  return It1;
1941
               else
1942
                  return It2;
1943
               end if;
1944
 
1945
            elsif Nkind (N) in  N_Unary_Op then
1946
               if Etype (Right_Opnd (N)) = Etype (First_Formal (Nam1)) then
1947
                  return It1;
1948
               else
1949
                  return It2;
1950
               end if;
1951
 
1952
            else
1953
               return Remove_Conversions;
1954
            end if;
1955
         else
1956
            return Remove_Conversions;
1957
         end if;
1958
      end if;
1959
 
1960
      --  An implicit concatenation operator on a string type cannot be
1961
      --  disambiguated from the predefined concatenation. This can only
1962
      --  happen with concatenation of string literals.
1963
 
1964
      if Chars (User_Subp) = Name_Op_Concat
1965
        and then Ekind (User_Subp) = E_Operator
1966
        and then Is_String_Type (Etype (First_Formal (User_Subp)))
1967
      then
1968
         return No_Interp;
1969
 
1970
      --  If the user-defined operator is in an open scope, or in the scope
1971
      --  of the resulting type, or given by an expanded name that names its
1972
      --  scope, it hides the predefined operator for the type. Exponentiation
1973
      --  has to be special-cased because the implicit operator does not have
1974
      --  a symmetric signature, and may not be hidden by the explicit one.
1975
 
1976
      elsif (Nkind (N) = N_Function_Call
1977
              and then Nkind (Name (N)) = N_Expanded_Name
1978
              and then (Chars (Predef_Subp) /= Name_Op_Expon
1979
                          or else Hides_Op (User_Subp, Predef_Subp))
1980
              and then Scope (User_Subp) = Entity (Prefix (Name (N))))
1981
        or else Hides_Op (User_Subp, Predef_Subp)
1982
      then
1983
         if It1.Nam = User_Subp then
1984
            return It1;
1985
         else
1986
            return It2;
1987
         end if;
1988
 
1989
      --  Otherwise, the predefined operator has precedence, or if the user-
1990
      --  defined operation is directly visible we have a true ambiguity.
1991
 
1992
      --  If this is a fixed-point multiplication and division in Ada 83 mode,
1993
      --  exclude the universal_fixed operator, which often causes ambiguities
1994
      --  in legacy code.
1995
 
1996
      --  Ditto in Ada 2012, where an ambiguity may arise for an operation
1997
      --  on a partial view that is completed with a fixed point type. See
1998
      --  AI05-0020 and AI05-0209. The ambiguity is resolved in favor of the
1999
      --  user-defined subprogram so that a client of the package has the
2000
      --  same resulution as the body of the package.
2001
 
2002
      else
2003
         if (In_Open_Scopes (Scope (User_Subp))
2004
           or else Is_Potentially_Use_Visible (User_Subp))
2005
           and then not In_Instance
2006
         then
2007
            if Is_Fixed_Point_Type (Typ)
2008
              and then (Chars (Nam1) = Name_Op_Multiply
2009
                          or else Chars (Nam1) = Name_Op_Divide)
2010
              and then
2011
                (Ada_Version = Ada_83
2012
                  or else
2013
                   (Ada_Version >= Ada_2012
2014
                     and then
2015
                       In_Same_Declaration_List
2016
                         (Typ, Unit_Declaration_Node (User_Subp))))
2017
            then
2018
               if It2.Nam = Predef_Subp then
2019
                  return It1;
2020
               else
2021
                  return It2;
2022
               end if;
2023
 
2024
            --  Ada 2005, AI-420: preference rule for "=" on Universal_Access
2025
            --  states that the operator defined in Standard is not available
2026
            --  if there is a user-defined equality with the proper signature,
2027
            --  declared in the same declarative list as the type. The node
2028
            --  may be an operator or a function call.
2029
 
2030
            elsif (Chars (Nam1) = Name_Op_Eq
2031
                     or else
2032
                   Chars (Nam1) = Name_Op_Ne)
2033
              and then Ada_Version >= Ada_2005
2034
              and then Etype (User_Subp) = Standard_Boolean
2035
              and then Ekind (Operand_Type) = E_Anonymous_Access_Type
2036
              and then
2037
                In_Same_Declaration_List
2038
                  (Designated_Type (Operand_Type),
2039
                     Unit_Declaration_Node (User_Subp))
2040
            then
2041
               if It2.Nam = Predef_Subp then
2042
                  return It1;
2043
               else
2044
                  return It2;
2045
               end if;
2046
 
2047
            --  An immediately visible operator hides a use-visible user-
2048
            --  defined operation. This disambiguation cannot take place
2049
            --  earlier because the visibility of the predefined operator
2050
            --  can only be established when operand types are known.
2051
 
2052
            elsif Ekind (User_Subp) = E_Function
2053
              and then Ekind (Predef_Subp) = E_Operator
2054
              and then Nkind (N) in N_Op
2055
              and then not Is_Overloaded (Right_Opnd (N))
2056
              and then
2057
                Is_Immediately_Visible (Base_Type (Etype (Right_Opnd (N))))
2058
              and then Is_Potentially_Use_Visible (User_Subp)
2059
            then
2060
               if It2.Nam = Predef_Subp then
2061
                  return It1;
2062
               else
2063
                  return It2;
2064
               end if;
2065
 
2066
            else
2067
               return No_Interp;
2068
            end if;
2069
 
2070
         elsif It1.Nam = Predef_Subp then
2071
            return It1;
2072
 
2073
         else
2074
            return It2;
2075
         end if;
2076
      end if;
2077
   end Disambiguate;
2078
 
2079
   ---------------------
2080
   -- End_Interp_List --
2081
   ---------------------
2082
 
2083
   procedure End_Interp_List is
2084
   begin
2085
      All_Interp.Table (All_Interp.Last) := No_Interp;
2086
      All_Interp.Increment_Last;
2087
   end End_Interp_List;
2088
 
2089
   -------------------------
2090
   -- Entity_Matches_Spec --
2091
   -------------------------
2092
 
2093
   function Entity_Matches_Spec (Old_S, New_S : Entity_Id) return Boolean is
2094
   begin
2095
      --  Simple case: same entity kinds, type conformance is required. A
2096
      --  parameterless function can also rename a literal.
2097
 
2098
      if Ekind (Old_S) = Ekind (New_S)
2099
        or else (Ekind (New_S) = E_Function
2100
                  and then Ekind (Old_S) = E_Enumeration_Literal)
2101
      then
2102
         return Type_Conformant (New_S, Old_S);
2103
 
2104
      elsif Ekind (New_S) = E_Function
2105
        and then Ekind (Old_S) = E_Operator
2106
      then
2107
         return Operator_Matches_Spec (Old_S, New_S);
2108
 
2109
      elsif Ekind (New_S) = E_Procedure
2110
        and then Is_Entry (Old_S)
2111
      then
2112
         return Type_Conformant (New_S, Old_S);
2113
 
2114
      else
2115
         return False;
2116
      end if;
2117
   end Entity_Matches_Spec;
2118
 
2119
   ----------------------
2120
   -- Find_Unique_Type --
2121
   ----------------------
2122
 
2123
   function Find_Unique_Type (L : Node_Id; R : Node_Id) return Entity_Id is
2124
      T  : constant Entity_Id := Etype (L);
2125
      I  : Interp_Index;
2126
      It : Interp;
2127
      TR : Entity_Id := Any_Type;
2128
 
2129
   begin
2130
      if Is_Overloaded (R) then
2131
         Get_First_Interp (R, I, It);
2132
         while Present (It.Typ) loop
2133
            if Covers (T, It.Typ) or else Covers (It.Typ, T) then
2134
 
2135
               --  If several interpretations are possible and L is universal,
2136
               --  apply preference rule.
2137
 
2138
               if TR /= Any_Type then
2139
 
2140
                  if (T = Universal_Integer or else T = Universal_Real)
2141
                    and then It.Typ = T
2142
                  then
2143
                     TR := It.Typ;
2144
                  end if;
2145
 
2146
               else
2147
                  TR := It.Typ;
2148
               end if;
2149
            end if;
2150
 
2151
            Get_Next_Interp (I, It);
2152
         end loop;
2153
 
2154
         Set_Etype (R, TR);
2155
 
2156
      --  In the non-overloaded case, the Etype of R is already set correctly
2157
 
2158
      else
2159
         null;
2160
      end if;
2161
 
2162
      --  If one of the operands is Universal_Fixed, the type of the other
2163
      --  operand provides the context.
2164
 
2165
      if Etype (R) = Universal_Fixed then
2166
         return T;
2167
 
2168
      elsif T = Universal_Fixed then
2169
         return Etype (R);
2170
 
2171
      --  Ada 2005 (AI-230): Support the following operators:
2172
 
2173
      --    function "="  (L, R : universal_access) return Boolean;
2174
      --    function "/=" (L, R : universal_access) return Boolean;
2175
 
2176
      --  Pool specific access types (E_Access_Type) are not covered by these
2177
      --  operators because of the legality rule of 4.5.2(9.2): "The operands
2178
      --  of the equality operators for universal_access shall be convertible
2179
      --  to one another (see 4.6)". For example, considering the type decla-
2180
      --  ration "type P is access Integer" and an anonymous access to Integer,
2181
      --  P is convertible to "access Integer" by 4.6 (24.11-24.15), but there
2182
      --  is no rule in 4.6 that allows "access Integer" to be converted to P.
2183
 
2184
      elsif Ada_Version >= Ada_2005
2185
        and then
2186
          (Ekind (Etype (L)) = E_Anonymous_Access_Type
2187
             or else
2188
           Ekind (Etype (L)) = E_Anonymous_Access_Subprogram_Type)
2189
        and then Is_Access_Type (Etype (R))
2190
        and then Ekind (Etype (R)) /= E_Access_Type
2191
      then
2192
         return Etype (L);
2193
 
2194
      elsif Ada_Version >= Ada_2005
2195
        and then
2196
          (Ekind (Etype (R)) = E_Anonymous_Access_Type
2197
            or else Ekind (Etype (R)) = E_Anonymous_Access_Subprogram_Type)
2198
        and then Is_Access_Type (Etype (L))
2199
        and then Ekind (Etype (L)) /= E_Access_Type
2200
      then
2201
         return Etype (R);
2202
 
2203
      else
2204
         return Specific_Type (T, Etype (R));
2205
      end if;
2206
   end Find_Unique_Type;
2207
 
2208
   -------------------------------------
2209
   -- Function_Interp_Has_Abstract_Op --
2210
   -------------------------------------
2211
 
2212
   function Function_Interp_Has_Abstract_Op
2213
     (N : Node_Id;
2214
      E : Entity_Id) return Entity_Id
2215
   is
2216
      Abstr_Op  : Entity_Id;
2217
      Act       : Node_Id;
2218
      Act_Parm  : Node_Id;
2219
      Form_Parm : Node_Id;
2220
 
2221
   begin
2222
      --  Why is check on E needed below ???
2223
      --  In any case this para needs comments ???
2224
 
2225
      if Is_Overloaded (N) and then Is_Overloadable (E) then
2226
         Act_Parm  := First_Actual (N);
2227
         Form_Parm := First_Formal (E);
2228
         while Present (Act_Parm)
2229
           and then Present (Form_Parm)
2230
         loop
2231
            Act := Act_Parm;
2232
 
2233
            if Nkind (Act) = N_Parameter_Association then
2234
               Act := Explicit_Actual_Parameter (Act);
2235
            end if;
2236
 
2237
            Abstr_Op := Has_Abstract_Op (Act, Etype (Form_Parm));
2238
 
2239
            if Present (Abstr_Op) then
2240
               return Abstr_Op;
2241
            end if;
2242
 
2243
            Next_Actual (Act_Parm);
2244
            Next_Formal (Form_Parm);
2245
         end loop;
2246
      end if;
2247
 
2248
      return Empty;
2249
   end Function_Interp_Has_Abstract_Op;
2250
 
2251
   ----------------------
2252
   -- Get_First_Interp --
2253
   ----------------------
2254
 
2255
   procedure Get_First_Interp
2256
     (N  : Node_Id;
2257
      I  : out Interp_Index;
2258
      It : out Interp)
2259
   is
2260
      Int_Ind : Interp_Index;
2261
      Map_Ptr : Int;
2262
      O_N     : Node_Id;
2263
 
2264
   begin
2265
      --  If a selected component is overloaded because the selector has
2266
      --  multiple interpretations, the node is a call to a protected
2267
      --  operation or an indirect call. Retrieve the interpretation from
2268
      --  the selector name. The selected component may be overloaded as well
2269
      --  if the prefix is overloaded. That case is unchanged.
2270
 
2271
      if Nkind (N) = N_Selected_Component
2272
        and then Is_Overloaded (Selector_Name (N))
2273
      then
2274
         O_N := Selector_Name (N);
2275
      else
2276
         O_N := N;
2277
      end if;
2278
 
2279
      Map_Ptr := Headers (Hash (O_N));
2280
      while Map_Ptr /= No_Entry loop
2281
         if Interp_Map.Table (Map_Ptr).Node = O_N then
2282
            Int_Ind := Interp_Map.Table (Map_Ptr).Index;
2283
            It := All_Interp.Table (Int_Ind);
2284
            I := Int_Ind;
2285
            return;
2286
         else
2287
            Map_Ptr := Interp_Map.Table (Map_Ptr).Next;
2288
         end if;
2289
      end loop;
2290
 
2291
      --  Procedure should never be called if the node has no interpretations
2292
 
2293
      raise Program_Error;
2294
   end Get_First_Interp;
2295
 
2296
   ---------------------
2297
   -- Get_Next_Interp --
2298
   ---------------------
2299
 
2300
   procedure Get_Next_Interp (I : in out Interp_Index; It : out Interp) is
2301
   begin
2302
      I  := I + 1;
2303
      It := All_Interp.Table (I);
2304
   end Get_Next_Interp;
2305
 
2306
   -------------------------
2307
   -- Has_Compatible_Type --
2308
   -------------------------
2309
 
2310
   function Has_Compatible_Type
2311
     (N   : Node_Id;
2312
      Typ : Entity_Id) return Boolean
2313
   is
2314
      I  : Interp_Index;
2315
      It : Interp;
2316
 
2317
   begin
2318
      if N = Error then
2319
         return False;
2320
      end if;
2321
 
2322
      if Nkind (N) = N_Subtype_Indication
2323
        or else not Is_Overloaded (N)
2324
      then
2325
         return
2326
           Covers (Typ, Etype (N))
2327
 
2328
            --  Ada 2005 (AI-345): The context may be a synchronized interface.
2329
            --  If the type is already frozen use the corresponding_record
2330
            --  to check whether it is a proper descendant.
2331
 
2332
           or else
2333
             (Is_Record_Type (Typ)
2334
                and then Is_Concurrent_Type (Etype (N))
2335
                and then Present (Corresponding_Record_Type (Etype (N)))
2336
                and then Covers (Typ, Corresponding_Record_Type (Etype (N))))
2337
 
2338
           or else
2339
             (Is_Concurrent_Type (Typ)
2340
                and then Is_Record_Type (Etype (N))
2341
                and then Present (Corresponding_Record_Type (Typ))
2342
                and then Covers (Corresponding_Record_Type (Typ), Etype (N)))
2343
 
2344
           or else
2345
             (not Is_Tagged_Type (Typ)
2346
                and then Ekind (Typ) /= E_Anonymous_Access_Type
2347
                and then Covers (Etype (N), Typ));
2348
 
2349
      else
2350
         Get_First_Interp (N, I, It);
2351
         while Present (It.Typ) loop
2352
            if (Covers (Typ, It.Typ)
2353
                  and then
2354
                    (Scope (It.Nam) /= Standard_Standard
2355
                       or else not Is_Invisible_Operator (N, Base_Type (Typ))))
2356
 
2357
               --  Ada 2005 (AI-345)
2358
 
2359
              or else
2360
                (Is_Concurrent_Type (It.Typ)
2361
                  and then Present (Corresponding_Record_Type
2362
                                                             (Etype (It.Typ)))
2363
                  and then Covers (Typ, Corresponding_Record_Type
2364
                                                             (Etype (It.Typ))))
2365
 
2366
              or else (not Is_Tagged_Type (Typ)
2367
                         and then Ekind (Typ) /= E_Anonymous_Access_Type
2368
                         and then Covers (It.Typ, Typ))
2369
            then
2370
               return True;
2371
            end if;
2372
 
2373
            Get_Next_Interp (I, It);
2374
         end loop;
2375
 
2376
         return False;
2377
      end if;
2378
   end Has_Compatible_Type;
2379
 
2380
   ---------------------
2381
   -- Has_Abstract_Op --
2382
   ---------------------
2383
 
2384
   function Has_Abstract_Op
2385
     (N   : Node_Id;
2386
      Typ : Entity_Id) return Entity_Id
2387
   is
2388
      I  : Interp_Index;
2389
      It : Interp;
2390
 
2391
   begin
2392
      if Is_Overloaded (N) then
2393
         Get_First_Interp (N, I, It);
2394
         while Present (It.Nam) loop
2395
            if Present (It.Abstract_Op)
2396
              and then Etype (It.Abstract_Op) = Typ
2397
            then
2398
               return It.Abstract_Op;
2399
            end if;
2400
 
2401
            Get_Next_Interp (I, It);
2402
         end loop;
2403
      end if;
2404
 
2405
      return Empty;
2406
   end Has_Abstract_Op;
2407
 
2408
   ----------
2409
   -- Hash --
2410
   ----------
2411
 
2412
   function Hash (N : Node_Id) return Int is
2413
   begin
2414
      --  Nodes have a size that is power of two, so to select significant
2415
      --  bits only we remove the low-order bits.
2416
 
2417
      return ((Int (N) / 2 ** 5) mod Header_Size);
2418
   end Hash;
2419
 
2420
   --------------
2421
   -- Hides_Op --
2422
   --------------
2423
 
2424
   function Hides_Op (F : Entity_Id; Op : Entity_Id) return Boolean is
2425
      Btyp : constant Entity_Id := Base_Type (Etype (First_Formal (F)));
2426
   begin
2427
      return Operator_Matches_Spec (Op, F)
2428
        and then (In_Open_Scopes (Scope (F))
2429
                    or else Scope (F) = Scope (Btyp)
2430
                    or else (not In_Open_Scopes (Scope (Btyp))
2431
                              and then not In_Use (Btyp)
2432
                              and then not In_Use (Scope (Btyp))));
2433
   end Hides_Op;
2434
 
2435
   ------------------------
2436
   -- Init_Interp_Tables --
2437
   ------------------------
2438
 
2439
   procedure Init_Interp_Tables is
2440
   begin
2441
      All_Interp.Init;
2442
      Interp_Map.Init;
2443
      Headers := (others => No_Entry);
2444
   end Init_Interp_Tables;
2445
 
2446
   -----------------------------------
2447
   -- Interface_Present_In_Ancestor --
2448
   -----------------------------------
2449
 
2450
   function Interface_Present_In_Ancestor
2451
     (Typ   : Entity_Id;
2452
      Iface : Entity_Id) return Boolean
2453
   is
2454
      Target_Typ : Entity_Id;
2455
      Iface_Typ  : Entity_Id;
2456
 
2457
      function Iface_Present_In_Ancestor (Typ : Entity_Id) return Boolean;
2458
      --  Returns True if Typ or some ancestor of Typ implements Iface
2459
 
2460
      -------------------------------
2461
      -- Iface_Present_In_Ancestor --
2462
      -------------------------------
2463
 
2464
      function Iface_Present_In_Ancestor (Typ : Entity_Id) return Boolean is
2465
         E    : Entity_Id;
2466
         AI   : Entity_Id;
2467
         Elmt : Elmt_Id;
2468
 
2469
      begin
2470
         if Typ = Iface_Typ then
2471
            return True;
2472
         end if;
2473
 
2474
         --  Handle private types
2475
 
2476
         if Present (Full_View (Typ))
2477
           and then not Is_Concurrent_Type (Full_View (Typ))
2478
         then
2479
            E := Full_View (Typ);
2480
         else
2481
            E := Typ;
2482
         end if;
2483
 
2484
         loop
2485
            if Present (Interfaces (E))
2486
              and then Present (Interfaces (E))
2487
              and then not Is_Empty_Elmt_List (Interfaces (E))
2488
            then
2489
               Elmt := First_Elmt (Interfaces (E));
2490
               while Present (Elmt) loop
2491
                  AI := Node (Elmt);
2492
 
2493
                  if AI = Iface_Typ or else Is_Ancestor (Iface_Typ, AI) then
2494
                     return True;
2495
                  end if;
2496
 
2497
                  Next_Elmt (Elmt);
2498
               end loop;
2499
            end if;
2500
 
2501
            exit when Etype (E) = E
2502
 
2503
               --  Handle private types
2504
 
2505
               or else (Present (Full_View (Etype (E)))
2506
                         and then Full_View (Etype (E)) = E);
2507
 
2508
            --  Check if the current type is a direct derivation of the
2509
            --  interface
2510
 
2511
            if Etype (E) = Iface_Typ then
2512
               return True;
2513
            end if;
2514
 
2515
            --  Climb to the immediate ancestor handling private types
2516
 
2517
            if Present (Full_View (Etype (E))) then
2518
               E := Full_View (Etype (E));
2519
            else
2520
               E := Etype (E);
2521
            end if;
2522
         end loop;
2523
 
2524
         return False;
2525
      end Iface_Present_In_Ancestor;
2526
 
2527
   --  Start of processing for Interface_Present_In_Ancestor
2528
 
2529
   begin
2530
      --  Iface might be a class-wide subtype, so we have to apply Base_Type
2531
 
2532
      if Is_Class_Wide_Type (Iface) then
2533
         Iface_Typ := Etype (Base_Type (Iface));
2534
      else
2535
         Iface_Typ := Iface;
2536
      end if;
2537
 
2538
      --  Handle subtypes
2539
 
2540
      Iface_Typ := Base_Type (Iface_Typ);
2541
 
2542
      if Is_Access_Type (Typ) then
2543
         Target_Typ := Etype (Directly_Designated_Type (Typ));
2544
      else
2545
         Target_Typ := Typ;
2546
      end if;
2547
 
2548
      if Is_Concurrent_Record_Type (Target_Typ) then
2549
         Target_Typ := Corresponding_Concurrent_Type (Target_Typ);
2550
      end if;
2551
 
2552
      Target_Typ := Base_Type (Target_Typ);
2553
 
2554
      --  In case of concurrent types we can't use the Corresponding Record_Typ
2555
      --  to look for the interface because it is built by the expander (and
2556
      --  hence it is not always available). For this reason we traverse the
2557
      --  list of interfaces (available in the parent of the concurrent type)
2558
 
2559
      if Is_Concurrent_Type (Target_Typ) then
2560
         if Present (Interface_List (Parent (Target_Typ))) then
2561
            declare
2562
               AI : Node_Id;
2563
 
2564
            begin
2565
               AI := First (Interface_List (Parent (Target_Typ)));
2566
               while Present (AI) loop
2567
                  if Etype (AI) = Iface_Typ then
2568
                     return True;
2569
 
2570
                  elsif Present (Interfaces (Etype (AI)))
2571
                     and then Iface_Present_In_Ancestor (Etype (AI))
2572
                  then
2573
                     return True;
2574
                  end if;
2575
 
2576
                  Next (AI);
2577
               end loop;
2578
            end;
2579
         end if;
2580
 
2581
         return False;
2582
      end if;
2583
 
2584
      if Is_Class_Wide_Type (Target_Typ) then
2585
         Target_Typ := Etype (Target_Typ);
2586
      end if;
2587
 
2588
      if Ekind (Target_Typ) = E_Incomplete_Type then
2589
         pragma Assert (Present (Non_Limited_View (Target_Typ)));
2590
         Target_Typ := Non_Limited_View (Target_Typ);
2591
 
2592
         --  Protect the frontend against previously detected errors
2593
 
2594
         if Ekind (Target_Typ) = E_Incomplete_Type then
2595
            return False;
2596
         end if;
2597
      end if;
2598
 
2599
      return Iface_Present_In_Ancestor (Target_Typ);
2600
   end Interface_Present_In_Ancestor;
2601
 
2602
   ---------------------
2603
   -- Intersect_Types --
2604
   ---------------------
2605
 
2606
   function Intersect_Types (L, R : Node_Id) return Entity_Id is
2607
      Index : Interp_Index;
2608
      It    : Interp;
2609
      Typ   : Entity_Id;
2610
 
2611
      function Check_Right_Argument (T : Entity_Id) return Entity_Id;
2612
      --  Find interpretation of right arg that has type compatible with T
2613
 
2614
      --------------------------
2615
      -- Check_Right_Argument --
2616
      --------------------------
2617
 
2618
      function Check_Right_Argument (T : Entity_Id) return Entity_Id is
2619
         Index : Interp_Index;
2620
         It    : Interp;
2621
         T2    : Entity_Id;
2622
 
2623
      begin
2624
         if not Is_Overloaded (R) then
2625
            return Specific_Type (T, Etype (R));
2626
 
2627
         else
2628
            Get_First_Interp (R, Index, It);
2629
            loop
2630
               T2 := Specific_Type (T, It.Typ);
2631
 
2632
               if T2 /= Any_Type then
2633
                  return T2;
2634
               end if;
2635
 
2636
               Get_Next_Interp (Index, It);
2637
               exit when No (It.Typ);
2638
            end loop;
2639
 
2640
            return Any_Type;
2641
         end if;
2642
      end Check_Right_Argument;
2643
 
2644
   --  Start of processing for Intersect_Types
2645
 
2646
   begin
2647
      if Etype (L) = Any_Type or else Etype (R) = Any_Type then
2648
         return Any_Type;
2649
      end if;
2650
 
2651
      if not Is_Overloaded (L) then
2652
         Typ := Check_Right_Argument (Etype (L));
2653
 
2654
      else
2655
         Typ := Any_Type;
2656
         Get_First_Interp (L, Index, It);
2657
         while Present (It.Typ) loop
2658
            Typ := Check_Right_Argument (It.Typ);
2659
            exit when Typ /= Any_Type;
2660
            Get_Next_Interp (Index, It);
2661
         end loop;
2662
 
2663
      end if;
2664
 
2665
      --  If Typ is Any_Type, it means no compatible pair of types was found
2666
 
2667
      if Typ = Any_Type then
2668
         if Nkind (Parent (L)) in N_Op then
2669
            Error_Msg_N ("incompatible types for operator", Parent (L));
2670
 
2671
         elsif Nkind (Parent (L)) = N_Range then
2672
            Error_Msg_N ("incompatible types given in constraint", Parent (L));
2673
 
2674
         --  Ada 2005 (AI-251): Complete the error notification
2675
 
2676
         elsif Is_Class_Wide_Type (Etype (R))
2677
             and then Is_Interface (Etype (Class_Wide_Type (Etype (R))))
2678
         then
2679
            Error_Msg_NE ("(Ada 2005) does not implement interface }",
2680
                          L, Etype (Class_Wide_Type (Etype (R))));
2681
 
2682
         else
2683
            Error_Msg_N ("incompatible types", Parent (L));
2684
         end if;
2685
      end if;
2686
 
2687
      return Typ;
2688
   end Intersect_Types;
2689
 
2690
   -----------------------
2691
   -- In_Generic_Actual --
2692
   -----------------------
2693
 
2694
   function In_Generic_Actual (Exp : Node_Id) return Boolean is
2695
      Par : constant Node_Id := Parent (Exp);
2696
 
2697
   begin
2698
      if No (Par) then
2699
         return False;
2700
 
2701
      elsif Nkind (Par) in N_Declaration then
2702
         if Nkind (Par) = N_Object_Declaration then
2703
            return Present (Corresponding_Generic_Association (Par));
2704
         else
2705
            return False;
2706
         end if;
2707
 
2708
      elsif Nkind (Par) = N_Object_Renaming_Declaration then
2709
         return Present (Corresponding_Generic_Association (Par));
2710
 
2711
      elsif Nkind (Par) in N_Statement_Other_Than_Procedure_Call then
2712
         return False;
2713
 
2714
      else
2715
         return In_Generic_Actual (Parent (Par));
2716
      end if;
2717
   end In_Generic_Actual;
2718
 
2719
   -----------------
2720
   -- Is_Ancestor --
2721
   -----------------
2722
 
2723
   function Is_Ancestor
2724
     (T1            : Entity_Id;
2725
      T2            : Entity_Id;
2726
      Use_Full_View : Boolean := False) return Boolean
2727
   is
2728
      BT1 : Entity_Id;
2729
      BT2 : Entity_Id;
2730
      Par : Entity_Id;
2731
 
2732
   begin
2733
      BT1 := Base_Type (T1);
2734
      BT2 := Base_Type (T2);
2735
 
2736
      --  Handle underlying view of records with unknown discriminants using
2737
      --  the original entity that motivated the construction of this
2738
      --  underlying record view (see Build_Derived_Private_Type).
2739
 
2740
      if Is_Underlying_Record_View (BT1) then
2741
         BT1 := Underlying_Record_View (BT1);
2742
      end if;
2743
 
2744
      if Is_Underlying_Record_View (BT2) then
2745
         BT2 := Underlying_Record_View (BT2);
2746
      end if;
2747
 
2748
      if BT1 = BT2 then
2749
         return True;
2750
 
2751
      --  The predicate must look past privacy
2752
 
2753
      elsif Is_Private_Type (T1)
2754
        and then Present (Full_View (T1))
2755
        and then BT2 = Base_Type (Full_View (T1))
2756
      then
2757
         return True;
2758
 
2759
      elsif Is_Private_Type (T2)
2760
        and then Present (Full_View (T2))
2761
        and then BT1 = Base_Type (Full_View (T2))
2762
      then
2763
         return True;
2764
 
2765
      else
2766
         --  Obtain the parent of the base type of T2 (use the full view if
2767
         --  allowed).
2768
 
2769
         if Use_Full_View
2770
           and then Is_Private_Type (BT2)
2771
           and then Present (Full_View (BT2))
2772
         then
2773
            --  No climbing needed if its full view is the root type
2774
 
2775
            if Full_View (BT2) = Root_Type (Full_View (BT2)) then
2776
               return False;
2777
            end if;
2778
 
2779
            Par := Etype (Full_View (BT2));
2780
 
2781
         else
2782
            Par := Etype (BT2);
2783
         end if;
2784
 
2785
         loop
2786
            --  If there was a error on the type declaration, do not recurse
2787
 
2788
            if Error_Posted (Par) then
2789
               return False;
2790
 
2791
            elsif BT1 = Base_Type (Par)
2792
              or else (Is_Private_Type (T1)
2793
                         and then Present (Full_View (T1))
2794
                         and then Base_Type (Par) = Base_Type (Full_View (T1)))
2795
            then
2796
               return True;
2797
 
2798
            elsif Is_Private_Type (Par)
2799
              and then Present (Full_View (Par))
2800
              and then Full_View (Par) = BT1
2801
            then
2802
               return True;
2803
 
2804
            --  Root type found
2805
 
2806
            elsif Par = Root_Type (Par) then
2807
               return False;
2808
 
2809
            --  Continue climbing
2810
 
2811
            else
2812
               --  Use the full-view of private types (if allowed)
2813
 
2814
               if Use_Full_View
2815
                 and then Is_Private_Type (Par)
2816
                 and then Present (Full_View (Par))
2817
               then
2818
                  Par := Etype (Full_View (Par));
2819
               else
2820
                  Par := Etype (Par);
2821
               end if;
2822
            end if;
2823
         end loop;
2824
      end if;
2825
   end Is_Ancestor;
2826
 
2827
   ---------------------------
2828
   -- Is_Invisible_Operator --
2829
   ---------------------------
2830
 
2831
   function Is_Invisible_Operator
2832
     (N : Node_Id;
2833
      T : Entity_Id) return Boolean
2834
   is
2835
      Orig_Node : constant Node_Id := Original_Node (N);
2836
 
2837
   begin
2838
      if Nkind (N) not in N_Op then
2839
         return False;
2840
 
2841
      elsif not Comes_From_Source (N) then
2842
         return False;
2843
 
2844
      elsif No (Universal_Interpretation (Right_Opnd (N))) then
2845
         return False;
2846
 
2847
      elsif Nkind (N) in N_Binary_Op
2848
        and then No (Universal_Interpretation (Left_Opnd (N)))
2849
      then
2850
         return False;
2851
 
2852
      else
2853
         return Is_Numeric_Type (T)
2854
           and then not In_Open_Scopes (Scope (T))
2855
           and then not Is_Potentially_Use_Visible (T)
2856
           and then not In_Use (T)
2857
           and then not In_Use (Scope (T))
2858
           and then
2859
            (Nkind (Orig_Node) /= N_Function_Call
2860
              or else Nkind (Name (Orig_Node)) /= N_Expanded_Name
2861
              or else Entity (Prefix (Name (Orig_Node))) /= Scope (T))
2862
           and then not In_Instance;
2863
      end if;
2864
   end Is_Invisible_Operator;
2865
 
2866
   --------------------
2867
   --  Is_Progenitor --
2868
   --------------------
2869
 
2870
   function Is_Progenitor
2871
     (Iface : Entity_Id;
2872
      Typ   : Entity_Id) return Boolean
2873
   is
2874
   begin
2875
      return Implements_Interface (Typ, Iface, Exclude_Parents => True);
2876
   end Is_Progenitor;
2877
 
2878
   -------------------
2879
   -- Is_Subtype_Of --
2880
   -------------------
2881
 
2882
   function Is_Subtype_Of (T1 : Entity_Id; T2 : Entity_Id) return Boolean is
2883
      S : Entity_Id;
2884
 
2885
   begin
2886
      S := Ancestor_Subtype (T1);
2887
      while Present (S) loop
2888
         if S = T2 then
2889
            return True;
2890
         else
2891
            S := Ancestor_Subtype (S);
2892
         end if;
2893
      end loop;
2894
 
2895
      return False;
2896
   end Is_Subtype_Of;
2897
 
2898
   ------------------
2899
   -- List_Interps --
2900
   ------------------
2901
 
2902
   procedure List_Interps (Nam : Node_Id; Err : Node_Id) is
2903
      Index : Interp_Index;
2904
      It    : Interp;
2905
 
2906
   begin
2907
      Get_First_Interp (Nam, Index, It);
2908
      while Present (It.Nam) loop
2909
         if Scope (It.Nam) = Standard_Standard
2910
           and then Scope (It.Typ) /= Standard_Standard
2911
         then
2912
            Error_Msg_Sloc := Sloc (Parent (It.Typ));
2913
            Error_Msg_NE ("\\& (inherited) declared#!", Err, It.Nam);
2914
 
2915
         else
2916
            Error_Msg_Sloc := Sloc (It.Nam);
2917
            Error_Msg_NE ("\\& declared#!", Err, It.Nam);
2918
         end if;
2919
 
2920
         Get_Next_Interp (Index, It);
2921
      end loop;
2922
   end List_Interps;
2923
 
2924
   -----------------
2925
   -- New_Interps --
2926
   -----------------
2927
 
2928
   procedure New_Interps (N : Node_Id)  is
2929
      Map_Ptr : Int;
2930
 
2931
   begin
2932
      All_Interp.Append (No_Interp);
2933
 
2934
      Map_Ptr := Headers (Hash (N));
2935
 
2936
      if Map_Ptr = No_Entry then
2937
 
2938
         --  Place new node at end of table
2939
 
2940
         Interp_Map.Increment_Last;
2941
         Headers (Hash (N)) := Interp_Map.Last;
2942
 
2943
      else
2944
         --   Place node at end of chain, or locate its previous entry
2945
 
2946
         loop
2947
            if Interp_Map.Table (Map_Ptr).Node = N then
2948
 
2949
               --  Node is already in the table, and is being rewritten.
2950
               --  Start a new interp section, retain hash link.
2951
 
2952
               Interp_Map.Table (Map_Ptr).Node  := N;
2953
               Interp_Map.Table (Map_Ptr).Index := All_Interp.Last;
2954
               Set_Is_Overloaded (N, True);
2955
               return;
2956
 
2957
            else
2958
               exit when Interp_Map.Table (Map_Ptr).Next = No_Entry;
2959
               Map_Ptr := Interp_Map.Table (Map_Ptr).Next;
2960
            end if;
2961
         end loop;
2962
 
2963
         --  Chain the new node
2964
 
2965
         Interp_Map.Increment_Last;
2966
         Interp_Map.Table (Map_Ptr).Next := Interp_Map.Last;
2967
      end if;
2968
 
2969
      Interp_Map.Table (Interp_Map.Last) := (N, All_Interp.Last, No_Entry);
2970
      Set_Is_Overloaded (N, True);
2971
   end New_Interps;
2972
 
2973
   ---------------------------
2974
   -- Operator_Matches_Spec --
2975
   ---------------------------
2976
 
2977
   function Operator_Matches_Spec (Op, New_S : Entity_Id) return Boolean is
2978
      Op_Name : constant Name_Id   := Chars (Op);
2979
      T       : constant Entity_Id := Etype (New_S);
2980
      New_F   : Entity_Id;
2981
      Old_F   : Entity_Id;
2982
      Num     : Int;
2983
      T1      : Entity_Id;
2984
      T2      : Entity_Id;
2985
 
2986
   begin
2987
      --  To verify that a predefined operator matches a given signature,
2988
      --  do a case analysis of the operator classes. Function can have one
2989
      --  or two formals and must have the proper result type.
2990
 
2991
      New_F := First_Formal (New_S);
2992
      Old_F := First_Formal (Op);
2993
      Num := 0;
2994
      while Present (New_F) and then Present (Old_F) loop
2995
         Num := Num + 1;
2996
         Next_Formal (New_F);
2997
         Next_Formal (Old_F);
2998
      end loop;
2999
 
3000
      --  Definite mismatch if different number of parameters
3001
 
3002
      if Present (Old_F) or else Present (New_F) then
3003
         return False;
3004
 
3005
      --  Unary operators
3006
 
3007
      elsif Num = 1 then
3008
         T1 := Etype (First_Formal (New_S));
3009
 
3010
         if Op_Name = Name_Op_Subtract
3011
           or else Op_Name = Name_Op_Add
3012
           or else Op_Name = Name_Op_Abs
3013
         then
3014
            return Base_Type (T1) = Base_Type (T)
3015
              and then Is_Numeric_Type (T);
3016
 
3017
         elsif Op_Name = Name_Op_Not then
3018
            return Base_Type (T1) = Base_Type (T)
3019
              and then Valid_Boolean_Arg (Base_Type (T));
3020
 
3021
         else
3022
            return False;
3023
         end if;
3024
 
3025
      --  Binary operators
3026
 
3027
      else
3028
         T1 := Etype (First_Formal (New_S));
3029
         T2 := Etype (Next_Formal (First_Formal (New_S)));
3030
 
3031
         if Op_Name =  Name_Op_And or else Op_Name = Name_Op_Or
3032
           or else Op_Name = Name_Op_Xor
3033
         then
3034
            return Base_Type (T1) = Base_Type (T2)
3035
              and then Base_Type (T1) = Base_Type (T)
3036
              and then Valid_Boolean_Arg (Base_Type (T));
3037
 
3038
         elsif Op_Name = Name_Op_Eq or else Op_Name = Name_Op_Ne then
3039
            return Base_Type (T1) = Base_Type (T2)
3040
              and then not Is_Limited_Type (T1)
3041
              and then Is_Boolean_Type (T);
3042
 
3043
         elsif Op_Name = Name_Op_Lt or else Op_Name = Name_Op_Le
3044
           or else Op_Name = Name_Op_Gt or else Op_Name = Name_Op_Ge
3045
         then
3046
            return Base_Type (T1) = Base_Type (T2)
3047
              and then Valid_Comparison_Arg (T1)
3048
              and then Is_Boolean_Type (T);
3049
 
3050
         elsif Op_Name = Name_Op_Add or else Op_Name = Name_Op_Subtract then
3051
            return Base_Type (T1) = Base_Type (T2)
3052
              and then Base_Type (T1) = Base_Type (T)
3053
              and then Is_Numeric_Type (T);
3054
 
3055
         --  For division and multiplication, a user-defined function does not
3056
         --  match the predefined universal_fixed operation, except in Ada 83.
3057
 
3058
         elsif Op_Name = Name_Op_Divide then
3059
            return (Base_Type (T1) = Base_Type (T2)
3060
              and then Base_Type (T1) = Base_Type (T)
3061
              and then Is_Numeric_Type (T)
3062
              and then (not Is_Fixed_Point_Type (T)
3063
                         or else Ada_Version = Ada_83))
3064
 
3065
            --  Mixed_Mode operations on fixed-point types
3066
 
3067
              or else (Base_Type (T1) = Base_Type (T)
3068
                        and then Base_Type (T2) = Base_Type (Standard_Integer)
3069
                        and then Is_Fixed_Point_Type (T))
3070
 
3071
            --  A user defined operator can also match (and hide) a mixed
3072
            --  operation on universal literals.
3073
 
3074
              or else (Is_Integer_Type (T2)
3075
                        and then Is_Floating_Point_Type (T1)
3076
                        and then Base_Type (T1) = Base_Type (T));
3077
 
3078
         elsif Op_Name = Name_Op_Multiply then
3079
            return (Base_Type (T1) = Base_Type (T2)
3080
              and then Base_Type (T1) = Base_Type (T)
3081
              and then Is_Numeric_Type (T)
3082
              and then (not Is_Fixed_Point_Type (T)
3083
                         or else Ada_Version = Ada_83))
3084
 
3085
            --  Mixed_Mode operations on fixed-point types
3086
 
3087
              or else (Base_Type (T1) = Base_Type (T)
3088
                        and then Base_Type (T2) = Base_Type (Standard_Integer)
3089
                        and then Is_Fixed_Point_Type (T))
3090
 
3091
              or else (Base_Type (T2) = Base_Type (T)
3092
                        and then Base_Type (T1) = Base_Type (Standard_Integer)
3093
                        and then Is_Fixed_Point_Type (T))
3094
 
3095
              or else (Is_Integer_Type (T2)
3096
                        and then Is_Floating_Point_Type (T1)
3097
                        and then Base_Type (T1) = Base_Type (T))
3098
 
3099
              or else (Is_Integer_Type (T1)
3100
                        and then Is_Floating_Point_Type (T2)
3101
                        and then Base_Type (T2) = Base_Type (T));
3102
 
3103
         elsif Op_Name = Name_Op_Mod or else Op_Name = Name_Op_Rem then
3104
            return Base_Type (T1) = Base_Type (T2)
3105
              and then Base_Type (T1) = Base_Type (T)
3106
              and then Is_Integer_Type (T);
3107
 
3108
         elsif Op_Name = Name_Op_Expon then
3109
            return Base_Type (T1) = Base_Type (T)
3110
              and then Is_Numeric_Type (T)
3111
              and then Base_Type (T2) = Base_Type (Standard_Integer);
3112
 
3113
         elsif Op_Name = Name_Op_Concat then
3114
            return Is_Array_Type (T)
3115
              and then (Base_Type (T) = Base_Type (Etype (Op)))
3116
              and then (Base_Type (T1) = Base_Type (T)
3117
                         or else
3118
                        Base_Type (T1) = Base_Type (Component_Type (T)))
3119
              and then (Base_Type (T2) = Base_Type (T)
3120
                         or else
3121
                        Base_Type (T2) = Base_Type (Component_Type (T)));
3122
 
3123
         else
3124
            return False;
3125
         end if;
3126
      end if;
3127
   end Operator_Matches_Spec;
3128
 
3129
   -------------------
3130
   -- Remove_Interp --
3131
   -------------------
3132
 
3133
   procedure Remove_Interp (I : in out Interp_Index) is
3134
      II : Interp_Index;
3135
 
3136
   begin
3137
      --  Find end of interp list and copy downward to erase the discarded one
3138
 
3139
      II := I + 1;
3140
      while Present (All_Interp.Table (II).Typ) loop
3141
         II := II + 1;
3142
      end loop;
3143
 
3144
      for J in I + 1 .. II loop
3145
         All_Interp.Table (J - 1) := All_Interp.Table (J);
3146
      end loop;
3147
 
3148
      --  Back up interp index to insure that iterator will pick up next
3149
      --  available interpretation.
3150
 
3151
      I := I - 1;
3152
   end Remove_Interp;
3153
 
3154
   ------------------
3155
   -- Save_Interps --
3156
   ------------------
3157
 
3158
   procedure Save_Interps (Old_N : Node_Id; New_N : Node_Id) is
3159
      Map_Ptr : Int;
3160
      O_N     : Node_Id := Old_N;
3161
 
3162
   begin
3163
      if Is_Overloaded (Old_N) then
3164
         if Nkind (Old_N) = N_Selected_Component
3165
           and then Is_Overloaded (Selector_Name (Old_N))
3166
         then
3167
            O_N := Selector_Name (Old_N);
3168
         end if;
3169
 
3170
         Map_Ptr := Headers (Hash (O_N));
3171
 
3172
         while Interp_Map.Table (Map_Ptr).Node /= O_N loop
3173
            Map_Ptr := Interp_Map.Table (Map_Ptr).Next;
3174
            pragma Assert (Map_Ptr /= No_Entry);
3175
         end loop;
3176
 
3177
         New_Interps (New_N);
3178
         Interp_Map.Table (Interp_Map.Last).Index :=
3179
           Interp_Map.Table (Map_Ptr).Index;
3180
      end if;
3181
   end Save_Interps;
3182
 
3183
   -------------------
3184
   -- Specific_Type --
3185
   -------------------
3186
 
3187
   function Specific_Type (Typ_1, Typ_2 : Entity_Id) return Entity_Id is
3188
      T1 : constant Entity_Id := Available_View (Typ_1);
3189
      T2 : constant Entity_Id := Available_View (Typ_2);
3190
      B1 : constant Entity_Id := Base_Type (T1);
3191
      B2 : constant Entity_Id := Base_Type (T2);
3192
 
3193
      function Is_Remote_Access (T : Entity_Id) return Boolean;
3194
      --  Check whether T is the equivalent type of a remote access type.
3195
      --  If distribution is enabled, T is a legal context for Null.
3196
 
3197
      ----------------------
3198
      -- Is_Remote_Access --
3199
      ----------------------
3200
 
3201
      function Is_Remote_Access (T : Entity_Id) return Boolean is
3202
      begin
3203
         return Is_Record_Type (T)
3204
           and then (Is_Remote_Call_Interface (T)
3205
                      or else Is_Remote_Types (T))
3206
           and then Present (Corresponding_Remote_Type (T))
3207
           and then Is_Access_Type (Corresponding_Remote_Type (T));
3208
      end Is_Remote_Access;
3209
 
3210
   --  Start of processing for Specific_Type
3211
 
3212
   begin
3213
      if T1 = Any_Type or else T2 = Any_Type then
3214
         return Any_Type;
3215
      end if;
3216
 
3217
      if B1 = B2 then
3218
         return B1;
3219
 
3220
      elsif     (T1 = Universal_Integer and then Is_Integer_Type (T2))
3221
        or else (T1 = Universal_Real    and then Is_Real_Type (T2))
3222
        or else (T1 = Universal_Fixed   and then Is_Fixed_Point_Type (T2))
3223
        or else (T1 = Any_Fixed         and then Is_Fixed_Point_Type (T2))
3224
      then
3225
         return B2;
3226
 
3227
      elsif     (T2 = Universal_Integer and then Is_Integer_Type (T1))
3228
        or else (T2 = Universal_Real    and then Is_Real_Type (T1))
3229
        or else (T2 = Universal_Fixed   and then Is_Fixed_Point_Type (T1))
3230
        or else (T2 = Any_Fixed         and then Is_Fixed_Point_Type (T1))
3231
      then
3232
         return B1;
3233
 
3234
      elsif T2 = Any_String and then Is_String_Type (T1) then
3235
         return B1;
3236
 
3237
      elsif T1 = Any_String and then Is_String_Type (T2) then
3238
         return B2;
3239
 
3240
      elsif T2 = Any_Character and then Is_Character_Type (T1) then
3241
         return B1;
3242
 
3243
      elsif T1 = Any_Character and then Is_Character_Type (T2) then
3244
         return B2;
3245
 
3246
      elsif T1 = Any_Access
3247
        and then (Is_Access_Type (T2) or else Is_Remote_Access (T2))
3248
      then
3249
         return T2;
3250
 
3251
      elsif T2 = Any_Access
3252
        and then (Is_Access_Type (T1) or else Is_Remote_Access (T1))
3253
      then
3254
         return T1;
3255
 
3256
      --  In an instance, the specific type may have a private view. Use full
3257
      --  view to check legality.
3258
 
3259
      elsif T2 = Any_Access
3260
        and then Is_Private_Type (T1)
3261
        and then Present (Full_View (T1))
3262
        and then Is_Access_Type (Full_View (T1))
3263
        and then In_Instance
3264
      then
3265
         return T1;
3266
 
3267
      elsif T2 = Any_Composite
3268
        and then Is_Aggregate_Type (T1)
3269
      then
3270
         return T1;
3271
 
3272
      elsif T1 = Any_Composite
3273
        and then Is_Aggregate_Type (T2)
3274
      then
3275
         return T2;
3276
 
3277
      elsif T1 = Any_Modular and then Is_Modular_Integer_Type (T2) then
3278
         return T2;
3279
 
3280
      elsif T2 = Any_Modular and then Is_Modular_Integer_Type (T1) then
3281
         return T1;
3282
 
3283
      --  ----------------------------------------------------------
3284
      --  Special cases for equality operators (all other predefined
3285
      --  operators can never apply to tagged types)
3286
      --  ----------------------------------------------------------
3287
 
3288
      --  Ada 2005 (AI-251): T1 and T2 are class-wide types, and T2 is an
3289
      --  interface
3290
 
3291
      elsif Is_Class_Wide_Type (T1)
3292
        and then Is_Class_Wide_Type (T2)
3293
        and then Is_Interface (Etype (T2))
3294
      then
3295
         return T1;
3296
 
3297
      --  Ada 2005 (AI-251): T1 is a concrete type that implements the
3298
      --  class-wide interface T2
3299
 
3300
      elsif Is_Class_Wide_Type (T2)
3301
        and then Is_Interface (Etype (T2))
3302
        and then Interface_Present_In_Ancestor (Typ => T1,
3303
                                                Iface => Etype (T2))
3304
      then
3305
         return T1;
3306
 
3307
      elsif Is_Class_Wide_Type (T1)
3308
        and then Is_Ancestor (Root_Type (T1), T2)
3309
      then
3310
         return T1;
3311
 
3312
      elsif Is_Class_Wide_Type (T2)
3313
        and then Is_Ancestor (Root_Type (T2), T1)
3314
      then
3315
         return T2;
3316
 
3317
      elsif (Ekind (B1) = E_Access_Subprogram_Type
3318
               or else
3319
             Ekind (B1) = E_Access_Protected_Subprogram_Type)
3320
        and then Ekind (Designated_Type (B1)) /= E_Subprogram_Type
3321
        and then Is_Access_Type (T2)
3322
      then
3323
         return T2;
3324
 
3325
      elsif (Ekind (B2) = E_Access_Subprogram_Type
3326
               or else
3327
             Ekind (B2) = E_Access_Protected_Subprogram_Type)
3328
        and then Ekind (Designated_Type (B2)) /= E_Subprogram_Type
3329
        and then Is_Access_Type (T1)
3330
      then
3331
         return T1;
3332
 
3333
      elsif (Ekind (T1) = E_Allocator_Type
3334
              or else Ekind (T1) = E_Access_Attribute_Type
3335
              or else Ekind (T1) = E_Anonymous_Access_Type)
3336
        and then Is_Access_Type (T2)
3337
      then
3338
         return T2;
3339
 
3340
      elsif (Ekind (T2) = E_Allocator_Type
3341
              or else Ekind (T2) = E_Access_Attribute_Type
3342
              or else Ekind (T2) = E_Anonymous_Access_Type)
3343
        and then Is_Access_Type (T1)
3344
      then
3345
         return T1;
3346
 
3347
      --  If none of the above cases applies, types are not compatible
3348
 
3349
      else
3350
         return Any_Type;
3351
      end if;
3352
   end Specific_Type;
3353
 
3354
   ---------------------
3355
   -- Set_Abstract_Op --
3356
   ---------------------
3357
 
3358
   procedure Set_Abstract_Op (I : Interp_Index; V : Entity_Id) is
3359
   begin
3360
      All_Interp.Table (I).Abstract_Op := V;
3361
   end Set_Abstract_Op;
3362
 
3363
   -----------------------
3364
   -- Valid_Boolean_Arg --
3365
   -----------------------
3366
 
3367
   --  In addition to booleans and arrays of booleans, we must include
3368
   --  aggregates as valid boolean arguments, because in the first pass of
3369
   --  resolution their components are not examined. If it turns out not to be
3370
   --  an aggregate of booleans, this will be diagnosed in Resolve.
3371
   --  Any_Composite must be checked for prior to the array type checks because
3372
   --  Any_Composite does not have any associated indexes.
3373
 
3374
   function Valid_Boolean_Arg (T : Entity_Id) return Boolean is
3375
   begin
3376
      if Is_Boolean_Type (T)
3377
        or else Is_Modular_Integer_Type (T)
3378
        or else T = Universal_Integer
3379
        or else T = Any_Composite
3380
      then
3381
         return True;
3382
 
3383
      elsif Is_Array_Type (T)
3384
        and then T /= Any_String
3385
        and then Number_Dimensions (T) = 1
3386
        and then Is_Boolean_Type (Component_Type (T))
3387
        and then
3388
         ((not Is_Private_Composite (T)
3389
            and then not Is_Limited_Composite (T))
3390
           or else In_Instance
3391
           or else Available_Full_View_Of_Component (T))
3392
      then
3393
         return True;
3394
 
3395
      else
3396
         return False;
3397
      end if;
3398
   end Valid_Boolean_Arg;
3399
 
3400
   --------------------------
3401
   -- Valid_Comparison_Arg --
3402
   --------------------------
3403
 
3404
   function Valid_Comparison_Arg (T : Entity_Id) return Boolean is
3405
   begin
3406
 
3407
      if T = Any_Composite then
3408
         return False;
3409
 
3410
      elsif Is_Discrete_Type (T)
3411
        or else Is_Real_Type (T)
3412
      then
3413
         return True;
3414
 
3415
      elsif Is_Array_Type (T)
3416
          and then Number_Dimensions (T) = 1
3417
          and then Is_Discrete_Type (Component_Type (T))
3418
          and then (not Is_Private_Composite (T)
3419
                     or else In_Instance)
3420
          and then (not Is_Limited_Composite (T)
3421
                     or else In_Instance)
3422
      then
3423
         return True;
3424
 
3425
      elsif Is_Array_Type (T)
3426
        and then Number_Dimensions (T) = 1
3427
        and then Is_Discrete_Type (Component_Type (T))
3428
        and then Available_Full_View_Of_Component (T)
3429
      then
3430
         return True;
3431
 
3432
      elsif Is_String_Type (T) then
3433
         return True;
3434
      else
3435
         return False;
3436
      end if;
3437
   end Valid_Comparison_Arg;
3438
 
3439
   ------------------
3440
   -- Write_Interp --
3441
   ------------------
3442
 
3443
   procedure Write_Interp (It : Interp) is
3444
   begin
3445
      Write_Str ("Nam: ");
3446
      Print_Tree_Node (It.Nam);
3447
      Write_Str ("Typ: ");
3448
      Print_Tree_Node (It.Typ);
3449
      Write_Str ("Abstract_Op: ");
3450
      Print_Tree_Node (It.Abstract_Op);
3451
   end Write_Interp;
3452
 
3453
   ----------------------
3454
   -- Write_Interp_Ref --
3455
   ----------------------
3456
 
3457
   procedure Write_Interp_Ref (Map_Ptr : Int) is
3458
   begin
3459
      Write_Str (" Node:  ");
3460
      Write_Int (Int (Interp_Map.Table (Map_Ptr).Node));
3461
      Write_Str (" Index: ");
3462
      Write_Int (Int (Interp_Map.Table (Map_Ptr).Index));
3463
      Write_Str (" Next:  ");
3464
      Write_Int (Interp_Map.Table (Map_Ptr).Next);
3465
      Write_Eol;
3466
   end Write_Interp_Ref;
3467
 
3468
   ---------------------
3469
   -- Write_Overloads --
3470
   ---------------------
3471
 
3472
   procedure Write_Overloads (N : Node_Id) is
3473
      I   : Interp_Index;
3474
      It  : Interp;
3475
      Nam : Entity_Id;
3476
 
3477
   begin
3478
      Write_Str ("Overloads: ");
3479
      Print_Node_Briefly (N);
3480
 
3481
      if Nkind (N) not in N_Has_Entity then
3482
         return;
3483
      end if;
3484
 
3485
      if not Is_Overloaded (N) then
3486
         Write_Str ("Non-overloaded entity ");
3487
         Write_Eol;
3488
         Write_Entity_Info (Entity (N), " ");
3489
 
3490
      else
3491
         Get_First_Interp (N, I, It);
3492
         Write_Str ("Overloaded entity ");
3493
         Write_Eol;
3494
         Write_Str ("      Name           Type           Abstract Op");
3495
         Write_Eol;
3496
         Write_Str ("===============================================");
3497
         Write_Eol;
3498
         Nam := It.Nam;
3499
 
3500
         while Present (Nam) loop
3501
            Write_Int (Int (Nam));
3502
            Write_Str ("   ");
3503
            Write_Name (Chars (Nam));
3504
            Write_Str ("   ");
3505
            Write_Int (Int (It.Typ));
3506
            Write_Str ("   ");
3507
            Write_Name (Chars (It.Typ));
3508
 
3509
            if Present (It.Abstract_Op) then
3510
               Write_Str ("   ");
3511
               Write_Int (Int (It.Abstract_Op));
3512
               Write_Str ("   ");
3513
               Write_Name (Chars (It.Abstract_Op));
3514
            end if;
3515
 
3516
            Write_Eol;
3517
            Get_Next_Interp (I, It);
3518
            Nam := It.Nam;
3519
         end loop;
3520
      end if;
3521
   end Write_Overloads;
3522
 
3523
end Sem_Type;

powered by: WebSVN 2.1.0

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