|
|
1.1 root 1: /* Functions related to invoking methods and overloaded functions.
2: Copyright (C) 1987, 1992 Free Software Foundation, Inc.
3: Contributed by Michael Tiemann ([email protected])
4:
5: This file is part of GNU CC.
6:
7: GNU CC is free software; you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation; either version 2, or (at your option)
10: any later version.
11:
12: GNU CC is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with GNU CC; see the file COPYING. If not, write to
19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20:
21:
22: /* High-level class interface. */
23:
24: #include "config.h"
25: #include "tree.h"
26: #include <stdio.h>
27: #include "cp-tree.h"
28: #include "flags.h"
29: #include "assert.h"
30: #include "cp-class.h"
31:
32: #include "obstack.h"
33: #define obstack_chunk_alloc xmalloc
34: #define obstack_chunk_free free
35:
36: extern int xmalloc ();
37: extern void free ();
38:
39: /* See cp-decl.c for comment of this variable. */
40: extern int flag_int_enum_equivalence;
41:
42: /* Compute the ease with which a conversion can be performed
43: between an expected and the given type. */
44: static int convert_harshness ();
45:
46: #define EVIL_HARSHNESS(ARG) ((ARG) & 1)
47: #define USER_HARSHNESS(ARG) ((ARG) & 2)
48: #define CONTRAVARIANT_HARSHNESS(ARG) ((ARG) & 4)
49: #define BASE_DERIVED_HARSHNESS(ARG) ((ARG) & 8)
50: #define INT_TO_BD_HARSHNESS(ARG) (((ARG) << 4) | 8)
51: #define INT_FROM_BD_HARSHNESS(ARG) ((ARG) >> 4)
52: #define INT_TO_EASY_HARSHNESS(ARG) ((ARG) << 4)
53: #define INT_FROM_EASY_HARSHNESS(ARG) ((ARG) >> 4)
54: #define ONLY_EASY_HARSHNESS(ARG) (((ARG) & 15) == 0)
55: #define CONST_HARSHNESS(ARG) ((ARG) & 1024)
56:
57: /* Ordering function for overload resolution. */
58: int
59: rank_for_overload (x, y)
60: struct candidate *x, *y;
61: {
62: if (y->evil - x->evil)
63: return y->evil - x->evil;
64: if (CONST_HARSHNESS (y->harshness[0]) ^ CONST_HARSHNESS (x->harshness[0]))
65: return y->harshness[0] - x->harshness[0];
66: if (y->user - x->user)
67: return y->user - x->user;
68: if (y->b_or_d - x->b_or_d)
69: return y->b_or_d - x->b_or_d;
70: return y->easy - x->easy;
71: }
72:
73: /* TYPE is the type we wish to convert to. PARM is the parameter
74: we have to work with. We use a somewhat arbitrary cost function
75: to measure this conversion. */
76: static int
77: convert_harshness (type, parmtype, parm)
78: register tree type, parmtype;
79: tree parm;
80: {
81: register enum tree_code codel = TREE_CODE (type);
82: register enum tree_code coder = TREE_CODE (parmtype);
83:
84: #ifdef GATHER_STATISTICS
85: n_convert_harshness++;
86: #endif
87:
88: if (TYPE_MAIN_VARIANT (parmtype) == TYPE_MAIN_VARIANT (type))
89: return 0;
90:
91: if (coder == ERROR_MARK)
92: return 1;
93:
94: if (codel == POINTER_TYPE
95: && (coder == METHOD_TYPE || coder == FUNCTION_TYPE))
96: {
97: tree p1, p2;
98: int harshness, new_harshness;
99:
100: /* Get to the METHOD_TYPE or FUNCTION_TYPE that this might be. */
101: type = TREE_TYPE (type);
102:
103: if (coder != TREE_CODE (type))
104: return 1;
105:
106: harshness = 0;
107:
108: /* We allow the default conversion between function type
109: and pointer-to-function type for free. */
110: if (type == parmtype)
111: return 0;
112:
113: /* Compare return types. */
114: p1 = TREE_TYPE (type);
115: p2 = TREE_TYPE (parmtype);
116: new_harshness = convert_harshness (p1, p2, 0);
117: if (new_harshness & 1)
118: return 1;
119:
120: if (BASE_DERIVED_HARSHNESS (new_harshness))
121: {
122: tree binfo;
123:
124: /* This only works for pointers. */
125: if (TREE_CODE (p1) != POINTER_TYPE
126: && TREE_CODE (p1) != REFERENCE_TYPE)
127: return 1;
128:
129: p1 = TREE_TYPE (p1);
130: p2 = TREE_TYPE (p2);
131: if (CONTRAVARIANT_HARSHNESS (new_harshness))
132: binfo = get_binfo (p2, p1, 0);
133: else
134: binfo = get_binfo (p1, p2, 0);
135:
136: if (! BINFO_OFFSET_ZEROP (binfo))
137: {
138: static int explained;
139: extern void sorry ();
140: if (CONTRAVARIANT_HARSHNESS (new_harshness))
141: message_2_types (sorry, "cannot cast `%d' to `%d' at function call site", p2, p1);
142: else
143: message_2_types (sorry, "cannot cast `%d' to `%d' at function call site", p1, p2);
144:
145: if (! explained++)
146: sorry ("(because pointer values change during conversion)");
147: return 1;
148: }
149: }
150:
151: harshness |= new_harshness;
152:
153: p1 = TYPE_ARG_TYPES (type);
154: p2 = TYPE_ARG_TYPES (parmtype);
155: while (p1 && p2)
156: {
157: new_harshness = convert_harshness (TREE_VALUE (p1), TREE_VALUE (p2), 0);
158: if (EVIL_HARSHNESS (new_harshness))
159: return 1;
160:
161: if (BASE_DERIVED_HARSHNESS (new_harshness))
162: {
163: /* This only works for pointers and references. */
164: if (TREE_CODE (TREE_VALUE (p1)) != POINTER_TYPE
165: && TREE_CODE (TREE_VALUE (p1)) != REFERENCE_TYPE)
166: return 1;
167: new_harshness ^= CONTRAVARIANT_HARSHNESS (new_harshness);
168: harshness |= new_harshness;
169: }
170: /* This trick allows use to accumulate easy type
171: conversions without messing up the bits that encode
172: info about more involved things. */
173: else if (ONLY_EASY_HARSHNESS (new_harshness))
174: harshness += new_harshness;
175: else
176: harshness |= new_harshness;
177: p1 = TREE_CHAIN (p1);
178: p2 = TREE_CHAIN (p2);
179: }
180: if (p1 == p2)
181: return harshness;
182: if (p2)
183: return 1;
184: if (p1)
185: return harshness | (TREE_PURPOSE (p1) == NULL_TREE);
186: }
187: else if (codel == POINTER_TYPE && coder == OFFSET_TYPE)
188: {
189: int harshness;
190:
191: /* Get to the OFFSET_TYPE that this might be. */
192: type = TREE_TYPE (type);
193:
194: if (coder != TREE_CODE (type))
195: return 1;
196:
197: harshness = 0;
198:
199: if (TYPE_OFFSET_BASETYPE (type) == TYPE_OFFSET_BASETYPE (parmtype))
200: harshness = 0;
201: else if (DERIVED_FROM_P (TYPE_OFFSET_BASETYPE (type),
202: TYPE_OFFSET_BASETYPE (parmtype)))
203: harshness = INT_TO_BD_HARSHNESS (1);
204: else if (DERIVED_FROM_P (TYPE_OFFSET_BASETYPE (parmtype),
205: TYPE_OFFSET_BASETYPE (type)))
206: harshness = CONTRAVARIANT_HARSHNESS (-1);
207: else
208: return 1;
209: /* Now test the OFFSET_TYPE's target compatability. */
210: type = TREE_TYPE (type);
211: parmtype = TREE_TYPE (parmtype);
212: }
213:
214: if (coder == UNKNOWN_TYPE)
215: {
216: if (codel == FUNCTION_TYPE
217: || codel == METHOD_TYPE
218: || (codel == POINTER_TYPE
219: && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
220: || TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE)))
221: return 0;
222: return 1;
223: }
224:
225: if (coder == VOID_TYPE)
226: return 1;
227:
228: if (codel == ENUMERAL_TYPE || codel == INTEGER_TYPE)
229: {
230: /* Control equivalence of ints an enums. */
231:
232: if (codel == ENUMERAL_TYPE
233: && flag_int_enum_equivalence == 0)
234: {
235: /* Enums can be converted to ints, but not vice-versa. */
236: if (coder != ENUMERAL_TYPE
237: || TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (parmtype))
238: return 1;
239: }
240:
241: /* else enums and ints (almost) freely interconvert. */
242:
243: if (coder == INTEGER_TYPE || coder == ENUMERAL_TYPE)
244: {
245: int easy = TREE_UNSIGNED (type) ^ TREE_UNSIGNED (parmtype);
246: if (codel != coder)
247: easy += 1;
248: if (TYPE_MODE (type) != TYPE_MODE (parmtype))
249: easy += 2;
250: return INT_TO_EASY_HARSHNESS (easy);
251: }
252: else if (coder == REAL_TYPE)
253: return INT_TO_EASY_HARSHNESS (4);
254: }
255:
256: if (codel == REAL_TYPE)
257: if (coder == REAL_TYPE)
258: /* Shun converting between float and double if a choice exists. */
259: {
260: if (TYPE_MODE (type) != TYPE_MODE (parmtype))
261: return INT_TO_EASY_HARSHNESS (2);
262: return 0;
263: }
264: else if (coder == INTEGER_TYPE || coder == ENUMERAL_TYPE)
265: return INT_TO_EASY_HARSHNESS (4);
266:
267: /* convert arrays which have not previously been converted. */
268: if (codel == ARRAY_TYPE)
269: codel = POINTER_TYPE;
270: if (coder == ARRAY_TYPE)
271: coder = POINTER_TYPE;
272:
273: /* Conversions among pointers */
274: if (codel == POINTER_TYPE && coder == POINTER_TYPE)
275: {
276: register tree ttl = TYPE_MAIN_VARIANT (TREE_TYPE (type));
277: register tree ttr = TYPE_MAIN_VARIANT (TREE_TYPE (parmtype));
278: int penalty = 4 * (ttl != ttr);
279: /* Anything converts to void *. void * converts to anything.
280: Since these may be `const void *' (etc.) use VOID_TYPE
281: instead of void_type_node.
282: Otherwise, the targets must be the same,
283: except that we do allow (at some cost) conversion
284: between signed and unsinged pointer types. */
285:
286: if ((TREE_CODE (ttl) == METHOD_TYPE
287: || TREE_CODE (ttl) == FUNCTION_TYPE)
288: && TREE_CODE (ttl) == TREE_CODE (ttr))
289: {
290: if (comptypes (ttl, ttr, -1))
291: return INT_TO_EASY_HARSHNESS (penalty);
292: return 1;
293: }
294:
295: if (!(TREE_CODE (ttl) == VOID_TYPE
296: || TREE_CODE (ttr) == VOID_TYPE
297: || (TREE_UNSIGNED (ttl) ^ TREE_UNSIGNED (ttr)
298: && (ttl = unsigned_type (ttl),
299: ttr = unsigned_type (ttr),
300: penalty = 10, 0))
301: || (comp_target_types (ttl, ttr, 0))))
302: return 1;
303:
304: if (penalty == 10)
305: return INT_TO_EASY_HARSHNESS (10);
306: if (ttr == ttl)
307: return INT_TO_BD_HARSHNESS (0);
308:
309: if (IS_AGGR_TYPE_2 (ttl, ttr))
310: {
311: int b_or_d = get_base_distance (ttl, ttr, 0, 0);
312: if (b_or_d < 0)
313: {
314: b_or_d = get_base_distance (ttr, ttl, 0, 0);
315: if (b_or_d < 0)
316: return 1;
317: return CONTRAVARIANT_HARSHNESS (-1);
318: }
319: return INT_TO_BD_HARSHNESS (b_or_d);
320: }
321: /* If converting from a `class*' to a `void*', make it
322: less favorable than any inheritance relationship. */
323: if (TREE_CODE (ttl) == VOID_TYPE && IS_AGGR_TYPE (ttr))
324: return INT_TO_BD_HARSHNESS (CLASSTYPE_MAX_DEPTH (ttr)+1);
325: return INT_TO_EASY_HARSHNESS (penalty);
326: }
327:
328: if (codel == POINTER_TYPE && coder == INTEGER_TYPE)
329: {
330: /* This is not a bad match, but don't let it beat
331: integer-enum combinations. */
332: if (parm && integer_zerop (parm))
333: return INT_TO_EASY_HARSHNESS (4);
334: }
335:
336: /* C++: one of the types must be a reference type. */
337: {
338: tree ttl, ttr;
339: register tree intype = TYPE_MAIN_VARIANT (parmtype);
340: register enum tree_code form = TREE_CODE (intype);
341: int penalty;
342:
343: if (codel == REFERENCE_TYPE || coder == REFERENCE_TYPE)
344: {
345: ttl = TYPE_MAIN_VARIANT (type);
346:
347: if (codel == REFERENCE_TYPE)
348: {
349: ttl = TYPE_MAIN_VARIANT (TREE_TYPE (ttl));
350:
351: if (form == OFFSET_TYPE)
352: {
353: intype = TREE_TYPE (intype);
354: form = TREE_CODE (intype);
355: }
356:
357: if (form == REFERENCE_TYPE)
358: {
359: intype = TYPE_MAIN_VARIANT (TREE_TYPE (intype));
360:
361: if (ttl == intype)
362: return 0;
363: penalty = 2;
364: }
365: else
366: {
367: /* Can reference be built up? */
368: if (ttl == intype)
369: return 0;
370: else
371: penalty = 2;
372: }
373: }
374: else if (form == REFERENCE_TYPE)
375: {
376: if (parm)
377: {
378: tree tmp = convert_from_reference (parm);
379: intype = TYPE_MAIN_VARIANT (TREE_TYPE (tmp));
380: }
381: else
382: {
383: intype = parmtype;
384: do
385: {
386: intype = TREE_TYPE (intype);
387: }
388: while (TREE_CODE (intype) == REFERENCE_TYPE);
389: intype = TYPE_MAIN_VARIANT (intype);
390: }
391:
392: if (ttl == intype)
393: return 0;
394: else
395: penalty = 2;
396: }
397:
398: if (TREE_UNSIGNED (ttl) ^ TREE_UNSIGNED (intype))
399: {
400: ttl = unsigned_type (ttl);
401: intype = unsigned_type (intype);
402: penalty += 2;
403: }
404:
405: ttr = intype;
406:
407: /* If the initializer is not an lvalue, then it does not
408: matter if we make life easier for the programmer
409: by creating a temporary variable with which to
410: hold the result. */
411: if (parm && (coder == INTEGER_TYPE
412: || coder == ENUMERAL_TYPE
413: || coder == REAL_TYPE)
414: && ! lvalue_p (parm))
415: return (convert_harshness (ttl, ttr, 0)
416: | INT_TO_EASY_HARSHNESS (penalty));
417:
418: if (ttl == ttr)
419: {
420: if (penalty)
421: return INT_TO_EASY_HARSHNESS (penalty);
422: return INT_TO_BD_HARSHNESS (0);
423: }
424:
425: /* Pointers to voids always convert for pointers. But
426: make them less natural than more specific matches. */
427: if (TREE_CODE (ttl) == POINTER_TYPE && TREE_CODE (ttr) == POINTER_TYPE)
428: if (TREE_TYPE (ttl) == void_type_node
429: || TREE_TYPE (ttr) == void_type_node)
430: return INT_TO_EASY_HARSHNESS (penalty+1);
431:
432: if (parm && codel != REFERENCE_TYPE)
433: return (convert_harshness (ttl, ttr, 0)
434: | INT_TO_EASY_HARSHNESS (penalty));
435:
436: /* Here it does matter. If this conversion is from
437: derived to base, allow it. Otherwise, types must
438: be compatible in the strong sense. */
439: if (IS_AGGR_TYPE_2 (ttl, ttr))
440: {
441: int b_or_d = get_base_distance (ttl, ttr, 0, 0);
442: if (b_or_d < 0)
443: {
444: b_or_d = get_base_distance (ttr, ttl, 0, 0);
445: if (b_or_d < 0)
446: return 1;
447: return CONTRAVARIANT_HARSHNESS (-1);
448: }
449: /* Say that this conversion is relatively painless.
450: If it turns out that there is a user-defined X(X&)
451: constructor, then that will be invoked, but that's
452: preferable to dealing with other user-defined conversions
453: that may produce surprising results. */
454: return INT_TO_BD_HARSHNESS (b_or_d);
455: }
456:
457: if (comp_target_types (ttl, intype, 1))
458: return INT_TO_EASY_HARSHNESS (penalty);
459: }
460: }
461: if (codel == RECORD_TYPE && coder == RECORD_TYPE)
462: {
463: int b_or_d = get_base_distance (type, parmtype, 0, 0);
464: if (b_or_d < 0)
465: {
466: b_or_d = get_base_distance (parmtype, type, 0, 0);
467: if (b_or_d < 0)
468: return 1;
469: return CONTRAVARIANT_HARSHNESS (-1);
470: }
471: return INT_TO_BD_HARSHNESS (b_or_d);
472: }
473: return 1;
474: }
475:
476: /* Algorithm: Start out with no stikes against. For each argument
477: which requires a (subjective) hard conversion (such as between
478: floating point and integer), issue a strike. If there are the same
479: number of formal and actual parameters in the list, there will be at
480: least on strike, otherwise an exact match would have been found. If
481: there are not the same number of arguments in the type lists, we are
482: not dead yet: a `...' means that we can have more parms then were
483: declared, and if we wind up in the default argument section of the
484: list those can be used as well. If an exact match could be found for
485: one of those cases, return it immediately. Otherwise, rank the fields
486: so that fields with fewer strikes are tried first.
487:
488: Conversions between builtin and user-defined types are allowed, but
489: no function involving such a conversion is prefered to one which
490: does not require such a conversion. Furthermore, such conversions
491: must be unique. */
492:
493: void
494: compute_conversion_costs (function, tta_in, cp, arglen)
495: tree function;
496: tree tta_in;
497: struct candidate *cp;
498: int arglen;
499: {
500: tree ttf_in = TYPE_ARG_TYPES (TREE_TYPE (function));
501: tree ttf = ttf_in;
502: tree tta = tta_in;
503:
504: /* Start out with no strikes against. */
505: int evil_strikes = 0;
506: int user_strikes = 0;
507: int b_or_d_strikes = 0;
508: int easy_strikes = 0;
509:
510: int strike_index = 0, win, lose;
511:
512: #ifdef GATHER_STATISTICS
513: n_compute_conversion_costs++;
514: #endif
515:
516: cp->function = function;
517: cp->arg = tta ? TREE_VALUE (tta) : NULL_TREE;
518: cp->u.bad_arg = 0; /* optimistic! */
519:
520: bzero (cp->harshness, (arglen+1) * sizeof (short));
521:
522: while (ttf && tta)
523: {
524: int harshness;
525:
526: if (ttf == void_list_node)
527: break;
528:
529: if (type_unknown_p (TREE_VALUE (tta)))
530: {
531: /* Must perform some instantiation here. */
532: tree rhs = TREE_VALUE (tta);
533: tree lhstype = TREE_VALUE (ttf);
534:
535: /* Keep quiet about possible contravariance violations. */
536: extern int inhibit_warnings;
537: int old_inhibit_warnings = inhibit_warnings;
538: inhibit_warnings = 1;
539:
540: /* @@ This is to undo what `grokdeclarator' does to
541: parameter types. It really should go through
542: something more general. */
543:
544: TREE_TYPE (tta) = unknown_type_node;
545: rhs = instantiate_type (lhstype, rhs, 0);
546: inhibit_warnings = old_inhibit_warnings;
547:
548: if (TREE_CODE (rhs) == ERROR_MARK)
549: harshness = 1;
550: else
551: {
552: harshness = convert_harshness (lhstype, TREE_TYPE (rhs), rhs);
553: /* harshness |= 2; */
554: }
555: }
556: else
557: harshness = convert_harshness (TREE_VALUE (ttf), TREE_TYPE (TREE_VALUE (tta)), TREE_VALUE (tta));
558:
559: cp->harshness[strike_index] = harshness;
560: if (EVIL_HARSHNESS (harshness)
561: || CONTRAVARIANT_HARSHNESS (harshness))
562: {
563: cp->u.bad_arg = strike_index;
564: evil_strikes = 1;
565: }
566: #if 0
567: /* This is never set by `convert_harshness'. */
568: else if (USER_HARSHNESS (harshness))
569: {
570: user_strikes += 1;
571: }
572: #endif
573: else if (BASE_DERIVED_HARSHNESS (harshness))
574: {
575: b_or_d_strikes += INT_FROM_BD_HARSHNESS (harshness);
576: }
577: else
578: easy_strikes += INT_FROM_EASY_HARSHNESS (harshness);
579: ttf = TREE_CHAIN (ttf);
580: tta = TREE_CHAIN (tta);
581: strike_index += 1;
582: }
583:
584: if (tta)
585: {
586: /* ran out of formals, and parmlist is fixed size. */
587: if (ttf /* == void_type_node */)
588: {
589: cp->evil = 1;
590: cp->u.bad_arg = -1;
591: return;
592: }
593: }
594: else if (ttf && ttf != void_list_node)
595: {
596: /* ran out of actuals, and no defaults. */
597: if (TREE_PURPOSE (ttf) == NULL_TREE)
598: {
599: cp->evil = 1;
600: cp->u.bad_arg = -2;
601: return;
602: }
603: /* Store index of first default. */
604: cp->harshness[arglen] = strike_index+1;
605: }
606: else cp->harshness[arglen] = 0;
607:
608: /* Argument list lengths work out, so don't need to check them again. */
609: if (evil_strikes)
610: {
611: /* We do not check for derived->base conversions here, since in
612: no case would they give evil strike counts, unless such conversions
613: are somehow ambiguous. */
614:
615: /* See if any user-defined conversions apply.
616: But make sure that we do not loop. */
617: static int dont_convert_types = 0;
618:
619: if (dont_convert_types)
620: {
621: cp->evil = 1;
622: return;
623: }
624:
625: win = 0; /* Only get one chance to win. */
626: ttf = TYPE_ARG_TYPES (TREE_TYPE (function));
627: tta = tta_in;
628: strike_index = 0;
629: evil_strikes = 0;
630:
631: while (ttf && tta)
632: {
633: if (ttf == void_list_node)
634: break;
635:
636: lose = cp->harshness[strike_index];
637: if (EVIL_HARSHNESS (lose)
638: || CONTRAVARIANT_HARSHNESS (lose))
639: {
640: tree actual_type = TREE_TYPE (TREE_VALUE (tta));
641: tree formal_type = TREE_VALUE (ttf);
642:
643: dont_convert_types = 1;
644:
645: if (TREE_CODE (formal_type) == REFERENCE_TYPE)
646: formal_type = TREE_TYPE (formal_type);
647: if (TREE_CODE (actual_type) == REFERENCE_TYPE)
648: actual_type = TREE_TYPE (actual_type);
649:
650: if (formal_type != error_mark_node
651: && actual_type != error_mark_node)
652: {
653: formal_type = TYPE_MAIN_VARIANT (formal_type);
654: actual_type = TYPE_MAIN_VARIANT (actual_type);
655:
656: if (TYPE_HAS_CONSTRUCTOR (formal_type))
657: {
658: /* If it has a constructor for this type, try to use it. */
659: if (convert_to_aggr (formal_type, TREE_VALUE (tta), 0, 1)
660: != error_mark_node)
661: {
662: /* @@ There is no way to save this result yet.
663: @@ So success is NULL_TREE for now. */
664: win++;
665: }
666: }
667: if (TYPE_LANG_SPECIFIC (actual_type) && TYPE_HAS_CONVERSION (actual_type))
668: {
669: if (TREE_CODE (formal_type) == INTEGER_TYPE
670: && TYPE_HAS_INT_CONVERSION (actual_type))
671: win++;
672: else if (TREE_CODE (formal_type) == REAL_TYPE
673: && TYPE_HAS_REAL_CONVERSION (actual_type))
674: win++;
675: else
676: {
677: tree conv = build_type_conversion (CALL_EXPR, TREE_VALUE (ttf), TREE_VALUE (tta), 0);
678: if (conv)
679: {
680: if (conv == error_mark_node)
681: win += 2;
682: else
683: win++;
684: }
685: else if (TREE_CODE (TREE_VALUE (ttf)) == REFERENCE_TYPE)
686: {
687: conv = build_type_conversion (CALL_EXPR, formal_type, TREE_VALUE (tta), 0);
688: if (conv)
689: {
690: if (conv == error_mark_node)
691: win += 2;
692: else
693: win++;
694: }
695: }
696: }
697: }
698: }
699: dont_convert_types = 0;
700:
701: if (win == 1)
702: {
703: user_strikes += 1;
704: cp->harshness[strike_index] = USER_HARSHNESS (-1);
705: win = 0;
706: }
707: else
708: {
709: if (cp->u.bad_arg > strike_index)
710: cp->u.bad_arg = strike_index;
711:
712: evil_strikes = win ? 2 : 1;
713: break;
714: }
715: }
716:
717: ttf = TREE_CHAIN (ttf);
718: tta = TREE_CHAIN (tta);
719: strike_index += 1;
720: }
721: }
722:
723: /* Const member functions get a small penalty because defaulting
724: to const is less useful than defaulting to non-const. */
725: if (TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
726: {
727: if (TYPE_READONLY (TREE_TYPE (TREE_VALUE (ttf_in))))
728: {
729: cp->harshness[0] += INT_TO_EASY_HARSHNESS (1);
730: ++easy_strikes;
731: }
732: else
733: {
734: /* Calling a non-const member function from a const member function
735: is probably invalid, but for now we let it only draw a warning.
736: We indicate that such a mismatch has occured by setting the
737: harshness to a maximum value. */
738: if (TREE_CODE (TREE_TYPE (TREE_VALUE (tta_in))) == POINTER_TYPE
739: && (TYPE_READONLY (TREE_TYPE (TREE_TYPE (TREE_VALUE (tta_in))))))
740: cp->harshness[0] |= CONST_HARSHNESS (-1);
741: }
742: }
743:
744: cp->evil = evil_strikes;
745: cp->user = user_strikes;
746: cp->b_or_d = b_or_d_strikes;
747: cp->easy = easy_strikes;
748: }
749:
750: /* When one of several possible overloaded functions and/or methods
751: can be called, choose the best candidate for overloading.
752:
753: BASETYPE is the context from which we start method resolution
754: or NULL if we are comparing overloaded functions.
755: CANDIDATES is the array of canidates we have to choose from.
756: N_CANDIDATES is the length of CANDIDATES.
757: PARMS is a TREE_LIST of parameters to the function we'll ultimately
758: choose. It is modified in place when resolving methods. It is not
759: modified in place when resolving overloaded functions.
760: LEN is the length of the parameter list. */
761:
762: static struct candidate *
763: ideal_candidate (basetype, candidates, n_candidates, parms, len)
764: tree basetype;
765: struct candidate *candidates;
766: int n_candidates;
767: tree parms;
768: int len;
769: {
770: struct candidate *cp = candidates + n_candidates;
771: int index, i;
772: tree ttf;
773:
774: qsort (candidates, /* char *base */
775: n_candidates, /* int nel */
776: sizeof (struct candidate), /* int width */
777: rank_for_overload); /* int (*compar)() */
778:
779: /* If the best candidate requires user-defined conversions,
780: and its user-defined conversions are a strict subset
781: of all other candidates requiring user-defined conversions,
782: then it is, in fact, the best. */
783: for (i = -1; cp + i != candidates; i--)
784: if (cp[i].user == 0)
785: break;
786:
787: if (i < -1)
788: {
789: tree ttf0;
790:
791: /* Check that every other candidate requires those conversions
792: as a strict subset of their conversions. */
793: if (cp[i].user == cp[-1].user)
794: goto non_subset;
795:
796: /* Look at subset relationship more closely. */
797: while (i != -1)
798: {
799: for (ttf = TYPE_ARG_TYPES (TREE_TYPE (cp[i].function)),
800: ttf0 = TYPE_ARG_TYPES (TREE_TYPE (cp[-1].function)),
801: index = 0;
802: index < len;
803: ttf = TREE_CHAIN (ttf), ttf0 = TREE_CHAIN (ttf0), index++)
804: if (USER_HARSHNESS (cp[i].harshness[index]))
805: {
806: /* If our "best" candidate also needs a conversion,
807: it must be the same one. */
808: if (USER_HARSHNESS (cp[-1].harshness[index])
809: && TREE_VALUE (ttf) != TREE_VALUE (ttf0))
810: goto non_subset;
811: }
812: i++;
813: }
814: /* The best was the best. */
815: return cp - 1;
816: non_subset:
817: /* Use other rules for determining "bestness". */
818: ;
819: }
820:
821: /* If the best two candidates we find require user-defined
822: conversions, we may need to report and error message. */
823: if (cp[-1].user && cp[-2].user
824: && (cp[-1].b_or_d || cp[-2].b_or_d == 0))
825: {
826: /* If the best two methods found involved user-defined
827: type conversions, then we must see whether one
828: of them is exactly what we wanted. If not, then
829: we have an ambiguity. */
830: int best = 0;
831: tree tta = parms;
832: tree f1, p1;
833:
834: /* Stash all of our parameters in safe places
835: so that we can perform type conversions in place. */
836: while (tta)
837: {
838: TREE_PURPOSE (tta) = TREE_VALUE (tta);
839: tta = TREE_CHAIN (tta);
840: }
841:
842: i = 0;
843: do
844: {
845: int exact_conversions = 0;
846:
847: i -= 1;
848: tta = parms;
849: if (DECL_STATIC_FUNCTION_P (cp[i].function))
850: tta = TREE_CHAIN (tta);
851: for (ttf = TYPE_ARG_TYPES (TREE_TYPE (cp[i].function)), index = 0;
852: index < len;
853: tta = TREE_CHAIN (tta), ttf = TREE_CHAIN (ttf), index++)
854: {
855: if (USER_HARSHNESS (cp[i].harshness[index]))
856: {
857: TREE_VALUE (tta)
858: = build_type_conversion (CALL_EXPR, TREE_VALUE (ttf), TREE_PURPOSE (tta), 2);
859: if (TREE_VALUE (tta))
860: {
861: if (TREE_CODE (TREE_VALUE (tta)) != CONVERT_EXPR
862: && (TREE_CODE (TREE_VALUE (tta)) != NOP_EXPR
863: || comp_target_types (TREE_TYPE (TREE_VALUE (tta)),
864: TREE_TYPE (TREE_OPERAND (TREE_VALUE (tta), 0)), 1)))
865: exact_conversions += 1;
866: }
867: else if (PROMOTES_TO_AGGR_TYPE (TREE_VALUE (ttf), REFERENCE_TYPE))
868: {
869: /* To get here we had to have succeeded via
870: a constructor. */
871: TREE_VALUE (tta) = TREE_PURPOSE (tta);
872: exact_conversions += 1;
873: }
874: }
875: }
876: if (exact_conversions == cp[i].user)
877: {
878: if (best == 0)
879: {
880: best = i;
881: f1 = cp[best].function;
882: p1 = TYPE_ARG_TYPES (TREE_TYPE (f1));
883: }
884: else
885: {
886: /* Don't complain if next best is from base class. */
887: tree f2 = cp[i].function;
888: tree p2 = TYPE_ARG_TYPES (TREE_TYPE (f2));
889:
890: if (TREE_CODE (TREE_TYPE (f1)) == METHOD_TYPE
891: && TREE_CODE (TREE_TYPE (f2)) == METHOD_TYPE
892: && BASE_DERIVED_HARSHNESS (cp[i].harshness[0])
893: && cp[best].harshness[0] < cp[i].harshness[0])
894: {
895: #if 0
896: /* For LUCID. */
897: if (! compparms (TREE_CHAIN (p1), TREE_CHAIN (p2), 1))
898: goto ret0;
899: else
900: #endif
901: continue;
902: }
903: else
904: {
905: /* Ensure that there's nothing ambiguous about these
906: two fns. */
907: for (index = 0; index < len; index++)
908: {
909: /* Type conversions must be piecewise equivalent. */
910: if (USER_HARSHNESS (cp[best].harshness[index])
911: != USER_HARSHNESS (cp[i].harshness[index]))
912: goto ret0;
913: /* If there's anything we like better about the
914: other function, consider it ambiguous. */
915: if (cp[i].harshness[index] < cp[best].harshness[index])
916: goto ret0;
917: }
918: /* If we made it to here, it means we're satisfied that
919: BEST is still best. */
920: continue;
921: }
922: }
923: }
924: } while (cp + i != candidates);
925:
926: if (best)
927: {
928: int exact_conversions = cp[best].user;
929: tta = parms;
930: if (DECL_STATIC_FUNCTION_P (cp[best].function))
931: tta = TREE_CHAIN (parms);
932: for (ttf = TYPE_ARG_TYPES (TREE_TYPE (cp[best].function)), index = 0;
933: exact_conversions > 0;
934: tta = TREE_CHAIN (tta), ttf = TREE_CHAIN (ttf), index++)
935: {
936: if (USER_HARSHNESS (cp[best].harshness[index]))
937: {
938: /* We must now fill in the slot we left behind.
939: @@ This could be optimized to use the value previously
940: @@ computed by build_type_conversion in some cases. */
941: if (basetype != NULL_TREE)
942: TREE_VALUE (tta) = convert (TREE_VALUE (ttf), TREE_PURPOSE (tta));
943: exact_conversions -= 1;
944: }
945: else TREE_VALUE (tta) = TREE_PURPOSE (tta);
946: }
947: return cp + best;
948: }
949: goto ret0;
950: }
951: /* If the best two candidates we find both use default parameters,
952: we may need to report and error. Don't need to worry if next-best
953: candidate is forced to use user-defined conversion when best is not. */
954: if (cp[-2].user == 0
955: && cp[-1].harshness[len] != 0 && cp[-2].harshness[len] != 0)
956: {
957: tree tt1 = TYPE_ARG_TYPES (TREE_TYPE (cp[-1].function));
958: tree tt2 = TYPE_ARG_TYPES (TREE_TYPE (cp[-2].function));
959: unsigned i = cp[-1].harshness[len];
960:
961: if (cp[-2].harshness[len] < i)
962: i = cp[-2].harshness[len];
963: while (--i > 0)
964: {
965: if (TYPE_MAIN_VARIANT (TREE_VALUE (tt1))
966: != TYPE_MAIN_VARIANT (TREE_VALUE (tt2)))
967: /* These lists are not identical, so we can choose our best candidate. */
968: return cp - 1;
969: tt1 = TREE_CHAIN (tt1);
970: tt2 = TREE_CHAIN (tt2);
971: }
972: /* To get here, both lists had the same parameters up to the defaults
973: which were used. This is an ambiguous request. */
974: goto ret0;
975: }
976:
977: /* Otherwise, return our best candidate. Note that if we get candidates
978: from independent base classes, we have an ambiguity, even if one
979: argument list look a little better than another one. */
980: if (cp[-1].b_or_d && basetype && TYPE_USES_MULTIPLE_INHERITANCE (basetype))
981: {
982: int i = n_candidates - 1, best = i;
983: tree base1 = NULL_TREE;
984:
985: if (TREE_CODE (TREE_TYPE (candidates[i].function)) == FUNCTION_TYPE)
986: return cp - 1;
987:
988: for (; i >= 0 && candidates[i].user == 0 && candidates[i].evil == 0; i--)
989: {
990: if (TREE_CODE (TREE_TYPE (candidates[i].function)) == METHOD_TYPE)
991: {
992: tree newbase = DECL_CLASS_CONTEXT (candidates[i].function);
993:
994: if (base1 != NULL_TREE)
995: {
996: if (newbase != base1 && ! DERIVED_FROM_P (newbase, base1))
997: {
998: char *buf = (char *)alloca (8192);
999: error ("ambiguous request for function from distinct base classes of type `%s'", TYPE_NAME_STRING (basetype));
1000: error ("first candidate is `%s'",
1001: fndecl_as_string (0, candidates[best].function, 1));
1002: error ("second candidate is `%s'",
1003: fndecl_as_string (0, candidates[i].function, 1));
1004: cp[-1].evil = 1;
1005: return cp - 1;
1006: }
1007: }
1008: else
1009: {
1010: best = i;
1011: base1 = newbase;
1012: }
1013: }
1014: else return cp - 1;
1015: }
1016: }
1017:
1018: /* Don't accept a candidate as being ideal if it's indistinguishable
1019: from another candidate. */
1020: if (rank_for_overload (cp-1, cp-2) == 0)
1021: {
1022: /* If the types are distinguishably different (like
1023: `long' vs. `unsigned long'), that's ok. But if they are arbitrarily
1024: different, such as `int (*)(void)' vs. `void (*)(int)',
1025: that's not ok. */
1026: tree p1 = TYPE_ARG_TYPES (TREE_TYPE (cp[-1].function));
1027: tree p2 = TYPE_ARG_TYPES (TREE_TYPE (cp[-2].function));
1028: while (p1 && p2)
1029: {
1030: if (TREE_CODE (TREE_VALUE (p1)) == POINTER_TYPE
1031: && TREE_CODE (TREE_TYPE (TREE_VALUE (p1))) == FUNCTION_TYPE
1032: && TREE_VALUE (p1) != TREE_VALUE (p2))
1033: return 0;
1034: p1 = TREE_CHAIN (p1);
1035: p2 = TREE_CHAIN (p2);
1036: }
1037: if (p1 || p2)
1038: return 0;
1039: }
1040:
1041: return cp - 1;
1042:
1043: ret0:
1044: /* In the case where there is no ideal candidate, restore
1045: TREE_VALUE slots of PARMS from TREE_PURPOSE slots. */
1046: while (parms)
1047: {
1048: TREE_VALUE (parms) = TREE_PURPOSE (parms);
1049: parms = TREE_CHAIN (parms);
1050: }
1051: return 0;
1052: }
1053:
1054: /* Assume that if the class referred to is not in the
1055: current class hierarchy, that it may be remote.
1056: PARENT is assumed to be of aggregate type here. */
1057: static int
1058: may_be_remote (parent)
1059: tree parent;
1060: {
1061: if (TYPE_OVERLOADS_METHOD_CALL_EXPR (parent) == 0)
1062: return 0;
1063:
1064: if (current_class_type == NULL_TREE)
1065: return 0;
1066: if (parent == current_class_type)
1067: return 0;
1068:
1069: if (DERIVED_FROM_P (parent, current_class_type))
1070: return 0;
1071: return 1;
1072: }
1073:
1074: #ifdef ESKIT
1075: /* Return the number of bytes that the arglist in PARMS would
1076: occupy on the stack. */
1077: int
1078: get_arglist_len_in_bytes (parms)
1079: tree parms;
1080: {
1081: register tree parm;
1082: register int bytecount = 0;
1083:
1084: for (parm = parms; parm; parm = TREE_CHAIN (parm))
1085: {
1086: register tree pval = TREE_VALUE (parm);
1087: register int used, size;
1088:
1089: if (TREE_CODE (pval) == ERROR_MARK)
1090: continue;
1091: else if (TYPE_MODE (TREE_TYPE (pval)) != BLKmode)
1092: {
1093: used = size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (pval)));
1094: #ifdef PUSH_ROUNDING
1095: size = PUSH_ROUNDING (size);
1096: #endif
1097: used = (((size + PARM_BOUNDARY / BITS_PER_UNIT - 1)
1098: / (PARM_BOUNDARY / BITS_PER_UNIT))
1099: * (PARM_BOUNDARY / BITS_PER_UNIT));
1100: }
1101: else
1102: {
1103: register tree size = size_in_bytes (TREE_TYPE (pval));
1104: register tree used_t
1105: = round_up (size, PARM_BOUNDARY / BITS_PER_UNIT);
1106: used = TREE_INT_CST_LOW (used_t);
1107: }
1108: bytecount += used;
1109: }
1110: return bytecount;
1111: }
1112: #endif
1113:
1114: tree
1115: build_vfield_ref (datum, type)
1116: tree datum, type;
1117: {
1118: tree rval;
1119: extern int flag_assume_nonnull_objects;
1120: int old_assume_nonnull_objects = flag_assume_nonnull_objects;
1121:
1122: /* Vtable references are always made from non-null objects. */
1123: flag_assume_nonnull_objects = 1;
1124: if (TREE_CODE (TREE_TYPE (datum)) == REFERENCE_TYPE)
1125: datum = convert_from_reference (datum);
1126:
1127: if (! TYPE_USES_COMPLEX_INHERITANCE (type))
1128: rval = build (COMPONENT_REF, TREE_TYPE (CLASSTYPE_VFIELD (type)),
1129: datum, CLASSTYPE_VFIELD (type));
1130: else
1131: rval = build_component_ref (datum, DECL_NAME (CLASSTYPE_VFIELD (type)), 0, 0);
1132: flag_assume_nonnull_objects = old_assume_nonnull_objects;
1133:
1134: return rval;
1135: }
1136:
1137: /* Build a call to a member of an object. I.e., one that overloads
1138: operator ()(), or is a pointer-to-function or pointer-to-method. */
1139: static tree
1140: build_field_call (basetype_path, instance_ptr, name, parms, err_name)
1141: tree basetype_path;
1142: tree instance_ptr, name, parms;
1143: char *err_name;
1144: {
1145: tree field, instance;
1146:
1147: if (instance_ptr == current_class_decl)
1148: {
1149: /* Check to see if we really have a reference to an instance variable
1150: with `operator()()' overloaded. */
1151: #if 1
1152: field = IDENTIFIER_CLASS_VALUE (name);
1153: #else
1154: field = identifier_class_value (name);
1155: #endif
1156:
1157: if (field == NULL_TREE)
1158: {
1159: error ("`this' has no member named `%s'", err_name);
1160: return error_mark_node;
1161: }
1162:
1163: if (TREE_CODE (field) == FIELD_DECL)
1164: {
1165: /* If it's a field, try overloading operator (),
1166: or calling if the field is a pointer-to-function. */
1167: instance = build_component_ref_1 (C_C_D, field, 0);
1168: if (instance == error_mark_node)
1169: return error_mark_node;
1170:
1171: if (TYPE_LANG_SPECIFIC (TREE_TYPE (instance))
1172: && TYPE_OVERLOADS_CALL_EXPR (TREE_TYPE (instance)))
1173: return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, instance, parms);
1174:
1175: if (TREE_CODE (TREE_TYPE (instance)) == POINTER_TYPE)
1176: if (TREE_CODE (TREE_TYPE (TREE_TYPE (instance))) == FUNCTION_TYPE)
1177: return build_function_call (instance, parms);
1178: else if (TREE_CODE (TREE_TYPE (TREE_TYPE (instance))) == METHOD_TYPE)
1179: return build_function_call (instance, tree_cons (NULL_TREE, current_class_decl, parms));
1180: }
1181: return NULL_TREE;
1182: }
1183:
1184: /* Check to see if this is not really a reference to an instance variable
1185: with `operator()()' overloaded. */
1186: field = lookup_field (basetype_path, name, 1);
1187:
1188: /* This can happen if the reference was ambiguous
1189: or for visibility violations. */
1190: if (field == error_mark_node)
1191: return error_mark_node;
1192: if (field)
1193: {
1194: tree basetype;
1195: tree ftype = TREE_TYPE (field);
1196:
1197: if (TYPE_LANG_SPECIFIC (ftype) && TYPE_OVERLOADS_CALL_EXPR (ftype))
1198: {
1199: /* Make the next search for this field very short. */
1200: basetype = DECL_FIELD_CONTEXT (field);
1201: instance_ptr = convert_pointer_to (basetype, instance_ptr);
1202:
1203: instance = build_indirect_ref (instance_ptr, 0);
1204: return build_opfncall (CALL_EXPR, LOOKUP_NORMAL,
1205: build_component_ref_1 (instance, field, 0),
1206: parms);
1207: }
1208: if (TREE_CODE (ftype) == POINTER_TYPE)
1209: {
1210: if (TREE_CODE (TREE_TYPE (ftype)) == FUNCTION_TYPE
1211: || TREE_CODE (TREE_TYPE (ftype)) == METHOD_TYPE)
1212: {
1213: /* This is a member which is a pointer to function. */
1214: tree ref = build_component_ref_1 (build_indirect_ref (instance_ptr, 0),
1215: field, LOOKUP_COMPLAIN);
1216: if (ref == error_mark_node)
1217: return error_mark_node;
1218: return build_function_call (ref, parms);
1219: }
1220: }
1221: else if (TREE_CODE (ftype) == METHOD_TYPE)
1222: {
1223: error ("invalid call via pointer-to-member function");
1224: return error_mark_node;
1225: }
1226: else
1227: return NULL_TREE;
1228: }
1229: return NULL_TREE;
1230: }
1231:
1232: /* Resolve an expression NAME1::NAME2::...::NAMEn to
1233: the name that names the above nested type. INNER_TYPES
1234: is a chain of nested type names (held together by SCOPE_REFs);
1235: OUTER_TYPE is the type we know to enclose INNER_TYPES.
1236: Returns NULL_TREE if there is an error. */
1237: tree
1238: resolve_scope_to_name (outer_type, inner_types)
1239: tree outer_type, inner_types;
1240: {
1241: tree tags;
1242: tree inner_name;
1243:
1244: if (outer_type == NULL_TREE && current_class_type != NULL_TREE)
1245: {
1246: /* We first try to look for a nesting in our current class context. */
1247: tree rval = resolve_scope_to_name (current_class_type, inner_types);
1248: if (rval != NULL_TREE)
1249: return rval;
1250: }
1251:
1252: if (TREE_CODE (inner_types) == SCOPE_REF)
1253: {
1254: inner_name = TREE_OPERAND (inner_types, 0);
1255: inner_types = TREE_OPERAND (inner_types, 1);
1256: }
1257: else
1258: {
1259: inner_name = inner_types;
1260: inner_types = 0;
1261: }
1262:
1263: if (outer_type == NULL_TREE)
1264: {
1265: /* If we have something that's already a type by itself,
1266: use that. */
1267: if (IDENTIFIER_HAS_TYPE_VALUE (inner_name))
1268: {
1269: if (inner_types)
1270: return resolve_scope_to_name (IDENTIFIER_TYPE_VALUE (inner_name),
1271: inner_types);
1272: return inner_name;
1273: }
1274: return NULL_TREE;
1275: }
1276:
1277: if (! IS_AGGR_TYPE (outer_type))
1278: return NULL_TREE;
1279:
1280: /* Look for member classes. */
1281: tags = CLASSTYPE_TAGS (outer_type);
1282:
1283: while (tags)
1284: {
1285: if (TREE_PURPOSE (tags) == inner_name)
1286: {
1287: if (inner_types == NULL_TREE)
1288: return DECL_NESTED_TYPENAME (TYPE_NAME (TREE_VALUE (tags)));
1289: return resolve_scope_to_name (TREE_VALUE (tags), inner_types);
1290: }
1291: tags = TREE_CHAIN (tags);
1292: }
1293:
1294: /* Look for a TYPE_DECL. */
1295: for (tags = TYPE_FIELDS (outer_type); tags; tags = TREE_CHAIN (tags))
1296: if (TREE_CODE (tags) == TYPE_DECL && DECL_NAME (tags) == inner_name)
1297: {
1298: #if 0
1299: /* Code by tiemann. */
1300: tree type = TREE_TYPE (tags);
1301: /* With luck, this will name a visible type. */
1302: inner_name = TYPE_NAME (type);
1303: if (TREE_CODE (inner_name) == TYPE_DECL)
1304: inner_name = DECL_NAME (inner_name);
1305: return inner_name;
1306: #else
1307: /* Code by raeburn. */
1308: if (inner_types == NULL_TREE)
1309: return DECL_NESTED_TYPENAME (tags);
1310: return resolve_scope_to_name (TREE_TYPE (tags), inner_types);
1311: #endif
1312: }
1313:
1314: return NULL_TREE;
1315: }
1316:
1317: /* Build a method call of the form `EXP->SCOPES::NAME (PARMS)'.
1318: This is how virtual function calls are avoided. */
1319: tree
1320: build_scoped_method_call (exp, scopes, name, parms)
1321: tree exp;
1322: tree scopes;
1323: tree name;
1324: tree parms;
1325: {
1326: /* Because this syntactic form does not allow
1327: a pointer to a base class to be `stolen',
1328: we need not protect the drived->base conversion
1329: that happens here.
1330:
1331: @@ But we do have to check visibility privileges later. */
1332: tree basename = resolve_scope_to_name (NULL_TREE, scopes);
1333: tree basetype, binfo, decl;
1334: tree type = TREE_TYPE (exp);
1335:
1336: if (type == error_mark_node
1337: || basename == NULL_TREE
1338: || ! is_aggr_typedef (basename, 1))
1339: return error_mark_node;
1340:
1341: if (! IS_AGGR_TYPE (type))
1342: {
1343: error ("base object of scoped method call is not of aggregate type");
1344: return error_mark_node;
1345: }
1346:
1347: basetype = IDENTIFIER_TYPE_VALUE (basename);
1348:
1349: if (binfo = binfo_or_else (basetype, type))
1350: {
1351: if (binfo == error_mark_node)
1352: return error_mark_node;
1353: if (TREE_CODE (exp) == INDIRECT_REF)
1354: decl = build_indirect_ref (convert_pointer_to (binfo,
1355: build_unary_op (ADDR_EXPR, exp, 0)), 0);
1356: else
1357: decl = build_scoped_ref (exp, scopes);
1358:
1359: /* Call to a destructor. */
1360: if (TREE_CODE (name) == BIT_NOT_EXPR)
1361: {
1362: /* Explicit call to destructor. */
1363: name = TREE_OPERAND (name, 0);
1364: if (! is_aggr_typedef (name, 1))
1365: return error_mark_node;
1366: if (TREE_TYPE (decl) != IDENTIFIER_TYPE_VALUE (name))
1367: {
1368: error_with_aggr_type (TREE_TYPE (decl),
1369: "qualified type `%s' does not match destructor type `%s'",
1370: IDENTIFIER_POINTER (name));
1371: return error_mark_node;
1372: }
1373: if (! TYPE_HAS_DESTRUCTOR (TREE_TYPE (decl)))
1374: error_with_aggr_type (TREE_TYPE (decl), "type `%s' has no destructor");
1375: return build_delete (TREE_TYPE (decl), decl, integer_two_node,
1376: LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0, 1);
1377: }
1378:
1379: /* Call to a method. */
1380: return build_method_call (decl, name, parms, NULL_TREE,
1381: LOOKUP_NORMAL|LOOKUP_NONVIRTUAL);
1382: }
1383: return error_mark_node;
1384: }
1385:
1386: /* Build something of the form ptr->method (args)
1387: or object.method (args). This can also build
1388: calls to constructors, and find friends.
1389:
1390: Member functions always take their class variable
1391: as a pointer.
1392:
1393: INSTANCE is a class instance.
1394:
1395: NAME is the NAME field of the struct, union, or class
1396: whose type is that of INSTANCE.
1397:
1398: PARMS help to figure out what that NAME really refers to.
1399:
1400: BASETYPE_PATH, if non-NULL, tells which basetypes of INSTANCE
1401: we should be traversed before starting our search. We need
1402: this information to get protected accesses correct.
1403:
1404: FLAGS is the logical disjunction of zero or more LOOKUP_
1405: flags. See cp-tree.h for more info.
1406:
1407: If this is all OK, calls build_function_call with the resolved
1408: member function.
1409:
1410: This function must also handle being called to perform
1411: initialization, promotion/coercion of arguments, and
1412: instantiation of default parameters.
1413:
1414: Note that NAME may refer to an instance variable name. If
1415: `operator()()' is defined for the type of that field, then we return
1416: that result. */
1417: tree
1418: build_method_call (instance, name, parms, basetype_path, flags)
1419: tree instance, name, parms, basetype_path;
1420: int flags;
1421: {
1422: register tree function, fntype, value_type;
1423: register tree basetype, save_basetype;
1424: register tree baselink, result, method_name, parmtypes, parm;
1425: tree last;
1426: int pass;
1427: enum visibility_type visibility;
1428: int rank_for_overload ();
1429:
1430: /* Range of cases for vtable optimization. */
1431: enum vtable_needs
1432: {
1433: not_needed, maybe_needed, unneeded, needed,
1434: };
1435: enum vtable_needs need_vtbl = not_needed;
1436:
1437: char *err_name;
1438: char *name_kind;
1439: int ever_seen = 0;
1440: int wrap;
1441: tree wrap_type;
1442: tree instance_ptr = NULL_TREE;
1443: int all_virtual = flag_all_virtual;
1444: int static_call_context = 0;
1445: tree saw_private = 0;
1446: tree saw_protected = 0;
1447: #ifdef SOS
1448: /* If call is a call to a constructor, then `dtbl'
1449: will first be initialized with the function table pointer
1450: of the appropriate type (calling "sosFindCode" as a last
1451: resort), the the call to the constructor will go through there. */
1452: tree dtbl = (flags & LOOKUP_DYNAMIC) ? TREE_VALUE (parms) : NULL_TREE;
1453:
1454: /* Flag saying whether or not `dtbl' has been inserted into the
1455: parameter list. This is needed because we cannot tell (until
1456: we have a match) whether this parameter should go in or not.
1457:
1458: If 1, then `dtbl' is living naturally.
1459: If 0, then `dtbl' is not among the parms that we know about.
1460: If -1, the `dtbl' was place into the parms unnaturally.
1461:
1462: Note that we may side-effect the parameter list, but in such a way
1463: that the caller of this function would never know. */
1464: int dtbl_inserted = (flags & LOOKUP_DYNAMIC);
1465: #endif
1466:
1467: /* Keep track of `const' and `volatile' objects. */
1468: int constp, volatilep;
1469:
1470: /* Know if this is explicit destructor call. */
1471: int dtor_specd = 0;
1472:
1473: #ifdef GATHER_STATISTICS
1474: n_build_method_call++;
1475: #endif
1476:
1477: if (instance == error_mark_node
1478: || name == error_mark_node
1479: || parms == error_mark_node
1480: || (instance != 0 && TREE_TYPE (instance) == error_mark_node))
1481: return error_mark_node;
1482:
1483: #if 0
1484: /* C++ 2.1 does not allow this, but ANSI probably will. */
1485: if (TREE_CODE (name) == BIT_NOT_EXPR)
1486: {
1487: error ("invalid call to destructor, use qualified name `%s::~%s'",
1488: IDENTIFIER_POINTER (name), IDENTIFIER_POINTER (name));
1489: return error_mark_node;
1490: }
1491: #else
1492: if (TREE_CODE (name) == BIT_NOT_EXPR)
1493: {
1494: flags |= LOOKUP_DESTRUCTOR;
1495: name = TREE_OPERAND (name, 0);
1496: if (! is_aggr_typedef (name, 1))
1497: return error_mark_node;
1498: if (parms)
1499: error ("destructors take no parameters");
1500: basetype = IDENTIFIER_TYPE_VALUE (name);
1501: if (! TYPE_HAS_DESTRUCTOR (basetype))
1502: {
1503: #if 0 /* ARM says tp->~T() without T::~T() is valid. */
1504: error_with_aggr_type (basetype, "type `%s' has no destructor");
1505: #endif
1506: /* A destructive destructor wouldn't be a bad idea, but let's
1507: not bother for now. */
1508: return build_c_cast (void_type_node, instance);
1509: }
1510: instance = default_conversion (instance);
1511: if (TREE_CODE (TREE_TYPE (instance)) == POINTER_TYPE)
1512: instance_ptr = instance;
1513: else
1514: instance_ptr = build_unary_op (ADDR_EXPR, instance, 0);
1515: return build_delete (basetype, instance_ptr, integer_two_node,
1516: LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0, 0);
1517: }
1518: #endif
1519:
1520: if (TREE_CODE (name) == WRAPPER_EXPR)
1521: {
1522: wrap_type = TREE_OPERAND (name, 0);
1523: name = TREE_OPERAND (name, 1);
1524: wrap = 1;
1525: }
1526: else if (TREE_CODE (name) == ANTI_WRAPPER_EXPR)
1527: {
1528: wrap_type = TREE_OPERAND (name, 0);
1529: name = TREE_OPERAND (name, 1);
1530: wrap = -1;
1531: }
1532: else
1533: {
1534: wrap_type = NULL_TREE;
1535: wrap = 0;
1536: }
1537:
1538: /* Initialize name for error reporting. */
1539: if (IDENTIFIER_TYPENAME_P (name))
1540: err_name = "type conversion operator";
1541: else if (IDENTIFIER_OPNAME_P (name))
1542: {
1543: char *p = operator_name_string (name);
1544: err_name = (char *)alloca (strlen (p) + 10);
1545: sprintf (err_name, "operator %s", p);
1546: }
1547: else if (name == wrapper_name)
1548: err_name = "wrapper";
1549: else if (TREE_CODE (name) == SCOPE_REF)
1550: err_name = IDENTIFIER_POINTER (TREE_OPERAND (name, 1));
1551: else
1552: err_name = IDENTIFIER_POINTER (name);
1553:
1554: if (IDENTIFIER_OPNAME_P (name))
1555: GNU_xref_call (current_function_decl, IDENTIFIER_POINTER (name));
1556: else
1557: GNU_xref_call (current_function_decl, err_name);
1558:
1559: if (wrap)
1560: {
1561: char *p = (char *)alloca (strlen (err_name) + 32);
1562: sprintf (p, "%s for `%s'", wrap < 0 ? "anti-wrapper" : "wrapper", err_name);
1563: err_name = p;
1564: }
1565:
1566: if (instance == NULL_TREE)
1567: {
1568: basetype = NULL_TREE;
1569: /* Check cases where this is really a call to raise
1570: an exception. */
1571: if (current_class_type && TREE_CODE (name) == IDENTIFIER_NODE)
1572: {
1573: basetype = purpose_member (name, CLASSTYPE_TAGS (current_class_type));
1574: if (basetype)
1575: basetype = TREE_VALUE (basetype);
1576: }
1577: else if (TREE_CODE (name) == SCOPE_REF
1578: && TREE_CODE (TREE_OPERAND (name, 0)) == IDENTIFIER_NODE)
1579: {
1580: if (! is_aggr_typedef (TREE_OPERAND (name, 0), 1))
1581: return error_mark_node;
1582: basetype = purpose_member (TREE_OPERAND (name, 1),
1583: CLASSTYPE_TAGS (IDENTIFIER_TYPE_VALUE (TREE_OPERAND (name, 0))));
1584: if (basetype)
1585: basetype = TREE_VALUE (basetype);
1586: }
1587:
1588: if (basetype != NULL_TREE)
1589: ;
1590: /* call to a constructor... */
1591: else if (IDENTIFIER_HAS_TYPE_VALUE (name))
1592: {
1593: basetype = IDENTIFIER_TYPE_VALUE (name);
1594: name = constructor_name (basetype);
1595: }
1596: else
1597: {
1598: tree typedef_name = lookup_name (name, 1);
1599: if (typedef_name && TREE_CODE (typedef_name) == TYPE_DECL)
1600: {
1601: /* Cannonicalize the typedef name. */
1602: basetype = TREE_TYPE (typedef_name);
1603: name = TYPE_IDENTIFIER (basetype);
1604: }
1605: else
1606: {
1607: error ("no constructor named `%s' in visible scope",
1608: IDENTIFIER_POINTER (name));
1609: return error_mark_node;
1610: }
1611: }
1612: if (wrap_type && wrap_type != basetype)
1613: {
1614: error_with_aggr_type (wrap_type, "invalid constructor `%s::%s'",
1615: TYPE_NAME_STRING (basetype));
1616: return error_mark_node;
1617: }
1618: if (TYPE_VIRTUAL_P (basetype))
1619: {
1620: wrap_type = basetype;
1621: }
1622:
1623: if (! IS_AGGR_TYPE (basetype))
1624: {
1625: non_aggr_error:
1626: if ((flags & LOOKUP_COMPLAIN) && TREE_CODE (basetype) != ERROR_MARK)
1627: error ("request for member `%s' in something not a structure or union", err_name);
1628:
1629: return error_mark_node;
1630: }
1631: }
1632: else if (instance == C_C_D || instance == current_class_decl)
1633: {
1634: extern tree ctor_label, dtor_label;
1635:
1636: /* When doing initialization, we side-effect the TREE_TYPE of
1637: C_C_D, hence we cannot set up BASETYPE from CURRENT_CLASS_TYPE. */
1638: basetype = TREE_TYPE (C_C_D);
1639:
1640: /* Anything manifestly `this' in constructors and destructors
1641: has a known type, so virtual function tables are not needed. */
1642: if (TYPE_VIRTUAL_P (basetype)
1643: && !(flags & LOOKUP_NONVIRTUAL)
1644: && wrap_type == NULL_TREE)
1645: need_vtbl = (dtor_label || ctor_label)
1646: ? unneeded : maybe_needed;
1647:
1648: instance = C_C_D;
1649: instance_ptr = current_class_decl;
1650: result = build_field_call (TYPE_BINFO (current_class_type),
1651: instance_ptr, name, parms, err_name);
1652:
1653: if (result)
1654: return result;
1655: }
1656: else if (TREE_CODE (instance) == RESULT_DECL)
1657: {
1658: basetype = TREE_TYPE (instance);
1659: if (wrap_type)
1660: {
1661: if (binfo_or_else (basetype, wrap_type))
1662: basetype = wrap_type;
1663: else
1664: return error_mark_node;
1665: }
1666: /* Should we ever have to make a virtual function reference
1667: from a RESULT_DECL, know that it must be of fixed type
1668: within the scope of this function. */
1669: else if (!(flags & LOOKUP_NONVIRTUAL) && TYPE_VIRTUAL_P (basetype))
1670: need_vtbl = maybe_needed;
1671: instance_ptr = build1 (ADDR_EXPR, TYPE_POINTER_TO (basetype), instance);
1672: }
1673: else if (instance == current_exception_object)
1674: {
1675: instance_ptr = build1 (ADDR_EXPR, TYPE_POINTER_TO (current_exception_type),
1676: TREE_OPERAND (current_exception_object, 0));
1677: mark_addressable (TREE_OPERAND (current_exception_object, 0));
1678: result = build_field_call (TYPE_BINFO (current_exception_type),
1679: instance_ptr, name, parms, err_name);
1680: if (result)
1681: return result;
1682: error ("exception member `%s' cannot be invoked", err_name);
1683: return error_mark_node;
1684: }
1685: else
1686: {
1687: /* The MAIN_VARIANT of the type that `instance_ptr' winds up being. */
1688: tree inst_ptr_basetype;
1689:
1690: /* from the file "cp-typeck.c". */
1691: extern tree unary_complex_lvalue ();
1692:
1693: static_call_context = (TREE_CODE (instance) == NOP_EXPR
1694: && TREE_OPERAND (instance, 0) == error_mark_node);
1695:
1696: /* the base type of an instance variable is pointer to class */
1697: basetype = TREE_TYPE (instance);
1698:
1699: if (TREE_CODE (basetype) == REFERENCE_TYPE)
1700: {
1701: basetype = TYPE_MAIN_VARIANT (TREE_TYPE (basetype));
1702: if (! IS_AGGR_TYPE (basetype))
1703: goto non_aggr_error;
1704: /* Call to convert not needed because we are remaining
1705: within the same type. */
1706: instance_ptr = build1 (NOP_EXPR, TYPE_POINTER_TO (basetype), instance);
1707: inst_ptr_basetype = basetype;
1708: }
1709: else
1710: {
1711: if (TREE_CODE (basetype) == POINTER_TYPE)
1712: {
1713: basetype = TREE_TYPE (basetype);
1714: instance_ptr = instance;
1715: }
1716:
1717: if (! IS_AGGR_TYPE (basetype))
1718: goto non_aggr_error;
1719:
1720: if (! instance_ptr)
1721: {
1722: if ((lvalue_p (instance)
1723: && (instance_ptr = build_unary_op (ADDR_EXPR, instance, 0)))
1724: || (instance_ptr = unary_complex_lvalue (ADDR_EXPR, instance)))
1725: {
1726: if (instance_ptr == error_mark_node)
1727: return error_mark_node;
1728: }
1729: else if (TREE_CODE (instance) == NOP_EXPR
1730: || TREE_CODE (instance) == CONSTRUCTOR)
1731: {
1732: /* A cast is not an lvalue. Initialize a fresh temp
1733: with the value we are casting from, and proceed with
1734: that temporary. We can't cast to a reference type,
1735: so that simplifies the initialization to something
1736: we can manage. */
1737: tree temp = get_temp_name (TREE_TYPE (instance), 0);
1738: if (IS_AGGR_TYPE (TREE_TYPE (instance)))
1739: expand_aggr_init (temp, instance, 0);
1740: else
1741: {
1742: store_init_value (temp, instance);
1743: expand_decl_init (temp);
1744: }
1745: instance = temp;
1746: instance_ptr = build_unary_op (ADDR_EXPR, instance, 0);
1747: }
1748: else
1749: {
1750: assert (TREE_CODE (instance) == CALL_EXPR);
1751: if (TYPE_NEEDS_CONSTRUCTOR (basetype))
1752: instance = build_cplus_new (basetype, instance, 0);
1753: else
1754: {
1755: instance = get_temp_name (basetype, 0);
1756: TREE_ADDRESSABLE (instance) = 1;
1757: }
1758: instance_ptr = build_unary_op (ADDR_EXPR, instance, 0);
1759: }
1760: /* @@ Should we call comp_target_types here? */
1761: inst_ptr_basetype = TREE_TYPE (TREE_TYPE (instance_ptr));
1762: if (TYPE_MAIN_VARIANT (basetype) == TYPE_MAIN_VARIANT (inst_ptr_basetype))
1763: basetype = inst_ptr_basetype;
1764: else
1765: instance_ptr = convert (TYPE_POINTER_TO (basetype), instance_ptr);
1766: }
1767: else
1768: inst_ptr_basetype = TREE_TYPE (TREE_TYPE (instance_ptr));
1769: }
1770:
1771: if (basetype_path == NULL_TREE)
1772: basetype_path = TYPE_BINFO (inst_ptr_basetype);
1773:
1774: result = build_field_call (basetype_path, instance_ptr, name, parms, err_name);
1775: if (result)
1776: return result;
1777:
1778: if (wrap_type)
1779: {
1780: if (binfo_or_else (basetype, wrap_type))
1781: basetype = wrap_type;
1782: else
1783: return error_mark_node;
1784: }
1785: else if (!(flags & LOOKUP_NONVIRTUAL) && TYPE_VIRTUAL_P (basetype))
1786: {
1787: if (TREE_SIDE_EFFECTS (instance_ptr))
1788: {
1789: /* This action is needed because the instance is needed
1790: for providing the base of the virtual function table.
1791: Without using a SAVE_EXPR, the function we are building
1792: may be called twice, or side effects on the instance
1793: variable (such as a post-increment), may happen twice. */
1794: instance_ptr = save_expr (instance_ptr);
1795: instance = build_indirect_ref (instance_ptr, 0);
1796: }
1797: else if (TREE_CODE (TREE_TYPE (instance)) == POINTER_TYPE)
1798: {
1799: /* This happens when called for operator new (). */
1800: instance = build_indirect_ref (instance, 0);
1801: }
1802:
1803: need_vtbl = maybe_needed;
1804: }
1805: }
1806:
1807: if (TYPE_SIZE (basetype) == 0)
1808: {
1809: /* This is worth complaining about, I think. */
1810: error_with_aggr_type (basetype, "cannot lookup method in incomplete type `%s'");
1811: return error_mark_node;
1812: }
1813:
1814: /* Are we building a non-virtual wrapper? */
1815: if (flags & LOOKUP_NONVIRTUAL)
1816: {
1817: if (all_virtual)
1818: sorry ("non-virtual call with -fall-virtual");
1819: if (wrap)
1820: wrap_type = basetype;
1821: }
1822:
1823: save_basetype = basetype;
1824:
1825: #if 0
1826: if (all_virtual == 1
1827: && (! strncmp (IDENTIFIER_POINTER (name), OPERATOR_METHOD_FORMAT,
1828: OPERATOR_METHOD_LENGTH)
1829: || instance_ptr == NULL_TREE
1830: || (TYPE_OVERLOADS_METHOD_CALL_EXPR (basetype) == 0
1831: && TYPE_NEEDS_WRAPPER (basetype) == 0)))
1832: all_virtual = 0;
1833: #endif
1834:
1835: last = NULL_TREE;
1836: for (parmtypes = 0, parm = parms; parm; parm = TREE_CHAIN (parm))
1837: {
1838: tree t = TREE_TYPE (TREE_VALUE (parm));
1839: if (TREE_CODE (t) == OFFSET_TYPE)
1840: {
1841: /* Convert OFFSET_TYPE entities to their normal selves. */
1842: TREE_VALUE (parm) = resolve_offset_ref (TREE_VALUE (parm));
1843: t = TREE_TYPE (TREE_VALUE (parm));
1844: }
1845: if (TREE_CODE (t) == ARRAY_TYPE)
1846: {
1847: /* Perform the conversion from ARRAY_TYPE to POINTER_TYPE in place.
1848: This eliminates needless calls to `compute_conversion_costs'. */
1849: TREE_VALUE (parm) = default_conversion (TREE_VALUE (parm));
1850: t = TREE_TYPE (TREE_VALUE (parm));
1851: }
1852: if (t == error_mark_node)
1853: return error_mark_node;
1854: last = build_tree_list (NULL_TREE, t);
1855: parmtypes = chainon (parmtypes, last);
1856: }
1857:
1858: if (instance)
1859: {
1860: constp = TREE_READONLY (instance);
1861: volatilep = TREE_THIS_VOLATILE (instance);
1862: parms = tree_cons (NULL_TREE, instance_ptr, parms);
1863: }
1864: else
1865: {
1866: /* Raw constructors are always in charge. */
1867: if (TYPE_USES_VIRTUAL_BASECLASSES (basetype)
1868: && ! (flags & LOOKUP_HAS_IN_CHARGE))
1869: {
1870: flags |= LOOKUP_HAS_IN_CHARGE;
1871: parms = tree_cons (NULL_TREE, integer_one_node, parms);
1872: parmtypes = tree_cons (NULL_TREE, integer_type_node, parmtypes);
1873: }
1874:
1875: if (flag_this_is_variable)
1876: {
1877: constp = 0;
1878: volatilep = 0;
1879: parms = tree_cons (NULL_TREE, build1 (NOP_EXPR, TYPE_POINTER_TO (basetype), integer_zero_node), parms);
1880: }
1881: else
1882: {
1883: constp = 0;
1884: volatilep = 0;
1885: instance_ptr = build_new (NULL_TREE, basetype, void_type_node, 0);
1886: if (instance_ptr == error_mark_node)
1887: return error_mark_node;
1888: instance_ptr = save_expr (instance_ptr);
1889: TREE_CALLS_NEW (instance_ptr) = 1;
1890: instance = build_indirect_ref (instance_ptr, 0);
1891: parms = tree_cons (NULL_TREE, instance_ptr, parms);
1892: }
1893: }
1894: parmtypes = tree_cons (NULL_TREE,
1895: build_pointer_type (build_type_variant (basetype, constp, volatilep)),
1896: parmtypes);
1897: if (last == NULL_TREE)
1898: last = parmtypes;
1899:
1900: /* Look up function name in the structure type definition. */
1901:
1902: if (wrap)
1903: {
1904: if (wrap > 0)
1905: name_kind = "wrapper";
1906: else
1907: name_kind = "anti-wrapper";
1908: baselink = get_wrapper (basetype);
1909: }
1910: else
1911: {
1912: if ((IDENTIFIER_HAS_TYPE_VALUE (name)
1913: && IS_AGGR_TYPE (IDENTIFIER_TYPE_VALUE (name)))
1914: || name == constructor_name (basetype))
1915: {
1916: tree tmp = NULL_TREE;
1917: if (IDENTIFIER_TYPE_VALUE (name) == basetype
1918: || name == constructor_name (basetype))
1919: tmp = TYPE_BINFO (basetype);
1920: else
1921: tmp = get_binfo (IDENTIFIER_TYPE_VALUE (name), basetype, 0);
1922:
1923: if (tmp != 0)
1924: {
1925: name_kind = "constructor";
1926:
1927: if (TYPE_USES_VIRTUAL_BASECLASSES (basetype)
1928: && ! (flags & LOOKUP_HAS_IN_CHARGE))
1929: {
1930: /* Constructors called for initialization
1931: only are never in charge. */
1932: tree tmplist;
1933:
1934: flags |= LOOKUP_HAS_IN_CHARGE;
1935: tmplist = tree_cons (NULL_TREE, integer_zero_node,
1936: TREE_CHAIN (parms));
1937: TREE_CHAIN (parms) = tmplist;
1938: tmplist = tree_cons (NULL_TREE, integer_type_node, TREE_CHAIN (parmtypes));
1939: TREE_CHAIN (parmtypes) = tmplist;
1940: }
1941:
1942: #ifdef SOS
1943: if (TYPE_DYNAMIC (basetype) && dtbl_inserted == 0)
1944: {
1945: tree parm, parmtype;
1946: dtbl = get_sos_dtable (basetype);
1947: parm = tree_cons (NULL_TREE, dtbl, TREE_CHAIN (parms));
1948: parmtype = tree_cons (NULL_TREE, build_pointer_type (ptr_type_node), TREE_CHAIN (parmtypes));
1949: TREE_CHAIN (parms) = parm;
1950: TREE_CHAIN (parmtypes) = parmtype;
1951: dtbl_inserted = -1;
1952: }
1953: #endif
1954: /* constructors are in very specific places. */
1955: #ifdef SOS
1956: if (dtbl_inserted == -1)
1957: {
1958: TREE_CHAIN (parmtypes) = TREE_CHAIN (TREE_CHAIN (parmtypes));
1959: TREE_CHAIN (parms) = TREE_CHAIN (TREE_CHAIN (parms));
1960: dtbl_inserted = 0;
1961: }
1962: #endif
1963: basetype = BINFO_TYPE (tmp);
1964: }
1965: else
1966: name_kind = "method";
1967: }
1968: else name_kind = "method";
1969:
1970: if (basetype_path == NULL_TREE)
1971: basetype_path = TYPE_BINFO (basetype);
1972: result = lookup_fnfields (basetype_path, name,
1973: (flags & LOOKUP_COMPLAIN));
1974: if (result == error_mark_node)
1975: return error_mark_node;
1976: }
1977:
1978: /* Now, go look for this method name. We do not find destructors here.
1979:
1980: Putting `void_list_node' on the end of the parmtypes
1981: fakes out `build_decl_overload' into doing the right thing. */
1982: TREE_CHAIN (last) = void_list_node;
1983: method_name = build_decl_overload (IDENTIFIER_POINTER (name),
1984: parmtypes,
1985: 1 + (name == constructor_name (save_basetype)));
1986: TREE_CHAIN (last) = NULL_TREE;
1987:
1988: for (pass = 0; pass < 2; pass++)
1989: {
1990: struct candidate *candidates;
1991: struct candidate *cp;
1992: int len;
1993: unsigned best = 2;
1994:
1995: /* This increments every time we go up the type hierarchy.
1996: The idea is to prefer a function of the derived class if possible. */
1997: int b_or_d;
1998:
1999: baselink = result;
2000:
2001: if (pass > 0)
2002: {
2003: candidates = (struct candidate *) alloca ((ever_seen+1) * sizeof (struct candidate));
2004: cp = candidates;
2005: len = list_length (parms);
2006: b_or_d = 0;
2007:
2008: /* First see if a global function has a shot at it. */
2009: if (flags & LOOKUP_GLOBAL)
2010: {
2011: tree friend_parms;
2012: tree parm = TREE_VALUE (parms);
2013:
2014: if (TREE_CODE (TREE_TYPE (parm)) == REFERENCE_TYPE)
2015: friend_parms = parms;
2016: else if (TREE_CODE (TREE_TYPE (parm)) == POINTER_TYPE)
2017: {
2018: parm = build_indirect_ref (parm, "friendifying parms (compiler error)");
2019: parm = convert (build_reference_type (TREE_TYPE (parm)), parm);
2020: friend_parms = tree_cons (NULL_TREE, parm, TREE_CHAIN (parms));
2021: }
2022: else
2023: assert (0);
2024:
2025: cp->harshness
2026: = (unsigned short *)alloca ((len+1) * sizeof (short));
2027: result = build_overload_call (name, friend_parms, 0, cp);
2028: /* If it turns out to be the one we were actually looking for
2029: (it was probably a friend function), the return the
2030: good result. */
2031: if (TREE_CODE (result) == CALL_EXPR)
2032: return result;
2033:
2034: while (cp->evil == 0)
2035: {
2036: /* non-standard uses: set the field to 0 to indicate
2037: we are using a non-member function. */
2038: cp->u.field = 0;
2039: if (cp->harshness[len] == 0
2040: && cp->harshness[len] == 0
2041: && cp->user == 0 && cp->b_or_d == 0
2042: && cp->easy < best)
2043: best = cp->easy;
2044: cp += 1;
2045: }
2046: }
2047: }
2048:
2049: while (baselink)
2050: {
2051: /* We have a hit (of sorts). If the parameter list is
2052: "error_mark_node", or some variant thereof, it won't
2053: match any methods. Since we have verified that the is
2054: some method vaguely matching this one (in name at least),
2055: silently return.
2056:
2057: Don't stop for friends, however. */
2058: tree basetypes = TREE_PURPOSE (baselink);
2059:
2060: function = TREE_VALUE (baselink);
2061: if (TREE_CODE (basetypes) == TREE_LIST)
2062: basetypes = TREE_VALUE (basetypes);
2063: basetype = BINFO_TYPE (basetypes);
2064:
2065: /* Cast the instance variable to the approriate type. */
2066: TREE_VALUE (parmtypes) = TYPE_POINTER_TO (basetype);
2067:
2068: if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (function)))
2069: function = DECL_CHAIN (function);
2070:
2071: for (; function; function = DECL_CHAIN (function))
2072: {
2073: #ifdef GATHER_STATISTICS
2074: n_inner_fields_searched++;
2075: #endif
2076: ever_seen++;
2077:
2078: /* Not looking for friends here. */
2079: if (TREE_CODE (TREE_TYPE (function)) == FUNCTION_TYPE
2080: && ! DECL_STATIC_FUNCTION_P (function))
2081: continue;
2082:
2083: if (pass == 0
2084: && DECL_ASSEMBLER_NAME (function) == method_name)
2085: {
2086: if (flags & LOOKUP_PROTECT)
2087: {
2088: visibility = compute_visibility (basetypes, function);
2089: if (visibility == visibility_protected
2090: && flags & LOOKUP_PROTECTED_OK)
2091: visibility = visibility_public;
2092: }
2093:
2094: if ((flags & LOOKUP_PROTECT) == 0
2095: || visibility == visibility_public)
2096: goto found_and_ok;
2097: else if (visibility == visibility_private)
2098: saw_private = function;
2099: else if (visibility == visibility_protected)
2100: saw_protected = function;
2101: /* If we fail on the exact match, we have
2102: an immediate failure. */
2103: goto found;
2104: }
2105: if (pass > 0)
2106: {
2107: tree these_parms = parms;
2108:
2109: #ifdef GATHER_STATISTICS
2110: n_inner_fields_searched++;
2111: #endif
2112: cp->harshness
2113: = (unsigned short *)alloca ((len+1) * sizeof (short));
2114: if (DECL_STATIC_FUNCTION_P (function))
2115: these_parms = TREE_CHAIN (these_parms);
2116: compute_conversion_costs (function, these_parms, cp, len);
2117: cp->b_or_d += b_or_d;
2118: if (cp->evil == 0)
2119: {
2120: cp->u.field = function;
2121: cp->function = function;
2122: if (flags & LOOKUP_PROTECT)
2123: {
2124: enum visibility_type this_v;
2125: this_v = compute_visibility (basetypes, function);
2126: if (this_v == visibility_protected
2127: && (flags & LOOKUP_PROTECTED_OK))
2128: this_v = visibility_public;
2129: if (this_v != visibility_public)
2130: {
2131: if (this_v == visibility_private)
2132: saw_private = function;
2133: else
2134: saw_protected = function;
2135: continue;
2136: }
2137: }
2138:
2139: /* No "two-level" conversions. */
2140: if (flags & LOOKUP_NO_CONVERSION && cp->user != 0)
2141: continue;
2142:
2143: /* If we used default parameters, we must
2144: check to see whether anyone else might
2145: use them also, and report a possible
2146: ambiguity. */
2147: if (! TYPE_USES_MULTIPLE_INHERITANCE (save_basetype)
2148: && cp->harshness[len] == 0
2149: && CONST_HARSHNESS (cp->harshness[0]) == 0
2150: && cp->user == 0 && cp->b_or_d == 0
2151: && cp->easy < best)
2152: {
2153: if (! DECL_STATIC_FUNCTION_P (function))
2154: TREE_VALUE (parms) = cp->arg;
2155: if (best == 2)
2156: goto found_and_maybe_warn;
2157: }
2158: cp++;
2159: }
2160: }
2161: }
2162: /* Now we have run through one link's member functions.
2163: arrange to head-insert this link's links. */
2164: baselink = next_baselink (baselink);
2165: b_or_d += 1;
2166: }
2167: if (pass == 0)
2168: {
2169: /* No exact match could be found. Now try to find match
2170: using default conversions. */
2171: if ((flags & LOOKUP_GLOBAL) && IDENTIFIER_GLOBAL_VALUE (name))
2172: if (TREE_CODE (IDENTIFIER_GLOBAL_VALUE (name)) == FUNCTION_DECL)
2173: ever_seen += 1;
2174: else if (TREE_CODE (IDENTIFIER_GLOBAL_VALUE (name)) == TREE_LIST)
2175: ever_seen += list_length (IDENTIFIER_GLOBAL_VALUE (name));
2176:
2177: if (ever_seen == 0)
2178: {
2179: if (flags & LOOKUP_GLOBAL)
2180: error ("no global or member function `%s' defined", err_name);
2181: else
2182: error_with_aggr_type (save_basetype, "no member function `%s::%s'", err_name);
2183: return error_mark_node;
2184: }
2185: continue;
2186: }
2187:
2188: if (cp - candidates != 0)
2189: {
2190: /* Rank from worst to best. Then cp will point to best one.
2191: Private fields have their bits flipped. For unsigned
2192: numbers, this should make them look very large.
2193: If the best alternate has a (signed) negative value,
2194: then all we ever saw were private members. */
2195: if (cp - candidates > 1)
2196: {
2197: cp = ideal_candidate (save_basetype, candidates,
2198: cp - candidates, parms, len);
2199: if (cp == 0)
2200: {
2201: error ("ambiguous type conversion requested for %s `%s'",
2202: name_kind, err_name);
2203: return error_mark_node;
2204: }
2205: if (cp->evil)
2206: return error_mark_node;
2207: }
2208: else if (cp[-1].evil == 2)
2209: {
2210: error ("ambiguous type conversion requested for %s `%s'",
2211: name_kind, err_name);
2212: return error_mark_node;
2213: }
2214: else cp--;
2215:
2216: /* The global function was the best, so use it. */
2217: if (cp->u.field == 0)
2218: {
2219: /* We must convert the instance pointer into a reference type.
2220: Global overloaded functions can only either take
2221: aggregate objects (which come for free from references)
2222: or reference data types anyway. */
2223: TREE_VALUE (parms) = copy_node (instance_ptr);
2224: TREE_TYPE (TREE_VALUE (parms)) = build_reference_type (TREE_TYPE (TREE_TYPE (instance_ptr)));
2225: return build_function_call (cp->function, parms);
2226: }
2227:
2228: function = cp->function;
2229: if (! DECL_STATIC_FUNCTION_P (function))
2230: TREE_VALUE (parms) = cp->arg;
2231: goto found_and_maybe_warn;
2232: }
2233:
2234: if ((flags & ~LOOKUP_GLOBAL) & (LOOKUP_COMPLAIN|LOOKUP_SPECULATIVELY))
2235: {
2236: char *tag_name, *buf;
2237:
2238: if ((flags & (LOOKUP_SPECULATIVELY|LOOKUP_COMPLAIN))
2239: == LOOKUP_SPECULATIVELY)
2240: return NULL_TREE;
2241:
2242: if (DECL_STATIC_FUNCTION_P (cp->function))
2243: parms = TREE_CHAIN (parms);
2244: if (ever_seen)
2245: {
2246: if (((int)saw_protected|(int)saw_private) == 0)
2247: {
2248: if (flags & LOOKUP_SPECULATIVELY)
2249: return NULL_TREE;
2250: if (static_call_context && TREE_CODE (TREE_TYPE (cp->function)) == METHOD_TYPE)
2251: error_with_aggr_type (TREE_TYPE (TREE_TYPE (instance_ptr)),
2252: "object missing in call to `%s::%s'",
2253: err_name);
2254: else
2255: report_type_mismatch (cp, parms, name_kind, err_name);
2256: }
2257: else
2258: {
2259: char buf[80];
2260: char *msg;
2261: tree seen = saw_private;
2262:
2263: if (saw_private)
2264: if (saw_protected)
2265: msg = "%s %%s (and the like) are private or protected";
2266: else
2267: msg = "the %s %%s is private";
2268: else
2269: {
2270: msg = "the %s %%s is protected";
2271: seen = saw_protected;
2272: }
2273: sprintf (buf, msg, name_kind);
2274: error_with_decl (seen, buf);
2275: error ("within this context");
2276: }
2277: return error_mark_node;
2278: }
2279:
2280: if ((flags & (LOOKUP_SPECULATIVELY|LOOKUP_COMPLAIN))
2281: == LOOKUP_COMPLAIN)
2282: {
2283: if (TREE_CODE (save_basetype) == RECORD_TYPE)
2284: tag_name = "structure";
2285: else
2286: tag_name = "union";
2287:
2288: if (wrap)
2289: buf = "%s has no appropriate wrapper function defined";
2290: else
2291: {
2292: buf = (char *)alloca (30 + strlen (err_name));
2293: strcpy (buf, "%s has no method named `%s'");
2294: }
2295:
2296: error (buf, tag_name, err_name);
2297: return error_mark_node;
2298: }
2299: return NULL_TREE;
2300: }
2301: continue;
2302:
2303: found_and_maybe_warn:
2304: if (CONST_HARSHNESS (cp->harshness[0]))
2305: {
2306: if (flags & LOOKUP_COMPLAIN)
2307: {
2308: error_with_decl (cp->function, "non-const member function `%s'");
2309: error ("called for const object at this point in file");
2310: }
2311: /* Not good enough for a match. */
2312: else return error_mark_node;
2313: }
2314: goto found_and_ok;
2315: }
2316: /* Silently return error_mark_node. */
2317: return error_mark_node;
2318:
2319: found:
2320: if (visibility == visibility_private)
2321: {
2322: if (flags & LOOKUP_COMPLAIN)
2323: error (TREE_PRIVATE (function)
2324: ? "%s `%s' is private"
2325: : "%s `%s' is from private base class",
2326: name_kind,
2327: lang_printable_name (function));
2328: return error_mark_node;
2329: }
2330: else if (visibility == visibility_protected)
2331: {
2332: if (flags & LOOKUP_COMPLAIN)
2333: error (TREE_PROTECTED (function)
2334: ? "%s `%s' is protected"
2335: : "%s `%s' has protected visibility from this point",
2336: name_kind,
2337: lang_printable_name (function));
2338: return error_mark_node;
2339: }
2340: abort ();
2341:
2342: found_and_ok:
2343:
2344: /* From here on down, BASETYPE is the type that INSTANCE_PTR's
2345: type (if it exists) is a pointer to. */
2346: function = DECL_MAIN_VARIANT (function);
2347: /* Declare external function if necessary. */
2348: assemble_external (function);
2349:
2350: fntype = TREE_TYPE (function);
2351: if (TREE_CODE (fntype) == POINTER_TYPE)
2352: fntype = TREE_TYPE (fntype);
2353: basetype = DECL_CLASS_CONTEXT (function);
2354:
2355: /* If we are referencing a virtual function from an object
2356: of effectively static type, then there is no need
2357: to go through the virtual function table. */
2358: if (need_vtbl == maybe_needed)
2359: {
2360: int fixed_type = resolves_to_fixed_type_p (instance, 0);
2361:
2362: if (all_virtual == 1
2363: && DECL_VINDEX (function)
2364: && may_be_remote (basetype))
2365: need_vtbl = needed;
2366: else if (DECL_VINDEX (function))
2367: need_vtbl = fixed_type ? unneeded : needed;
2368: else
2369: need_vtbl = not_needed;
2370:
2371: if (fixed_type && DECL_ABSTRACT_VIRTUAL_P (function))
2372: {
2373: error_with_decl (function, "invalid call to abstract function `%s'");
2374: return error_mark_node;
2375: }
2376: }
2377:
2378: if (TREE_CODE (fntype) == METHOD_TYPE && static_call_context)
2379: {
2380: /* Let's be nice to the user for now, and give reasonable
2381: default behavior. */
2382: instance_ptr = current_class_decl;
2383: if (instance_ptr)
2384: {
2385: if (basetype != current_class_type)
2386: {
2387: tree binfo = get_binfo (basetype, current_class_type, 1);
2388: if (binfo == 0)
2389: {
2390: error_not_base_type (function, current_class_type);
2391: return error_mark_node;
2392: }
2393: else if (basetype == error_mark_node)
2394: return error_mark_node;
2395: }
2396: }
2397: else
2398: {
2399: error_with_aggr_type (basetype, "cannot call member function `%s::%s' without object",
2400: err_name);
2401: return error_mark_node;
2402: }
2403: }
2404:
2405: value_type = TREE_TYPE (fntype) ? TREE_TYPE (fntype) : void_type_node;
2406:
2407: if (TYPE_SIZE (value_type) == 0)
2408: {
2409: if (flags & LOOKUP_COMPLAIN)
2410: incomplete_type_error (0, value_type);
2411: return error_mark_node;
2412: }
2413:
2414: /* We do not pass FUNCTION into `convert_arguments', because by
2415: now everything should be ok. If not, then we have a serious error. */
2416: if (DECL_STATIC_FUNCTION_P (function))
2417: parms = convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype),
2418: TREE_CHAIN (parms), NULL_TREE, LOOKUP_NORMAL);
2419: else if (need_vtbl == unneeded)
2420: {
2421: int sub_flags = DECL_CONSTRUCTOR_P (function) ? flags : LOOKUP_NORMAL;
2422: basetype = TREE_TYPE (instance);
2423: if (TYPE_METHOD_BASETYPE (TREE_TYPE (function)) != TYPE_MAIN_VARIANT (basetype)
2424: && TYPE_USES_COMPLEX_INHERITANCE (basetype))
2425: {
2426: basetype = DECL_CLASS_CONTEXT (function);
2427: instance_ptr = convert_pointer_to (basetype, instance_ptr);
2428: instance = build_indirect_ref (instance_ptr, 0);
2429: }
2430: parms = tree_cons (NULL_TREE, instance_ptr,
2431: convert_arguments (NULL_TREE, TREE_CHAIN (TYPE_ARG_TYPES (fntype)), TREE_CHAIN (parms), NULL_TREE, sub_flags));
2432: }
2433: else
2434: {
2435: if ((flags & LOOKUP_NONVIRTUAL) == 0)
2436: basetype = DECL_CONTEXT (function);
2437:
2438: /* First parm could be integer_zerop with casts like
2439: ((Object*)0)->Object::IsA() */
2440: if (!integer_zerop (TREE_VALUE (parms)))
2441: {
2442: instance_ptr = convert_pointer_to (build_type_variant (basetype, constp, volatilep),
2443: TREE_VALUE (parms));
2444: if (TREE_CODE (instance_ptr) == COND_EXPR)
2445: {
2446: instance_ptr = save_expr (instance_ptr);
2447: instance = build_indirect_ref (instance_ptr, 0);
2448: }
2449: else if (TREE_CODE (instance_ptr) == NOP_EXPR
2450: && TREE_CODE (TREE_OPERAND (instance_ptr, 0)) == ADDR_EXPR
2451: && TREE_OPERAND (TREE_OPERAND (instance_ptr, 0), 0) == instance)
2452: ;
2453: else if (instance == NULL_TREE
2454: || TREE_CODE (instance) != INDIRECT_REF
2455: || TREE_OPERAND (instance, 0) != instance_ptr)
2456: instance = build_indirect_ref (instance_ptr, 0);
2457: }
2458: parms = tree_cons (NULL_TREE, instance_ptr,
2459: convert_arguments (NULL_TREE, TREE_CHAIN (TYPE_ARG_TYPES (fntype)), TREE_CHAIN (parms), NULL_TREE, LOOKUP_NORMAL));
2460: }
2461:
2462: /* See if there is a wrapper for this thing. */
2463: if (wrap < 0
2464: || static_call_context
2465: || name == wrapper_name
2466: || name == TYPE_IDENTIFIER (basetype))
2467: ;
2468: else if (wrap > 0 || TYPE_NEEDS_WRAPPER (basetype))
2469: {
2470: flags &= ~LOOKUP_PROTECT;
2471: if (wrap == 0)
2472: {
2473: wrap = TYPE_NEEDS_WRAPPER (basetype);
2474: /* If no wrapper specified, wrapper may be virtual. */
2475: flags &= ~LOOKUP_NONVIRTUAL;
2476: }
2477:
2478: if (wrap)
2479: {
2480: tree wrapped_result, unwrapped_result;
2481:
2482: if (!all_virtual && TREE_CODE (function) == FUNCTION_DECL)
2483: parm = build_unary_op (ADDR_EXPR, function, 0);
2484: else
2485: {
2486: fntype = build_cplus_method_type (basetype, TREE_TYPE (fntype), TYPE_ARG_TYPES (fntype));
2487: parm = build1 (NOP_EXPR, build_pointer_type (fntype), DECL_VINDEX (function));
2488: }
2489:
2490: if (TYPE_HAS_WRAPPER_PRED (basetype))
2491: {
2492: unwrapped_result = build_nt (CALL_EXPR, default_conversion (function), parms, NULL_TREE);
2493:
2494: assert (TREE_OPERAND (unwrapped_result, 1) != error_mark_node);
2495:
2496: TREE_TYPE (unwrapped_result) = value_type;
2497: TREE_SIDE_EFFECTS (unwrapped_result) = 1;
2498: TREE_RAISES (unwrapped_result) = !! TYPE_RAISES_EXCEPTIONS (fntype);
2499: }
2500:
2501: /* If this pointer walked as a result of multiple inheritance,
2502: keep its displaced value. */
2503: parms = tree_cons (NULL_TREE, parm, TREE_CHAIN (parms));
2504:
2505: wrapped_result = get_wrapper (basetype);
2506: assert (wrapped_result != NULL_TREE);
2507: assert (wrapped_result != error_mark_node);
2508:
2509: /* @@ Should BASETYPE_PATH get TREE_PURPOSE (wrapped_result) here? */
2510: wrapped_result
2511: = build_method_call (instance,
2512: DECL_NAME (TREE_VALUE (wrapped_result)),
2513: parms, basetype_path, flags);
2514: #if 0
2515: /* Do this if we want the result of operator->() to inherit
2516: the type of the function it is subbing for. */
2517: if (wrapped_result != error_mark_node)
2518: TREE_TYPE (wrapped_result) = value_type;
2519: #endif
2520:
2521: if (TYPE_HAS_WRAPPER_PRED (basetype))
2522: {
2523: result = build_conditional_expr
2524: (build_method_call (instance, wrapper_pred_name, build_tree_list (NULL_TREE, parm), basetype_path, LOOKUP_NORMAL),
2525: wrapped_result,
2526: unwrapped_result);
2527:
2528: }
2529: else
2530: {
2531: result = wrapped_result;
2532: }
2533:
2534: TREE_SIDE_EFFECTS (result) = 1;
2535: return result;
2536: }
2537: }
2538: #if 0
2539: /* Constructors do not overload method calls. */
2540: else if (TYPE_OVERLOADS_METHOD_CALL_EXPR (basetype)
2541: && name != TYPE_IDENTIFIER (basetype)
2542: && (TREE_CODE (function) != FUNCTION_DECL
2543: || strncmp (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function)),
2544: OPERATOR_METHOD_FORMAT,
2545: OPERATOR_METHOD_LENGTH))
2546: #if 0
2547: && (may_be_remote (basetype)
2548: || (C_C_D ? TREE_TYPE (instance) != current_class_type : 1))
2549: #else
2550: /* This change by Larry Ketcham. */
2551: && (may_be_remote (basetype) || instance != C_C_D)
2552: #endif
2553: )
2554: {
2555: tree fn_as_int;
2556: #ifdef ESKIT
2557: register int bytecount = 0;
2558:
2559: parms = tree_cons (NULL_TREE, build_int_2 (bytecount, 0),
2560: TREE_CHAIN (parms));
2561: #else
2562: parms = TREE_CHAIN (parms);
2563: #endif
2564:
2565: if (!all_virtual && TREE_CODE (function) == FUNCTION_DECL)
2566: fn_as_int = build_unary_op (ADDR_EXPR, function, 0);
2567: else
2568: fn_as_int = convert (TREE_TYPE (default_conversion (function)), DECL_VINDEX (function));
2569: if (all_virtual == 1)
2570: fn_as_int = convert (integer_type_node, fn_as_int);
2571:
2572: result = build_opfncall (METHOD_CALL_EXPR, LOOKUP_NORMAL, instance, fn_as_int, parms);
2573:
2574: if (result == NULL_TREE)
2575: {
2576: compiler_error ("could not overload `operator->()(...)'");
2577: return error_mark_node;
2578: }
2579: else if (result == error_mark_node)
2580: return error_mark_node;
2581:
2582: #if 0
2583: /* Do this if we want the result of operator->() to inherit
2584: the type of the function it is subbing for. */
2585: TREE_TYPE (result) = value_type;
2586: #endif
2587:
2588: #ifdef ESKIT
2589: {
2590: int used, size;
2591:
2592: /* Count the number of bytes of arguements to operator->(),
2593: not to the method itself. In the tally, don't count bytes
2594: for pointer to member function or for the bytecount. */
2595: parms = TREE_OPERAND (result, 1);
2596: bytecount = get_arglist_len_in_bytes (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (parms))));
2597: used = size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (TREE_VALUE (parms))));
2598: #ifdef PUSH_ROUNDING
2599: size = PUSH_ROUNDING (size);
2600: #endif
2601: used = (((size + PARM_BOUNDARY / BITS_PER_UNIT - 1)
2602: / (PARM_BOUNDARY / BITS_PER_UNIT))
2603: * (PARM_BOUNDARY / BITS_PER_UNIT));
2604: bytecount += used;
2605: TREE_CHAIN (TREE_CHAIN (parms))
2606: = tree_cons (NULL_TREE, build_int_2 (bytecount, 0),
2607: TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (parms))));
2608: }
2609: #endif
2610:
2611: return result;
2612: }
2613: #endif
2614:
2615: if (need_vtbl == needed)
2616: {
2617: function = build_vfn_ref (&TREE_VALUE (parms), instance, DECL_VINDEX (function));
2618: TREE_TYPE (function) = build_pointer_type (fntype);
2619: }
2620: #ifdef SOS
2621: else if (basetype && TYPE_DYNAMIC (basetype))
2622: {
2623: function = build_array_ref (dtbl, DECL_DINDEX (function));
2624: TREE_TYPE (function) = build_pointer_type (fntype);
2625: }
2626: #endif
2627:
2628: if (TREE_CODE (function) == FUNCTION_DECL)
2629: GNU_xref_call (current_function_decl,
2630: IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function)));
2631:
2632: if (TREE_CODE (function) == FUNCTION_DECL)
2633: {
2634: if (TREE_INLINE (function))
2635: function = build1 (ADDR_EXPR, build_pointer_type (fntype), function);
2636: else
2637: {
2638: if (TREE_EXTERNAL (function))
2639: assemble_external (function);
2640: TREE_USED (function) = 1;
2641: function = default_conversion (function);
2642: }
2643: }
2644: else
2645: function = default_conversion (function);
2646:
2647: result =
2648: build_nt (CALL_EXPR, function, parms, NULL_TREE);
2649:
2650: TREE_TYPE (result) = value_type;
2651: TREE_SIDE_EFFECTS (result) = 1;
2652: TREE_RAISES (result)
2653: = TYPE_RAISES_EXCEPTIONS (fntype) || (parms && TREE_RAISES (parms));
2654: return result;
2655: }
2656:
2657: /* Similar to `build_method_call', but for overloaded non-member functions.
2658: The name of this function comes through NAME. The name depends
2659: on PARMS.
2660:
2661: Note that this function must handle simple `C' promotions,
2662: as well as variable numbers of arguments (...), and
2663: default arguments to boot.
2664:
2665: If the overloading is successful, we return a tree node which
2666: contains the call to the function.
2667:
2668: If overloading produces candidates which are probable, but not definite,
2669: we hold these candidates. If FINAL_CP is non-zero, then we are free
2670: to assume that final_cp points to enough storage for all candidates that
2671: this function might generate. The `harshness' array is preallocated for
2672: the first candidate, but not for subsequent ones.
2673:
2674: Note that the DECL_RTL of FUNCTION must be made to agree with this
2675: function's new name. */
2676:
2677: tree
2678: build_overload_call_real (fnname, parms, complain, final_cp, buildxxx)
2679: tree fnname, parms;
2680: int complain;
2681: struct candidate *final_cp;
2682: int buildxxx;
2683: {
2684: extern tree build_function_call_maybe ();
2685:
2686: /* must check for overloading here */
2687: tree overload_name, functions, function, parm;
2688: tree parmtypes = NULL_TREE, last = NULL_TREE;
2689: register tree outer;
2690: int length;
2691: int parmlength = list_length (parms);
2692:
2693: struct candidate *candidates, *cp;
2694: int rank_for_overload ();
2695:
2696: if (final_cp)
2697: {
2698: final_cp[0].evil = 0;
2699: final_cp[0].user = 0;
2700: final_cp[0].b_or_d = 0;
2701: final_cp[0].easy = 0;
2702: final_cp[0].function = 0;
2703: /* end marker. */
2704: final_cp[1].evil = 1;
2705: }
2706:
2707: for (parm = parms; parm; parm = TREE_CHAIN (parm))
2708: {
2709: register tree t = TREE_TYPE (TREE_VALUE (parm));
2710:
2711: if (t == error_mark_node)
2712: return error_mark_node;
2713: if (TREE_CODE (t) == ARRAY_TYPE || TREE_CODE (t) == OFFSET_TYPE)
2714: {
2715: /* Perform the conversion from ARRAY_TYPE to POINTER_TYPE in place.
2716: Also convert OFFSET_TYPE entities to their normal selves.
2717: This eliminates needless calls to `compute_conversion_costs'. */
2718: TREE_VALUE (parm) = default_conversion (TREE_VALUE (parm));
2719: t = TREE_TYPE (TREE_VALUE (parm));
2720: }
2721: last = build_tree_list (NULL_TREE, t);
2722: parmtypes = chainon (parmtypes, last);
2723: }
2724: if (last)
2725: TREE_CHAIN (last) = void_list_node;
2726: else
2727: parmtypes = void_list_node;
2728: overload_name = build_decl_overload (IDENTIFIER_POINTER (fnname), parmtypes, 0);
2729:
2730: /* Now check to see whether or not we can win.
2731: Note that if we are called from `build_method_call',
2732: then we cannot have a mis-match, because we would have
2733: already found such a winning case. */
2734:
2735: if (IDENTIFIER_GLOBAL_VALUE (overload_name))
2736: if (TREE_CODE (IDENTIFIER_GLOBAL_VALUE (overload_name)) != TREE_LIST)
2737: return build_function_call (DECL_MAIN_VARIANT (IDENTIFIER_GLOBAL_VALUE (overload_name)), parms);
2738:
2739: functions = IDENTIFIER_GLOBAL_VALUE (fnname);
2740:
2741: if (functions == NULL_TREE)
2742: {
2743: if (complain)
2744: error ("only member functions apply");
2745: if (final_cp)
2746: final_cp->evil = 1;
2747: return error_mark_node;
2748: }
2749:
2750: if (TREE_CODE (functions) == FUNCTION_DECL)
2751: {
2752: functions = DECL_MAIN_VARIANT (functions);
2753: if (final_cp)
2754: {
2755: /* We are just curious whether this is a viable alternative or not. */
2756: compute_conversion_costs (functions, parms, final_cp, parmlength);
2757: return functions;
2758: }
2759: else
2760: return build_function_call (functions, parms);
2761: }
2762:
2763: if (TREE_VALUE (functions) == NULL_TREE)
2764: {
2765: if (complain)
2766: error ("function `%s' declared overloaded, but no instances of that function declared",
2767: IDENTIFIER_POINTER (TREE_PURPOSE (functions)));
2768: return error_mark_node;
2769: }
2770:
2771: if (TREE_CODE (TREE_VALUE (functions)) == TREE_LIST)
2772: {
2773: register tree outer;
2774: length = 0;
2775:
2776: /* The list-of-lists should only occur for class things. */
2777: assert (functions == IDENTIFIER_CLASS_VALUE (fnname));
2778:
2779: for (outer = functions; outer; outer = TREE_CHAIN (outer))
2780: {
2781: /* member functions. */
2782: length += decl_list_length (TREE_VALUE (TREE_VALUE (outer)));
2783: /* friend functions. */
2784: length += list_length (TREE_TYPE (TREE_VALUE (outer)));
2785: }
2786: }
2787: else
2788: {
2789: length = list_length (functions);
2790: }
2791:
2792: if (final_cp)
2793: candidates = final_cp;
2794: else
2795: candidates = (struct candidate *)alloca ((length+1) * sizeof (struct candidate));
2796:
2797: cp = candidates;
2798:
2799: assert (TREE_CODE (TREE_VALUE (functions)) != TREE_LIST);
2800: /* OUTER is the list of FUNCTION_DECLS, in a TREE_LIST. */
2801:
2802: for (outer = functions; outer; outer = TREE_CHAIN (outer))
2803: {
2804: int template_cost = 0;
2805: function = TREE_VALUE (outer);
2806: if (TREE_CODE (function) != FUNCTION_DECL
2807: && ! (TREE_CODE (function) == TEMPLATE_DECL
2808: && ! DECL_TEMPLATE_IS_CLASS (function)
2809: && TREE_CODE (DECL_TEMPLATE_RESULT (function)) == FUNCTION_DECL))
2810: {
2811: enum tree_code code = TREE_CODE (function);
2812: if (code == TEMPLATE_DECL)
2813: code = TREE_CODE (DECL_TEMPLATE_RESULT (function));
2814: if (code == CONST_DECL)
2815: error_with_decl (function, "enumeral value `%s' conflicts with function of same name");
2816: else if (code == VAR_DECL)
2817: if (TREE_STATIC (function))
2818: error_with_decl (function, "variable `%s' conflicts with function of same name");
2819: else
2820: error_with_decl (function, "constant field `%s' conflicts with function of same name");
2821: else if (code == TYPE_DECL)
2822: continue;
2823: else abort ();
2824: error ("at this point in file");
2825: continue;
2826: }
2827: if (TREE_CODE (function) == TEMPLATE_DECL)
2828: {
2829: int ntparms = TREE_VEC_LENGTH (DECL_TEMPLATE_PARMS (function));
2830: tree *targs = (tree *) alloca (sizeof (tree) * ntparms);
2831: int i;
2832:
2833: i = type_unification (DECL_TEMPLATE_PARMS (function), targs,
2834: TYPE_ARG_TYPES (TREE_TYPE (function)),
2835: parms, &template_cost);
2836: if (i == 0)
2837: function = instantiate_template (function, targs);
2838: }
2839: if (TREE_CODE (function) == TEMPLATE_DECL)
2840: /* Unconverted template -- failed match. */
2841: cp->evil = 1, cp->function = function, cp->u.bad_arg = -4;
2842: else
2843: {
2844: function = DECL_MAIN_VARIANT (function);
2845:
2846: /* Can't use alloca here, since result might be
2847: passed to calling function. */
2848: cp->harshness
2849: = (unsigned short *)oballoc ((parmlength+1) * sizeof (short));
2850: compute_conversion_costs (function, parms, cp, parmlength);
2851: /* Should really add another field... */
2852: cp->easy = cp->easy * 128 + template_cost;
2853: if (cp[0].evil == 0)
2854: {
2855: cp[1].evil = 1;
2856: if (final_cp
2857: && cp[0].user == 0 && cp[0].b_or_d == 0
2858: && template_cost == 0
2859: && cp[0].easy <= 1)
2860: {
2861: final_cp[0].easy = cp[0].easy;
2862: return function;
2863: }
2864: cp++;
2865: }
2866: }
2867: }
2868:
2869: if (cp - candidates)
2870: {
2871: tree rval = error_mark_node;
2872:
2873: /* Leave marker. */
2874: cp[0].evil = 1;
2875: if (cp - candidates > 1)
2876: {
2877: struct candidate *best_cp
2878: = ideal_candidate (NULL_TREE, candidates,
2879: cp - candidates, parms, parmlength);
2880: if (best_cp == 0)
2881: {
2882: if (complain)
2883: error ("call of overloaded `%s' is ambiguous", IDENTIFIER_POINTER (fnname));
2884: return error_mark_node;
2885: }
2886: else
2887: rval = best_cp->function;
2888: }
2889: else
2890: {
2891: cp -= 1;
2892: if (cp->evil > 1)
2893: {
2894: if (complain)
2895: error ("type conversion ambiguous");
2896: }
2897: else
2898: rval = cp->function;
2899: }
2900:
2901: if (final_cp)
2902: return rval;
2903:
2904: return buildxxx ? build_function_call_maybe (rval, parms)
2905: : build_function_call (rval, parms);
2906: }
2907: else if (complain)
2908: {
2909: tree name;
2910: char *err_name;
2911: /* Initialize name for error reporting. */
2912: if (TREE_CODE (functions) == TREE_LIST)
2913: name = TREE_PURPOSE (functions);
2914: else
2915: name = DECL_NAME (functions);
2916:
2917: if (IDENTIFIER_OPNAME_P (name))
2918: {
2919: char *opname = operator_name_string (name);
2920: err_name = (char *)alloca (strlen (opname) + 12);
2921: sprintf (err_name, "operator %s", opname);
2922: }
2923: else
2924: err_name = IDENTIFIER_POINTER (name);
2925:
2926: report_type_mismatch (cp, parms, "function", err_name);
2927: }
2928: return error_mark_node;
2929: }
2930:
2931: tree
2932: build_overload_call (fnname, parms, complain, final_cp)
2933: tree fnname, parms;
2934: int complain;
2935: struct candidate *final_cp;
2936: {
2937: return build_overload_call_real (fnname, parms, complain, final_cp, 0);
2938: }
2939:
2940: tree
2941: build_overload_call_maybe (fnname, parms, complain, final_cp)
2942: tree fnname, parms;
2943: int complain;
2944: struct candidate *final_cp;
2945: {
2946: return build_overload_call_real (fnname, parms, complain, final_cp, 1);
2947: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.