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