Commit | Line | Data |
---|---|---|
9bf86ebb PR |
1 | /* Variables and structures for overloading rules. |
2 | Copyright (C) 1993 Free Software Foundation, Inc. | |
3 | ||
4 | This file is part of GNU CC. | |
5 | ||
6 | GNU CC is free software; you can redistribute it and/or modify | |
7 | it under the terms of the GNU General Public License as published by | |
8 | the Free Software Foundation; either version 2, or (at your option) | |
9 | any later version. | |
10 | ||
11 | GNU CC is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
17 | along with GNU CC; see the file COPYING. If not, write to | |
18 | the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
19 | ||
20 | /* The following structure is used when comparing various alternatives | |
21 | for overloading. The unsigned quantity `strikes.i' is used | |
22 | for fast comparison of two possibilities. This number is an | |
23 | aggregate of four constituents: | |
24 | ||
25 | EVIL: if this is non-zero, then the candidate should not be considered | |
26 | ELLIPSIS: if this is non-zero, then some actual argument has been matched | |
27 | against an ellipsis | |
28 | USER: if this is non-zero, then a user-defined type conversion is needed | |
29 | B_OR_D: if this is non-zero, then use a base pointer instead of the | |
30 | type of the pointer we started with. | |
31 | EASY: if this is non-zero, then we have a builtin conversion | |
32 | (such as int to long, int to float, etc) to do. | |
33 | ||
34 | If two candidates require user-defined type conversions, and the | |
35 | type conversions are not identical, then an ambiguity error | |
36 | is reported. | |
37 | ||
38 | If two candidates agree on user-defined type conversions, | |
39 | and one uses pointers of strictly higher type (derived where | |
40 | another uses base), then that alternative is silently chosen. | |
41 | ||
42 | If two candidates have a non-monotonic derived/base pointer | |
43 | relationship, and/or a non-monotonic easy conversion relationship, | |
44 | then a warning is emitted to show which paths are possible, and | |
45 | which one is being chosen. | |
46 | ||
47 | For example: | |
48 | ||
49 | int i; | |
50 | double x; | |
51 | ||
52 | overload f; | |
53 | int f (int, int); | |
54 | double f (double, double); | |
55 | ||
56 | f (i, x); // draws a warning | |
57 | ||
58 | struct B | |
59 | { | |
60 | f (int); | |
61 | } *bb; | |
62 | struct D : B | |
63 | { | |
64 | f (double); | |
65 | } *dd; | |
66 | ||
67 | dd->f (x); // exact match | |
68 | dd->f (i); // draws warning | |
69 | ||
70 | Note that this technique really only works for 255 arguments. Perhaps | |
71 | this is not enough. */ | |
72 | ||
73 | struct candidate | |
74 | { | |
75 | tree function; /* A FUNCTION_DECL */ | |
76 | ||
77 | unsigned char evil; /* !0 if this will never convert. */ | |
78 | unsigned char ellipsis; /* !0 if a match against an ellipsis occurred */ | |
79 | unsigned char user; /* !0 if at least one user-defined type conv. */ | |
80 | unsigned short b_or_d; /* count number of derived->base or | |
81 | base->derived conv. */ | |
82 | unsigned short easy; /* count number of builtin type conv. */ | |
83 | tree arg; /* first parm to function. */ | |
84 | unsigned short *harshness; /* Indexed by argument number, encodes | |
85 | evil, user, d_to_b, and easy strikes for | |
86 | that argument. | |
87 | At end of array, we store the index+1 | |
88 | of where we started using default | |
89 | parameters, or 0 if there are none. */ | |
90 | union | |
91 | { | |
92 | tree field; /* If no evil strikes, the FUNCTION_DECL of | |
93 | the function (if a member function). */ | |
94 | int bad_arg; /* the index of the first bad argument: | |
95 | 0 if no bad arguments | |
96 | > 0 is first bad argument | |
97 | -1 if extra actual arguments | |
98 | -2 if too few actual arguments. | |
99 | -3 if const/non const method mismatch. | |
100 | -4 if type unification failed. | |
101 | -5 if contravariance violation. */ | |
102 | } u; | |
103 | }; | |
104 | int rank_for_overload (); | |
105 | ||
106 | /* Variables shared between cp-class.c and cp-call.c. */ | |
107 | ||
108 | extern int n_vtables; | |
109 | extern int n_vtable_entries; | |
110 | extern int n_vtable_searches; | |
111 | extern int n_vtable_elems; | |
112 | extern int n_convert_harshness; | |
113 | extern int n_compute_conversion_costs; | |
114 | extern int n_build_method_call; | |
115 | extern int n_inner_fields_searched; |