|
|
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 "cp-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 cp-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 int convert_harshness_old (); ! 48: static struct harshness_code convert_harshness_ansi (); ! 49: ! 50: /* OLD METHOD */ ! 51: /* Note the old method also uses USER_HARSHNESS, BASE_DERIVED_HARSHNESS, ! 52: CONST_HARSHNESS. */ ! 53: #define EVIL 1 ! 54: #define TRIVIAL 0 ! 55: #define EVIL_HARSHNESS(ARG) ((ARG) & 1) ! 56: #define ELLIPSIS_HARSHNESS(ARG) ((ARG) & 2) ! 57: #define CONTRAVARIANT_HARSHNESS(ARG) ((ARG) & 8) ! 58: #define INT_TO_BD_HARSHNESS(ARG) (((ARG) << 5) | 16) ! 59: #define INT_FROM_BD_HARSHNESS(ARG) ((ARG) >> 5) ! 60: #define INT_TO_EASY_HARSHNESS(ARG) ((ARG) << 5) ! 61: #define INT_FROM_EASY_HARSHNESS(ARG) ((ARG) >> 5) ! 62: #define ONLY_EASY_HARSHNESS(ARG) (((ARG) & 31) == 0) ! 63: ! 64: ! 65: /* NEW METHOD */ ! 66: #define EVIL_RETURN(ARG) ((ARG).code = EVIL_CODE, (ARG)) ! 67: #define QUAL_RETURN(ARG) ((ARG).code = QUAL_CODE, (ARG)) ! 68: #define TRIVIAL_RETURN(ARG) ((ARG).code = TRIVIAL_CODE, (ARG)) ! 69: #define ZERO_RETURN(ARG) ((ARG).code = 0, (ARG)) ! 70: ! 71: #define USER_HARSHNESS(ARG) ((ARG) & 4) ! 72: #define BASE_DERIVED_HARSHNESS(ARG) ((ARG) & 16) ! 73: #define CONST_HARSHNESS(ARG) ((ARG) & 2048) ! 74: ! 75: /* Ordering function for overload resolution. Compare two candidates ! 76: by gross quality. */ ! 77: int ! 78: rank_for_overload_ansi (x, y) ! 79: struct candidate *x, *y; ! 80: { ! 81: if (y->h.code & (EVIL_CODE|ELLIPSIS_CODE|USER_CODE)) ! 82: return y->h.code - x->h.code; ! 83: if (x->h.code & (EVIL_CODE|ELLIPSIS_CODE|USER_CODE)) ! 84: return -1; ! 85: ! 86: /* This is set by compute_conversion_costs, for calling a non-const ! 87: member function from a const member function. */ ! 88: if ((y->v.ansi_harshness[0].code & CONST_CODE) ^ (x->v.ansi_harshness[0].code & CONST_CODE)) ! 89: return y->v.ansi_harshness[0].code - x->v.ansi_harshness[0].code; ! 90: ! 91: if (y->h.code & STD_CODE) ! 92: { ! 93: if (x->h.code & STD_CODE) ! 94: return y->h.distance - x->h.distance; ! 95: return 1; ! 96: } ! 97: if (x->h.code & STD_CODE) ! 98: return -1; ! 99: ! 100: return y->h.code - x->h.code; ! 101: } ! 102: ! 103: int ! 104: rank_for_overload_old (x, y) ! 105: struct candidate *x, *y; ! 106: { ! 107: if (y->evil - x->evil) ! 108: return y->evil - x->evil; ! 109: if (CONST_HARSHNESS (y->v.old_harshness[0]) ^ CONST_HARSHNESS (x->v.old_harshness[0])) ! 110: return y->v.old_harshness[0] - x->v.old_harshness[0]; ! 111: if (y->ellipsis - x->ellipsis) ! 112: return y->ellipsis - x->ellipsis; ! 113: if (y->user - x->user) ! 114: return y->user - x->user; ! 115: if (y->b_or_d - x->b_or_d) ! 116: return y->b_or_d - x->b_or_d; ! 117: return y->easy - x->easy; ! 118: } ! 119: ! 120: int ! 121: rank_for_overload (x, y) ! 122: struct candidate *x, *y; ! 123: { ! 124: if (flag_ansi_overloading) ! 125: return rank_for_overload_ansi (x, y); ! 126: else ! 127: return rank_for_overload_old (x, y); ! 128: } ! 129: ! 130: /* Compare two candidates, argument by argument. */ ! 131: int ! 132: rank_for_ideal (x, y) ! 133: struct candidate *x, *y; ! 134: { ! 135: int i; ! 136: ! 137: if (x->h_len != y->h_len) ! 138: abort (); ! 139: ! 140: for (i = 0; i < x->h_len; i++) ! 141: { ! 142: if (y->v.ansi_harshness[i].code - x->v.ansi_harshness[i].code) ! 143: return y->v.ansi_harshness[i].code - x->v.ansi_harshness[i].code; ! 144: if ((y->v.ansi_harshness[i].code & STD_CODE) ! 145: && (y->v.ansi_harshness[i].distance - x->v.ansi_harshness[i].distance)) ! 146: return y->v.ansi_harshness[i].distance - x->v.ansi_harshness[i].distance; ! 147: ! 148: /* They're both the same code. Now see if we're dealing with an ! 149: integral promotion that needs a finer grain of accuracy. */ ! 150: if (y->v.ansi_harshness[0].code & PROMO_CODE ! 151: && (y->v.ansi_harshness[i].int_penalty ^ x->v.ansi_harshness[i].int_penalty)) ! 152: return y->v.ansi_harshness[i].int_penalty - x->v.ansi_harshness[i].int_penalty; ! 153: } ! 154: return 0; ! 155: } ! 156: ! 157: /* TYPE is the type we wish to convert to. PARM is the parameter ! 158: we have to work with. We use a somewhat arbitrary cost function ! 159: to measure this conversion. */ ! 160: static struct harshness_code ! 161: convert_harshness_ansi (type, parmtype, parm) ! 162: register tree type, parmtype; ! 163: tree parm; ! 164: { ! 165: struct harshness_code h; ! 166: register enum tree_code codel; ! 167: register enum tree_code coder; ! 168: ! 169: h.code = 0; ! 170: h.distance = 0; ! 171: h.int_penalty = 0; ! 172: ! 173: #ifdef GATHER_STATISTICS ! 174: n_convert_harshness++; ! 175: #endif ! 176: ! 177: if (TYPE_PTRMEMFUNC_P (type)) ! 178: type = TYPE_PTRMEMFUNC_FN_TYPE (type); ! 179: if (TYPE_PTRMEMFUNC_P (parmtype)) ! 180: parmtype = TYPE_PTRMEMFUNC_FN_TYPE (parmtype); ! 181: ! 182: codel = TREE_CODE (type); ! 183: coder = TREE_CODE (parmtype); ! 184: ! 185: if (TYPE_MAIN_VARIANT (parmtype) == TYPE_MAIN_VARIANT (type)) ! 186: return ZERO_RETURN (h); ! 187: ! 188: if (coder == ERROR_MARK) ! 189: return EVIL_RETURN (h); ! 190: ! 191: if (codel == POINTER_TYPE ! 192: && (coder == METHOD_TYPE || coder == FUNCTION_TYPE)) ! 193: { ! 194: tree p1, p2; ! 195: struct harshness_code h1, h2; ! 196: ! 197: /* Get to the METHOD_TYPE or FUNCTION_TYPE that this might be. */ ! 198: type = TREE_TYPE (type); ! 199: ! 200: if (coder != TREE_CODE (type)) ! 201: return EVIL_RETURN (h); ! 202: ! 203: /* We allow the default conversion between function type ! 204: and pointer-to-function type for free. */ ! 205: if (type == parmtype) ! 206: return ZERO_RETURN (h); ! 207: ! 208: /* Compare return types. */ ! 209: p1 = TREE_TYPE (type); ! 210: p2 = TREE_TYPE (parmtype); ! 211: h2 = convert_harshness_ansi (p1, p2, NULL_TREE); ! 212: if (h2.code & EVIL_CODE) ! 213: return h2; ! 214: ! 215: h1.code = TRIVIAL_CODE; ! 216: h1.distance = 0; ! 217: ! 218: if (h2.distance != 0) ! 219: { ! 220: tree binfo; ! 221: ! 222: /* This only works for pointers. */ ! 223: if (TREE_CODE (p1) != POINTER_TYPE ! 224: && TREE_CODE (p1) != REFERENCE_TYPE) ! 225: return EVIL_RETURN (h); ! 226: ! 227: p1 = TREE_TYPE (p1); ! 228: p2 = TREE_TYPE (p2); ! 229: /* Don't die if we happen to be dealing with void*. */ ! 230: if (!IS_AGGR_TYPE (p1) || !IS_AGGR_TYPE (p2)) ! 231: return EVIL_RETURN (h); ! 232: if (h2.distance < 0) ! 233: binfo = get_binfo (p2, p1, 0); ! 234: else ! 235: binfo = get_binfo (p1, p2, 0); ! 236: ! 237: if (! BINFO_OFFSET_ZEROP (binfo)) ! 238: { ! 239: static int explained = 0; ! 240: if (h2.distance < 0) ! 241: message_2_types (sorry, "cannot cast `%d' to `%d' at function call site", p2, p1); ! 242: else ! 243: message_2_types (sorry, "cannot cast `%d' to `%d' at function call site", p1, p2); ! 244: ! 245: if (! explained++) ! 246: sorry ("(because pointer values change during conversion)"); ! 247: return EVIL_RETURN (h); ! 248: } ! 249: } ! 250: ! 251: h1.code |= h2.code; ! 252: if (h2.distance > h1.distance) ! 253: h1.distance = h2.distance; ! 254: ! 255: p1 = TYPE_ARG_TYPES (type); ! 256: p2 = TYPE_ARG_TYPES (parmtype); ! 257: while (p1 && TREE_VALUE (p1) != void_type_node ! 258: && p2 && TREE_VALUE (p2) != void_type_node) ! 259: { ! 260: h2 = convert_harshness_ansi (TREE_VALUE (p1), TREE_VALUE (p2), ! 261: NULL_TREE); ! 262: if (h2.code & EVIL_CODE) ! 263: return h2; ! 264: ! 265: if (h2.distance) ! 266: { ! 267: /* This only works for pointers and references. */ ! 268: if (TREE_CODE (TREE_VALUE (p1)) != POINTER_TYPE ! 269: && TREE_CODE (TREE_VALUE (p1)) != REFERENCE_TYPE) ! 270: return EVIL_RETURN (h); ! 271: h2.distance = - h2.distance; ! 272: } ! 273: ! 274: h1.code |= h2.code; ! 275: if (h2.distance > h1.distance) ! 276: h1.distance = h2.distance; ! 277: p1 = TREE_CHAIN (p1); ! 278: p2 = TREE_CHAIN (p2); ! 279: } ! 280: if (p1 == p2) ! 281: return h1; ! 282: if (p2) ! 283: { ! 284: if (p1) ! 285: return EVIL_RETURN (h); ! 286: h1.code |= ELLIPSIS_CODE; ! 287: return h1; ! 288: } ! 289: if (p1) ! 290: { ! 291: if (TREE_PURPOSE (p1) == NULL_TREE) ! 292: h1.code |= EVIL_CODE; ! 293: return h1; ! 294: } ! 295: } ! 296: else if (codel == POINTER_TYPE && coder == OFFSET_TYPE) ! 297: { ! 298: /* Get to the OFFSET_TYPE that this might be. */ ! 299: type = TREE_TYPE (type); ! 300: ! 301: if (coder != TREE_CODE (type)) ! 302: return EVIL_RETURN (h); ! 303: ! 304: if (TYPE_OFFSET_BASETYPE (type) == TYPE_OFFSET_BASETYPE (parmtype)) ! 305: h.code = 0; ! 306: else if (UNIQUELY_DERIVED_FROM_P (TYPE_OFFSET_BASETYPE (type), ! 307: TYPE_OFFSET_BASETYPE (parmtype))) ! 308: { ! 309: h.code = STD_CODE; ! 310: h.distance = 1; ! 311: } ! 312: else if (UNIQUELY_DERIVED_FROM_P (TYPE_OFFSET_BASETYPE (parmtype), ! 313: TYPE_OFFSET_BASETYPE (type))) ! 314: { ! 315: h.code = STD_CODE; ! 316: h.distance = -1; ! 317: } ! 318: else ! 319: return EVIL_RETURN (h); ! 320: /* Now test the OFFSET_TYPE's target compatibility. */ ! 321: type = TREE_TYPE (type); ! 322: parmtype = TREE_TYPE (parmtype); ! 323: } ! 324: ! 325: if (coder == UNKNOWN_TYPE) ! 326: { ! 327: if (codel == FUNCTION_TYPE ! 328: || codel == METHOD_TYPE ! 329: || (codel == POINTER_TYPE ! 330: && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE ! 331: || TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE))) ! 332: return TRIVIAL_RETURN (h); ! 333: return EVIL_RETURN (h); ! 334: } ! 335: ! 336: if (coder == VOID_TYPE) ! 337: return EVIL_RETURN (h); ! 338: ! 339: if (codel == ENUMERAL_TYPE || codel == INTEGER_TYPE) ! 340: { ! 341: /* Control equivalence of ints an enums. */ ! 342: ! 343: if (codel == ENUMERAL_TYPE ! 344: && flag_int_enum_equivalence == 0) ! 345: { ! 346: /* Enums can be converted to ints, but not vice-versa. */ ! 347: if (coder != ENUMERAL_TYPE ! 348: || TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (parmtype)) ! 349: return EVIL_RETURN (h); ! 350: } ! 351: ! 352: /* else enums and ints (almost) freely interconvert. */ ! 353: ! 354: if (coder == INTEGER_TYPE || coder == ENUMERAL_TYPE) ! 355: { ! 356: if ((TREE_UNSIGNED (type) ^ TREE_UNSIGNED (parmtype)) ! 357: || codel != coder ! 358: || TYPE_MODE (type) != TYPE_MODE (parmtype)) ! 359: { ! 360: /* Make sure a value-preserving condition [from a smaller type to ! 361: a larger type] is preferred to a possibly value-destroying ! 362: standard conversion [from a larger type to a smaller type]. */ ! 363: if (TYPE_PRECISION (type) >= TYPE_PRECISION (parmtype)) ! 364: { ! 365: h.code = PROMO_CODE; ! 366: /* A char, short, wchar_t, etc., should promote to an int if ! 367: it can handle it, otherwise to an unsigned. So we'll make ! 368: an unsigned. */ ! 369: if (type != integer_type_node) ! 370: h.int_penalty = 1; ! 371: } ! 372: else ! 373: h.code = STD_CODE; ! 374: } ! 375: ! 376: /* If the three above conditions didn't trigger, we have found two ! 377: very similar types. On systems where they're the same size, we ! 378: can end up here with TYPE as `long' and PARMTYPE as `int'. Make ! 379: sure we realize that, even though they're the same mode, we will ! 380: have to do some sort of integral promotion on the type, since ! 381: they're not the same. */ ! 382: if (! comptypes (type, parmtype, 1) && h.code == 0) ! 383: { ! 384: /* This call to common_type will return the best type for the ! 385: combination. If it matches TYPE, that means we'll be converting ! 386: from a so-called smaller type (in PARMTYPE) to the larger in TYPE, ! 387: thus an integral promotion. Otherwise, it must be going from a ! 388: larger type in PARMTYPE to a smaller expected type in TYPE, so we ! 389: make it a standard conversion instead. */ ! 390: if (common_type (type, parmtype) == type) ! 391: h.code = PROMO_CODE; ! 392: else ! 393: h.code = STD_CODE; ! 394: } ! 395: ! 396: return h; ! 397: } ! 398: else if (coder == REAL_TYPE) ! 399: { ! 400: h.code = STD_CODE; ! 401: h.distance = 0; ! 402: return h; ! 403: } ! 404: } ! 405: ! 406: if (codel == REAL_TYPE) ! 407: { ! 408: if (coder == REAL_TYPE) ! 409: { ! 410: /* Shun converting between float and double if a choice exists. */ ! 411: if (TYPE_MODE (type) != TYPE_MODE (parmtype)) ! 412: { ! 413: h.code = PROMO_CODE; ! 414: return h; ! 415: } ! 416: return ZERO_RETURN (h); ! 417: } ! 418: else if (coder == INTEGER_TYPE || coder == ENUMERAL_TYPE) ! 419: { ! 420: h.code = STD_CODE; ! 421: h.distance = 0; ! 422: return h; ! 423: } ! 424: } ! 425: ! 426: /* Convert arrays which have not previously been converted. */ ! 427: if (codel == ARRAY_TYPE) ! 428: codel = POINTER_TYPE; ! 429: if (coder == ARRAY_TYPE) ! 430: coder = POINTER_TYPE; ! 431: ! 432: /* Conversions among pointers */ ! 433: if (codel == POINTER_TYPE && coder == POINTER_TYPE) ! 434: { ! 435: register tree ttl = TYPE_MAIN_VARIANT (TREE_TYPE (type)); ! 436: register tree ttr = TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)); ! 437: int penalty = 4 * (ttl != ttr); ! 438: ! 439: /* Anything converts to void *. void * converts to anything. ! 440: Since these may be `const void *' (etc.) use VOID_TYPE ! 441: instead of void_type_node. Otherwise, the targets must be the same, ! 442: except that we do allow (at some cost) conversion between signed and ! 443: unsinged pointer types. */ ! 444: ! 445: if ((TREE_CODE (ttl) == METHOD_TYPE ! 446: || TREE_CODE (ttl) == FUNCTION_TYPE) ! 447: && TREE_CODE (ttl) == TREE_CODE (ttr)) ! 448: { ! 449: if (comptypes (ttl, ttr, -1)) ! 450: { ! 451: h.code = penalty ? STD_CODE : 0; ! 452: h.distance = 0; ! 453: } ! 454: else ! 455: h.code = EVIL_CODE; ! 456: return h; ! 457: } ! 458: ! 459: #if 1 ! 460: if (TREE_CODE (ttl) != VOID_TYPE && TREE_CODE (ttr) != VOID_TYPE) ! 461: { ! 462: if (TREE_UNSIGNED (ttl) != TREE_UNSIGNED (ttr)) ! 463: { ! 464: ttl = unsigned_type (ttl); ! 465: ttr = unsigned_type (ttr); ! 466: penalty = 10; ! 467: } ! 468: if (! comp_target_types (ttl, ttr, 0)) ! 469: return EVIL_RETURN (h); ! 470: } ! 471: #else ! 472: if (!(TREE_CODE (ttl) == VOID_TYPE ! 473: || TREE_CODE (ttr) == VOID_TYPE ! 474: || (TREE_UNSIGNED (ttl) ^ TREE_UNSIGNED (ttr) ! 475: && (ttl = unsigned_type (ttl), ! 476: ttr = unsigned_type (ttr), ! 477: penalty = 10, 0)) ! 478: || (comp_target_types (ttl, ttr, 0)))) ! 479: return EVIL_RETURN (h); ! 480: #endif ! 481: ! 482: if (penalty == 10 || ttr == ttl) ! 483: { ! 484: tree tmp1 = TREE_TYPE (type), tmp2 = TREE_TYPE (parmtype); ! 485: ! 486: /* If one was unsigned but the other wasn't, then we need to ! 487: do a standard conversion from T to unsigned T. */ ! 488: if (penalty == 10) ! 489: h.code = PROMO_CODE; /* was STD_CODE */ ! 490: else ! 491: h.code = 0; ! 492: ! 493: /* Note conversion from `T*' to `const T*', ! 494: or `T*' to `volatile T*'. */ ! 495: if (ttl == ttr ! 496: && ((TYPE_READONLY (tmp1) != TREE_READONLY (tmp2)) ! 497: || (TYPE_VOLATILE (tmp1) != TYPE_VOLATILE (tmp2)))) ! 498: h.code |= QUAL_CODE; ! 499: ! 500: h.distance = 0; ! 501: return h; ! 502: } ! 503: ! 504: ! 505: if (TREE_CODE (ttl) == RECORD_TYPE && TREE_CODE (ttr) == RECORD_TYPE) ! 506: { ! 507: int b_or_d = get_base_distance (ttl, ttr, 0, 0); ! 508: if (b_or_d < 0) ! 509: { ! 510: b_or_d = get_base_distance (ttr, ttl, 0, 0); ! 511: if (b_or_d < 0) ! 512: return EVIL_RETURN (h); ! 513: h.distance = -b_or_d; ! 514: } ! 515: else ! 516: h.distance = b_or_d; ! 517: h.code = STD_CODE; ! 518: return h; ! 519: } ! 520: ! 521: /* If converting from a `class*' to a `void*', make it ! 522: less favorable than any inheritance relationship. */ ! 523: if (TREE_CODE (ttl) == VOID_TYPE && IS_AGGR_TYPE (ttr)) ! 524: { ! 525: h.code = STD_CODE; ! 526: h.distance = CLASSTYPE_MAX_DEPTH (ttr)+1; ! 527: return h; ! 528: } ! 529: h.code = penalty ? STD_CODE : PROMO_CODE; ! 530: return h; ! 531: } ! 532: ! 533: if (codel == POINTER_TYPE && coder == INTEGER_TYPE) ! 534: { ! 535: /* This is not a bad match, but don't let it beat ! 536: integer-enum combinations. */ ! 537: if (parm && integer_zerop (parm)) ! 538: { ! 539: h.code = STD_CODE; ! 540: h.distance = 0; ! 541: return h; ! 542: } ! 543: } ! 544: ! 545: /* C++: one of the types must be a reference type. */ ! 546: { ! 547: tree ttl, ttr; ! 548: register tree intype = TYPE_MAIN_VARIANT (parmtype); ! 549: register enum tree_code form = TREE_CODE (intype); ! 550: int penalty; ! 551: ! 552: if (codel == REFERENCE_TYPE || coder == REFERENCE_TYPE) ! 553: { ! 554: ttl = TYPE_MAIN_VARIANT (type); ! 555: ! 556: if (codel == REFERENCE_TYPE) ! 557: { ! 558: ttl = TREE_TYPE (ttl); ! 559: ! 560: /* When passing a non-const argument into a const reference, ! 561: dig it a little, so a non-const reference is preferred over ! 562: this one. (mrs) */ ! 563: if (parm && TREE_READONLY (ttl) && ! TREE_READONLY (parm)) ! 564: penalty = 2; ! 565: else ! 566: penalty = 0; ! 567: ! 568: ttl = TYPE_MAIN_VARIANT (ttl); ! 569: ! 570: if (form == OFFSET_TYPE) ! 571: { ! 572: intype = TREE_TYPE (intype); ! 573: form = TREE_CODE (intype); ! 574: } ! 575: ! 576: if (form == REFERENCE_TYPE) ! 577: { ! 578: intype = TYPE_MAIN_VARIANT (TREE_TYPE (intype)); ! 579: ! 580: if (ttl == intype) ! 581: return ZERO_RETURN (h); ! 582: penalty = 2; ! 583: } ! 584: else ! 585: { ! 586: /* Can reference be built up? */ ! 587: if (ttl == intype && penalty == 0) { ! 588: /* Because the READONLY and VIRTUAL bits are not always in ! 589: the type, this extra check is necessary. The problem ! 590: should be fixed someplace else, and this extra code ! 591: removed. ! 592: ! 593: Also, if type if a reference, the readonly bits could ! 594: either be in the outer type (with reference) or on the ! 595: inner type (the thing being referenced). (mrs) */ ! 596: if (parm ! 597: && ((TREE_READONLY (parm) ! 598: && ! (TYPE_READONLY (type) ! 599: || (TREE_CODE (type) == REFERENCE_TYPE ! 600: && TYPE_READONLY (TREE_TYPE (type))))) ! 601: || (TREE_SIDE_EFFECTS (parm) ! 602: && ! (TYPE_VOLATILE (type) ! 603: || (TREE_CODE (type) == REFERENCE_TYPE ! 604: && TYPE_VOLATILE (TREE_TYPE (type))))))) ! 605: penalty = 2; ! 606: else ! 607: return ZERO_RETURN (h); ! 608: } ! 609: else ! 610: penalty = 2; ! 611: } ! 612: } ! 613: else if (form == REFERENCE_TYPE) ! 614: { ! 615: if (parm) ! 616: { ! 617: tree tmp = convert_from_reference (parm); ! 618: intype = TYPE_MAIN_VARIANT (TREE_TYPE (tmp)); ! 619: } ! 620: else ! 621: { ! 622: intype = parmtype; ! 623: do ! 624: intype = TREE_TYPE (intype); ! 625: while (TREE_CODE (intype) == REFERENCE_TYPE); ! 626: intype = TYPE_MAIN_VARIANT (intype); ! 627: } ! 628: ! 629: if (ttl == intype) ! 630: return ZERO_RETURN (h); ! 631: else ! 632: penalty = 2; ! 633: } ! 634: ! 635: if (TREE_UNSIGNED (ttl) ^ TREE_UNSIGNED (intype)) ! 636: { ! 637: ttl = unsigned_type (ttl); ! 638: intype = unsigned_type (intype); ! 639: penalty += 2; ! 640: } ! 641: ! 642: ttr = intype; ! 643: ! 644: /* If the initializer is not an lvalue, then it does not ! 645: matter if we make life easier for the programmer ! 646: by creating a temporary variable with which to ! 647: hold the result. */ ! 648: if (parm && (coder == INTEGER_TYPE ! 649: || coder == ENUMERAL_TYPE ! 650: || coder == REAL_TYPE) ! 651: && ! lvalue_p (parm)) ! 652: { ! 653: h = convert_harshness_ansi (ttl, ttr, NULL_TREE); ! 654: if (penalty) ! 655: h.code |= STD_CODE; ! 656: h.distance = 0; ! 657: return h; ! 658: } ! 659: ! 660: if (ttl == ttr) ! 661: { ! 662: if (penalty > 2) ! 663: { ! 664: h.code = STD_CODE; ! 665: h.distance = 0; ! 666: } ! 667: else ! 668: { ! 669: h.code = TRIVIAL_CODE; ! 670: /* We set this here so that build_overload_call_real will be ! 671: able to see the penalty we found, rather than just looking ! 672: at a TRIVIAL_CODE with no other information. */ ! 673: h.int_penalty = penalty; ! 674: } ! 675: return h; ! 676: } ! 677: ! 678: /* Pointers to voids always convert for pointers. But ! 679: make them less natural than more specific matches. */ ! 680: if (TREE_CODE (ttl) == POINTER_TYPE && TREE_CODE (ttr) == POINTER_TYPE) ! 681: { ! 682: if (TREE_TYPE (ttl) == void_type_node ! 683: || TREE_TYPE (ttr) == void_type_node) ! 684: { ! 685: h.code = STD_CODE; ! 686: h.distance = 0; ! 687: return h; ! 688: } ! 689: } ! 690: ! 691: if (parm && codel != REFERENCE_TYPE) ! 692: { ! 693: h = convert_harshness_ansi (ttl, ttr, NULL_TREE); ! 694: if (penalty) ! 695: h.code |= STD_CODE; ! 696: h.distance = 0; ! 697: return h; ! 698: } ! 699: ! 700: /* Here it does matter. If this conversion is from derived to base, ! 701: allow it. Otherwise, types must be compatible in the strong sense. */ ! 702: if (TREE_CODE (ttl) == RECORD_TYPE && TREE_CODE (ttr) == RECORD_TYPE) ! 703: { ! 704: int b_or_d = get_base_distance (ttl, ttr, 0, 0); ! 705: if (b_or_d < 0) ! 706: { ! 707: b_or_d = get_base_distance (ttr, ttl, 0, 0); ! 708: if (b_or_d < 0) ! 709: return EVIL_RETURN (h); ! 710: h.distance = -b_or_d; ! 711: } ! 712: /* Say that this conversion is relatively painless. ! 713: If it turns out that there is a user-defined X(X&) ! 714: constructor, then that will be invoked, but that's ! 715: preferable to dealing with other user-defined conversions ! 716: that may produce surprising results. */ ! 717: else ! 718: h.distance = b_or_d; ! 719: h.code = STD_CODE; ! 720: return h; ! 721: } ! 722: ! 723: if (comp_target_types (ttl, intype, 1)) ! 724: { ! 725: if (penalty) ! 726: h.code = STD_CODE; ! 727: h.distance = 0; ! 728: return h; ! 729: } ! 730: } ! 731: } ! 732: if (codel == RECORD_TYPE && coder == RECORD_TYPE) ! 733: { ! 734: int b_or_d = get_base_distance (type, parmtype, 0, 0); ! 735: if (b_or_d < 0) ! 736: { ! 737: b_or_d = get_base_distance (parmtype, type, 0, 0); ! 738: if (b_or_d < 0) ! 739: return EVIL_RETURN (h); ! 740: h.distance = -b_or_d; ! 741: } ! 742: else ! 743: h.distance = b_or_d; ! 744: h.code = STD_CODE; ! 745: return h; ! 746: } ! 747: return EVIL_RETURN (h); ! 748: } ! 749: ! 750: /* TYPE is the type we wish to convert to. PARM is the parameter ! 751: we have to work with. We use a somewhat arbitrary cost function ! 752: to measure this conversion. */ ! 753: static int ! 754: convert_harshness_old (type, parmtype, parm) ! 755: register tree type, parmtype; ! 756: tree parm; ! 757: { ! 758: register enum tree_code codel; ! 759: register enum tree_code coder; ! 760: ! 761: #ifdef GATHER_STATISTICS ! 762: n_convert_harshness++; ! 763: #endif ! 764: ! 765: if (TYPE_PTRMEMFUNC_P (type)) ! 766: type = TYPE_PTRMEMFUNC_FN_TYPE (type); ! 767: if (TYPE_PTRMEMFUNC_P (parmtype)) ! 768: parmtype = TYPE_PTRMEMFUNC_FN_TYPE (parmtype); ! 769: ! 770: codel = TREE_CODE (type); ! 771: coder = TREE_CODE (parmtype); ! 772: ! 773: if (TYPE_MAIN_VARIANT (parmtype) == TYPE_MAIN_VARIANT (type)) ! 774: return TRIVIAL; ! 775: ! 776: if (coder == ERROR_MARK) ! 777: return EVIL; ! 778: ! 779: if (codel == POINTER_TYPE ! 780: && (coder == METHOD_TYPE || coder == FUNCTION_TYPE)) ! 781: { ! 782: tree p1, p2; ! 783: int harshness, new_harshness; ! 784: ! 785: /* Get to the METHOD_TYPE or FUNCTION_TYPE that this might be. */ ! 786: type = TREE_TYPE (type); ! 787: ! 788: if (coder != TREE_CODE (type)) ! 789: return EVIL; ! 790: ! 791: harshness = 0; ! 792: ! 793: /* We allow the default conversion between function type ! 794: and pointer-to-function type for free. */ ! 795: if (type == parmtype) ! 796: return TRIVIAL; ! 797: ! 798: /* Compare return types. */ ! 799: p1 = TREE_TYPE (type); ! 800: p2 = TREE_TYPE (parmtype); ! 801: new_harshness = convert_harshness_old (p1, p2, NULL_TREE); ! 802: if (EVIL_HARSHNESS (new_harshness)) ! 803: return EVIL; ! 804: ! 805: if (BASE_DERIVED_HARSHNESS (new_harshness)) ! 806: { ! 807: tree binfo; ! 808: ! 809: /* This only works for pointers. */ ! 810: if (TREE_CODE (p1) != POINTER_TYPE ! 811: && TREE_CODE (p1) != REFERENCE_TYPE) ! 812: return EVIL; ! 813: ! 814: p1 = TREE_TYPE (p1); ! 815: p2 = TREE_TYPE (p2); ! 816: /* Don't die if we happen to be dealing with void*. */ ! 817: if (!IS_AGGR_TYPE (p1) || !IS_AGGR_TYPE (p2)) ! 818: return EVIL; ! 819: if (CONTRAVARIANT_HARSHNESS (new_harshness)) ! 820: binfo = get_binfo (p2, p1, 0); ! 821: else ! 822: binfo = get_binfo (p1, p2, 0); ! 823: ! 824: if (! BINFO_OFFSET_ZEROP (binfo)) ! 825: { ! 826: static int explained = 0; ! 827: if (CONTRAVARIANT_HARSHNESS (new_harshness)) ! 828: message_2_types (sorry, "cannot cast `%d' to `%d' at function call site", p2, p1); ! 829: else ! 830: message_2_types (sorry, "cannot cast `%d' to `%d' at function call site", p1, p2); ! 831: ! 832: if (! explained++) ! 833: sorry ("(because pointer values change during conversion)"); ! 834: return EVIL; ! 835: } ! 836: } ! 837: ! 838: harshness |= new_harshness; ! 839: ! 840: p1 = TYPE_ARG_TYPES (type); ! 841: p2 = TYPE_ARG_TYPES (parmtype); ! 842: while (p1 && TREE_VALUE (p1) != void_type_node ! 843: && p2 && TREE_VALUE (p2) != void_type_node) ! 844: { ! 845: new_harshness = convert_harshness_old (TREE_VALUE (p1), ! 846: TREE_VALUE (p2), NULL_TREE); ! 847: if (EVIL_HARSHNESS (new_harshness)) ! 848: return EVIL; ! 849: ! 850: if (BASE_DERIVED_HARSHNESS (new_harshness)) ! 851: { ! 852: /* This only works for pointers and references. */ ! 853: if (TREE_CODE (TREE_VALUE (p1)) != POINTER_TYPE ! 854: && TREE_CODE (TREE_VALUE (p1)) != REFERENCE_TYPE) ! 855: return EVIL; ! 856: new_harshness ^= CONTRAVARIANT_HARSHNESS (new_harshness); ! 857: harshness |= new_harshness; ! 858: } ! 859: /* This trick allows use to accumulate easy type ! 860: conversions without messing up the bits that encode ! 861: info about more involved things. */ ! 862: else if (ONLY_EASY_HARSHNESS (new_harshness)) ! 863: harshness += new_harshness; ! 864: else ! 865: harshness |= new_harshness; ! 866: p1 = TREE_CHAIN (p1); ! 867: p2 = TREE_CHAIN (p2); ! 868: } ! 869: if (p1 == p2) ! 870: return harshness; ! 871: if (p2) ! 872: return p1 ? EVIL : (harshness | ELLIPSIS_HARSHNESS (-1)); ! 873: if (p1) ! 874: return harshness | (TREE_PURPOSE (p1) == NULL_TREE); ! 875: } ! 876: else if (codel == POINTER_TYPE && coder == OFFSET_TYPE) ! 877: { ! 878: /* XXX: Note this is set a few times, but it's never actually ! 879: used! (bpk) */ ! 880: int harshness; ! 881: ! 882: /* Get to the OFFSET_TYPE that this might be. */ ! 883: type = TREE_TYPE (type); ! 884: ! 885: if (coder != TREE_CODE (type)) ! 886: return EVIL; ! 887: ! 888: harshness = 0; ! 889: ! 890: if (TYPE_OFFSET_BASETYPE (type) == TYPE_OFFSET_BASETYPE (parmtype)) ! 891: harshness = 0; ! 892: else if (UNIQUELY_DERIVED_FROM_P (TYPE_OFFSET_BASETYPE (type), ! 893: TYPE_OFFSET_BASETYPE (parmtype))) ! 894: harshness = INT_TO_BD_HARSHNESS (1); ! 895: else if (UNIQUELY_DERIVED_FROM_P (TYPE_OFFSET_BASETYPE (parmtype), ! 896: TYPE_OFFSET_BASETYPE (type))) ! 897: harshness = CONTRAVARIANT_HARSHNESS (-1); ! 898: else ! 899: return EVIL; ! 900: /* Now test the OFFSET_TYPE's target compatibility. */ ! 901: type = TREE_TYPE (type); ! 902: parmtype = TREE_TYPE (parmtype); ! 903: } ! 904: ! 905: if (coder == UNKNOWN_TYPE) ! 906: { ! 907: if (codel == FUNCTION_TYPE ! 908: || codel == METHOD_TYPE ! 909: || (codel == POINTER_TYPE ! 910: && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE ! 911: || TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE))) ! 912: return TRIVIAL; ! 913: return EVIL; ! 914: } ! 915: ! 916: if (coder == VOID_TYPE) ! 917: return EVIL; ! 918: ! 919: if (codel == ENUMERAL_TYPE || codel == INTEGER_TYPE) ! 920: { ! 921: /* Control equivalence of ints an enums. */ ! 922: ! 923: if (codel == ENUMERAL_TYPE ! 924: && flag_int_enum_equivalence == 0) ! 925: { ! 926: /* Enums can be converted to ints, but not vice-versa. */ ! 927: if (coder != ENUMERAL_TYPE ! 928: || TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (parmtype)) ! 929: return EVIL; ! 930: } ! 931: ! 932: /* else enums and ints (almost) freely interconvert. */ ! 933: ! 934: if (coder == INTEGER_TYPE || coder == ENUMERAL_TYPE) ! 935: { ! 936: int easy = TREE_UNSIGNED (type) ^ TREE_UNSIGNED (parmtype); ! 937: if (codel != coder) ! 938: easy += 1; ! 939: if (TYPE_MODE (type) != TYPE_MODE (parmtype)) ! 940: easy += 2; ! 941: return INT_TO_EASY_HARSHNESS (easy); ! 942: } ! 943: else if (coder == REAL_TYPE) ! 944: return INT_TO_EASY_HARSHNESS (4); ! 945: } ! 946: ! 947: if (codel == REAL_TYPE) ! 948: if (coder == REAL_TYPE) ! 949: /* Shun converting between float and double if a choice exists. */ ! 950: { ! 951: if (TYPE_MODE (type) != TYPE_MODE (parmtype)) ! 952: return INT_TO_EASY_HARSHNESS (2); ! 953: return TRIVIAL; ! 954: } ! 955: else if (coder == INTEGER_TYPE || coder == ENUMERAL_TYPE) ! 956: return INT_TO_EASY_HARSHNESS (4); ! 957: ! 958: /* convert arrays which have not previously been converted. */ ! 959: if (codel == ARRAY_TYPE) ! 960: codel = POINTER_TYPE; ! 961: if (coder == ARRAY_TYPE) ! 962: coder = POINTER_TYPE; ! 963: ! 964: /* Conversions among pointers */ ! 965: if (codel == POINTER_TYPE && coder == POINTER_TYPE) ! 966: { ! 967: register tree ttl = TYPE_MAIN_VARIANT (TREE_TYPE (type)); ! 968: register tree ttr = TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)); ! 969: int penalty = 4 * (ttl != ttr); ! 970: /* Anything converts to void *. void * converts to anything. ! 971: Since these may be `const void *' (etc.) use VOID_TYPE ! 972: instead of void_type_node. ! 973: Otherwise, the targets must be the same, ! 974: except that we do allow (at some cost) conversion ! 975: between signed and unsinged pointer types. */ ! 976: ! 977: if ((TREE_CODE (ttl) == METHOD_TYPE ! 978: || TREE_CODE (ttl) == FUNCTION_TYPE) ! 979: && TREE_CODE (ttl) == TREE_CODE (ttr)) ! 980: { ! 981: if (comptypes (ttl, ttr, -1)) ! 982: return INT_TO_EASY_HARSHNESS (penalty); ! 983: return EVIL; ! 984: } ! 985: ! 986: if (!(TREE_CODE (ttl) == VOID_TYPE ! 987: || TREE_CODE (ttr) == VOID_TYPE ! 988: || (TREE_UNSIGNED (ttl) ^ TREE_UNSIGNED (ttr) ! 989: && (ttl = unsigned_type (ttl), ! 990: ttr = unsigned_type (ttr), ! 991: penalty = 10, 0)) ! 992: || (comp_target_types (ttl, ttr, 0)))) ! 993: return EVIL; ! 994: ! 995: if (penalty == 10) ! 996: return INT_TO_EASY_HARSHNESS (10); ! 997: if (ttr == ttl) ! 998: return INT_TO_BD_HARSHNESS (0); ! 999: ! 1000: if (TREE_CODE (ttl) == RECORD_TYPE && TREE_CODE (ttr) == RECORD_TYPE) ! 1001: { ! 1002: int b_or_d = get_base_distance (ttl, ttr, 0, 0); ! 1003: if (b_or_d < 0) ! 1004: { ! 1005: b_or_d = get_base_distance (ttr, ttl, 0, 0); ! 1006: if (b_or_d < 0) ! 1007: return EVIL; ! 1008: return CONTRAVARIANT_HARSHNESS (-1); ! 1009: } ! 1010: return INT_TO_BD_HARSHNESS (b_or_d); ! 1011: } ! 1012: /* If converting from a `class*' to a `void*', make it ! 1013: less favorable than any inheritance relationship. */ ! 1014: if (TREE_CODE (ttl) == VOID_TYPE && IS_AGGR_TYPE (ttr)) ! 1015: return INT_TO_BD_HARSHNESS (CLASSTYPE_MAX_DEPTH (ttr)+1); ! 1016: return INT_TO_EASY_HARSHNESS (penalty); ! 1017: } ! 1018: ! 1019: if (codel == POINTER_TYPE && coder == INTEGER_TYPE) ! 1020: { ! 1021: /* This is not a bad match, but don't let it beat ! 1022: integer-enum combinations. */ ! 1023: if (parm && integer_zerop (parm)) ! 1024: return INT_TO_EASY_HARSHNESS (4); ! 1025: } ! 1026: ! 1027: /* C++: one of the types must be a reference type. */ ! 1028: { ! 1029: tree ttl, ttr; ! 1030: register tree intype = TYPE_MAIN_VARIANT (parmtype); ! 1031: register enum tree_code form = TREE_CODE (intype); ! 1032: int penalty; ! 1033: ! 1034: if (codel == REFERENCE_TYPE || coder == REFERENCE_TYPE) ! 1035: { ! 1036: ttl = TYPE_MAIN_VARIANT (type); ! 1037: ! 1038: if (codel == REFERENCE_TYPE) ! 1039: { ! 1040: ttl = TREE_TYPE (ttl); ! 1041: ! 1042: /* When passing a non-const argument into a const reference, ! 1043: dig it a little, so a non-const reference is preferred over ! 1044: this one. (mrs) */ ! 1045: if (parm && TREE_READONLY (ttl) && ! TREE_READONLY (parm)) ! 1046: penalty = 2; ! 1047: else ! 1048: penalty = 0; ! 1049: ! 1050: ttl = TYPE_MAIN_VARIANT (ttl); ! 1051: ! 1052: if (form == OFFSET_TYPE) ! 1053: { ! 1054: intype = TREE_TYPE (intype); ! 1055: form = TREE_CODE (intype); ! 1056: } ! 1057: ! 1058: if (form == REFERENCE_TYPE) ! 1059: { ! 1060: intype = TYPE_MAIN_VARIANT (TREE_TYPE (intype)); ! 1061: ! 1062: if (ttl == intype) ! 1063: return TRIVIAL; ! 1064: penalty = 2; ! 1065: } ! 1066: else ! 1067: { ! 1068: /* Can reference be built up? */ ! 1069: if (ttl == intype && penalty == 0) { ! 1070: /* Because the READONLY bits and VIRTUAL bits are not always ! 1071: in the type, this extra check is necessary. The problem ! 1072: should be fixed someplace else, and this extra code ! 1073: removed. ! 1074: ! 1075: Also, if type if a reference, the readonly bits could ! 1076: either be in the outer type (with reference) or on the ! 1077: inner type (the thing being referenced). (mrs) */ ! 1078: if (parm ! 1079: && ((TREE_READONLY (parm) ! 1080: && ! (TYPE_READONLY (type) ! 1081: || (TREE_CODE (type) == REFERENCE_TYPE ! 1082: && TYPE_READONLY (TREE_TYPE (type))))) ! 1083: || (TREE_SIDE_EFFECTS (parm) ! 1084: && ! (TYPE_VOLATILE (type) ! 1085: || (TREE_CODE (type) == REFERENCE_TYPE ! 1086: && TYPE_VOLATILE (TREE_TYPE (type))))))) ! 1087: penalty = 2; ! 1088: else ! 1089: return TRIVIAL; ! 1090: } ! 1091: else ! 1092: penalty = 2; ! 1093: } ! 1094: } ! 1095: else if (form == REFERENCE_TYPE) ! 1096: { ! 1097: if (parm) ! 1098: { ! 1099: tree tmp = convert_from_reference (parm); ! 1100: intype = TYPE_MAIN_VARIANT (TREE_TYPE (tmp)); ! 1101: } ! 1102: else ! 1103: { ! 1104: intype = parmtype; ! 1105: do ! 1106: { ! 1107: intype = TREE_TYPE (intype); ! 1108: } ! 1109: while (TREE_CODE (intype) == REFERENCE_TYPE); ! 1110: intype = TYPE_MAIN_VARIANT (intype); ! 1111: } ! 1112: ! 1113: if (ttl == intype) ! 1114: return TRIVIAL; ! 1115: else ! 1116: penalty = 2; ! 1117: } ! 1118: ! 1119: if (TREE_UNSIGNED (ttl) ^ TREE_UNSIGNED (intype)) ! 1120: { ! 1121: ttl = unsigned_type (ttl); ! 1122: intype = unsigned_type (intype); ! 1123: penalty += 2; ! 1124: } ! 1125: ! 1126: ttr = intype; ! 1127: ! 1128: /* If the initializer is not an lvalue, then it does not ! 1129: matter if we make life easier for the programmer ! 1130: by creating a temporary variable with which to ! 1131: hold the result. */ ! 1132: if (parm && (coder == INTEGER_TYPE ! 1133: || coder == ENUMERAL_TYPE ! 1134: || coder == REAL_TYPE) ! 1135: && ! lvalue_p (parm)) ! 1136: return (convert_harshness_old (ttl, ttr, NULL_TREE) ! 1137: | INT_TO_EASY_HARSHNESS (penalty)); ! 1138: ! 1139: if (ttl == ttr) ! 1140: { ! 1141: if (penalty) ! 1142: return INT_TO_EASY_HARSHNESS (penalty); ! 1143: return INT_TO_BD_HARSHNESS (0); ! 1144: } ! 1145: ! 1146: /* Pointers to voids always convert for pointers. But ! 1147: make them less natural than more specific matches. */ ! 1148: if (TREE_CODE (ttl) == POINTER_TYPE && TREE_CODE (ttr) == POINTER_TYPE) ! 1149: if (TREE_TYPE (ttl) == void_type_node ! 1150: || TREE_TYPE (ttr) == void_type_node) ! 1151: return INT_TO_EASY_HARSHNESS (penalty+1); ! 1152: ! 1153: if (parm && codel != REFERENCE_TYPE) ! 1154: return (convert_harshness_old (ttl, ttr, NULL_TREE) ! 1155: | INT_TO_EASY_HARSHNESS (penalty)); ! 1156: ! 1157: /* Here it does matter. If this conversion is from ! 1158: derived to base, allow it. Otherwise, types must ! 1159: be compatible in the strong sense. */ ! 1160: if (TREE_CODE (ttl) == RECORD_TYPE && TREE_CODE (ttr) == RECORD_TYPE) ! 1161: { ! 1162: int b_or_d = get_base_distance (ttl, ttr, 0, 0); ! 1163: if (b_or_d < 0) ! 1164: { ! 1165: b_or_d = get_base_distance (ttr, ttl, 0, 0); ! 1166: if (b_or_d < 0) ! 1167: return EVIL; ! 1168: return CONTRAVARIANT_HARSHNESS (-1); ! 1169: } ! 1170: /* Say that this conversion is relatively painless. ! 1171: If it turns out that there is a user-defined X(X&) ! 1172: constructor, then that will be invoked, but that's ! 1173: preferable to dealing with other user-defined conversions ! 1174: that may produce surprising results. */ ! 1175: return INT_TO_BD_HARSHNESS (b_or_d); ! 1176: } ! 1177: ! 1178: if (comp_target_types (ttl, intype, 1)) ! 1179: return INT_TO_EASY_HARSHNESS (penalty); ! 1180: } ! 1181: } ! 1182: if (codel == RECORD_TYPE && coder == RECORD_TYPE) ! 1183: { ! 1184: int b_or_d = get_base_distance (type, parmtype, 0, 0); ! 1185: if (b_or_d < 0) ! 1186: { ! 1187: b_or_d = get_base_distance (parmtype, type, 0, 0); ! 1188: if (b_or_d < 0) ! 1189: return EVIL; ! 1190: return CONTRAVARIANT_HARSHNESS (-1); ! 1191: } ! 1192: return INT_TO_BD_HARSHNESS (b_or_d); ! 1193: } ! 1194: return EVIL; ! 1195: } ! 1196: ! 1197: /* Algorithm: For each argument, calculate how difficult it is to ! 1198: make FUNCTION accept that argument. If we can easily tell that ! 1199: FUNCTION won't be acceptable to one of the arguments, then we ! 1200: don't need to compute the ease of converting the other arguments, ! 1201: since it will never show up in the intersection of all arguments' ! 1202: favorite functions. ! 1203: ! 1204: Conversions between builtin and user-defined types are allowed, but ! 1205: no function involving such a conversion is preferred to one which ! 1206: does not require such a conversion. Furthermore, such conversions ! 1207: must be unique. */ ! 1208: ! 1209: void ! 1210: compute_conversion_costs_ansi (function, tta_in, cp, arglen) ! 1211: tree function; ! 1212: tree tta_in; ! 1213: struct candidate *cp; ! 1214: int arglen; ! 1215: { ! 1216: tree ttf_in = TYPE_ARG_TYPES (TREE_TYPE (function)); ! 1217: tree ttf = ttf_in; ! 1218: tree tta = tta_in; ! 1219: ! 1220: /* Start out with no strikes against. */ ! 1221: int evil_strikes = 0; ! 1222: int ellipsis_strikes = 0; ! 1223: int user_strikes = 0; ! 1224: int b_or_d_strikes = 0; ! 1225: int easy_strikes = 0; ! 1226: ! 1227: int strike_index = 0, win; ! 1228: struct harshness_code lose; ! 1229: ! 1230: #ifdef GATHER_STATISTICS ! 1231: n_compute_conversion_costs++; ! 1232: #endif ! 1233: ! 1234: cp->function = function; ! 1235: cp->arg = tta ? TREE_VALUE (tta) : NULL_TREE; ! 1236: cp->u.bad_arg = 0; /* optimistic! */ ! 1237: ! 1238: cp->h.code = 0; ! 1239: cp->h.distance = 0; ! 1240: cp->h.int_penalty = 0; ! 1241: bzero (cp->v.ansi_harshness, (arglen+1) * sizeof (short)); ! 1242: ! 1243: while (ttf && tta) ! 1244: { ! 1245: struct harshness_code h; ! 1246: ! 1247: if (ttf == void_list_node) ! 1248: break; ! 1249: ! 1250: if (type_unknown_p (TREE_VALUE (tta))) ! 1251: { ! 1252: /* Must perform some instantiation here. */ ! 1253: tree rhs = TREE_VALUE (tta); ! 1254: tree lhstype = TREE_VALUE (ttf); ! 1255: ! 1256: /* Keep quiet about possible contravariance violations. */ ! 1257: int old_inhibit_warnings = inhibit_warnings; ! 1258: inhibit_warnings = 1; ! 1259: ! 1260: /* @@ This is to undo what `grokdeclarator' does to ! 1261: parameter types. It really should go through ! 1262: something more general. */ ! 1263: ! 1264: TREE_TYPE (tta) = unknown_type_node; ! 1265: rhs = instantiate_type (lhstype, rhs, 0); ! 1266: inhibit_warnings = old_inhibit_warnings; ! 1267: ! 1268: if (TREE_CODE (rhs) == ERROR_MARK) ! 1269: h.code = EVIL_CODE; ! 1270: else ! 1271: h = convert_harshness_ansi (lhstype, TREE_TYPE (rhs), rhs); ! 1272: } ! 1273: else ! 1274: h = convert_harshness_ansi (TREE_VALUE (ttf), ! 1275: TREE_TYPE (TREE_VALUE (tta)), ! 1276: TREE_VALUE (tta)); ! 1277: ! 1278: cp->v.ansi_harshness[strike_index] = h; ! 1279: if ((h.code & EVIL_CODE) ! 1280: || ((h.code & STD_CODE) && h.distance < 0)) ! 1281: { ! 1282: cp->u.bad_arg = strike_index; ! 1283: evil_strikes = 1; ! 1284: } ! 1285: else if (h.code & ELLIPSIS_CODE) ! 1286: ellipsis_strikes += 1; ! 1287: #if 0 ! 1288: /* This is never set by `convert_harshness_ansi'. */ ! 1289: else if (h.code & USER_CODE) ! 1290: { ! 1291: user_strikes += 1; ! 1292: } ! 1293: #endif ! 1294: else ! 1295: { ! 1296: if ((h.code & STD_CODE) && h.distance) ! 1297: { ! 1298: if (h.distance > b_or_d_strikes) ! 1299: b_or_d_strikes = h.distance; ! 1300: } ! 1301: else ! 1302: easy_strikes += (h.code & (STD_CODE|PROMO_CODE|TRIVIAL_CODE)); ! 1303: cp->h.code |= h.code; ! 1304: /* Make sure we communicate this. */ ! 1305: cp->h.int_penalty += h.int_penalty; ! 1306: } ! 1307: ! 1308: ttf = TREE_CHAIN (ttf); ! 1309: tta = TREE_CHAIN (tta); ! 1310: strike_index += 1; ! 1311: } ! 1312: ! 1313: if (tta) ! 1314: { ! 1315: /* ran out of formals, and parmlist is fixed size. */ ! 1316: if (ttf /* == void_type_node */) ! 1317: { ! 1318: cp->h.code = EVIL_CODE; ! 1319: cp->u.bad_arg = -1; ! 1320: return; ! 1321: } ! 1322: else ! 1323: ellipsis_strikes += list_length (tta); ! 1324: } ! 1325: else if (ttf && ttf != void_list_node) ! 1326: { ! 1327: /* ran out of actuals, and no defaults. */ ! 1328: if (TREE_PURPOSE (ttf) == NULL_TREE) ! 1329: { ! 1330: cp->h.code = EVIL_CODE; ! 1331: cp->u.bad_arg = -2; ! 1332: return; ! 1333: } ! 1334: /* Store index of first default. */ ! 1335: cp->v.ansi_harshness[arglen].distance = strike_index+1; ! 1336: } ! 1337: else ! 1338: cp->v.ansi_harshness[arglen].distance = 0; ! 1339: ! 1340: /* Argument list lengths work out, so don't need to check them again. */ ! 1341: if (evil_strikes) ! 1342: { ! 1343: /* We do not check for derived->base conversions here, since in ! 1344: no case would they give evil strike counts, unless such conversions ! 1345: are somehow ambiguous. */ ! 1346: ! 1347: /* See if any user-defined conversions apply. ! 1348: But make sure that we do not loop. */ ! 1349: static int dont_convert_types = 0; ! 1350: ! 1351: if (dont_convert_types) ! 1352: { ! 1353: cp->h.code = EVIL_CODE; ! 1354: return; ! 1355: } ! 1356: ! 1357: win = 0; /* Only get one chance to win. */ ! 1358: ttf = TYPE_ARG_TYPES (TREE_TYPE (function)); ! 1359: tta = tta_in; ! 1360: strike_index = 0; ! 1361: evil_strikes = 0; ! 1362: ! 1363: while (ttf && tta) ! 1364: { ! 1365: if (ttf == void_list_node) ! 1366: break; ! 1367: ! 1368: lose = cp->v.ansi_harshness[strike_index]; ! 1369: if ((lose.code & EVIL_CODE) ! 1370: || ((lose.code & STD_CODE) && lose.distance < 0)) ! 1371: { ! 1372: tree actual_type = TREE_TYPE (TREE_VALUE (tta)); ! 1373: tree formal_type = TREE_VALUE (ttf); ! 1374: ! 1375: dont_convert_types = 1; ! 1376: ! 1377: if (TREE_CODE (formal_type) == REFERENCE_TYPE) ! 1378: formal_type = TREE_TYPE (formal_type); ! 1379: if (TREE_CODE (actual_type) == REFERENCE_TYPE) ! 1380: actual_type = TREE_TYPE (actual_type); ! 1381: ! 1382: if (formal_type != error_mark_node ! 1383: && actual_type != error_mark_node) ! 1384: { ! 1385: formal_type = TYPE_MAIN_VARIANT (formal_type); ! 1386: actual_type = TYPE_MAIN_VARIANT (actual_type); ! 1387: ! 1388: if (TYPE_HAS_CONSTRUCTOR (formal_type)) ! 1389: { ! 1390: /* If it has a constructor for this type, ! 1391: try to use it. */ ! 1392: /* @@ There is no way to save this result yet, so ! 1393: success is a NULL_TREE for now. */ ! 1394: if (convert_to_aggr (formal_type, TREE_VALUE (tta), 0, 1) ! 1395: != error_mark_node) ! 1396: win++; ! 1397: } ! 1398: if (TYPE_LANG_SPECIFIC (actual_type) ! 1399: && TYPE_HAS_CONVERSION (actual_type)) ! 1400: { ! 1401: if (TREE_CODE (formal_type) == INTEGER_TYPE ! 1402: && TYPE_HAS_INT_CONVERSION (actual_type)) ! 1403: win++; ! 1404: else if (TREE_CODE (formal_type) == REAL_TYPE ! 1405: && TYPE_HAS_REAL_CONVERSION (actual_type)) ! 1406: win++; ! 1407: else ! 1408: { ! 1409: tree conv; ! 1410: /* Don't issue warnings since we're only groping ! 1411: around for the right answer, we haven't yet ! 1412: committed to going with this solution. */ ! 1413: int old_inhibit_warnings = inhibit_warnings; ! 1414: ! 1415: inhibit_warnings = 1; ! 1416: conv = build_type_conversion (CALL_EXPR, TREE_VALUE (ttf), TREE_VALUE (tta), 0); ! 1417: inhibit_warnings = old_inhibit_warnings; ! 1418: ! 1419: if (conv) ! 1420: { ! 1421: if (conv == error_mark_node) ! 1422: win += 2; ! 1423: else ! 1424: win++; ! 1425: } ! 1426: else if (TREE_CODE (TREE_VALUE (ttf)) == REFERENCE_TYPE) ! 1427: { ! 1428: conv = build_type_conversion (CALL_EXPR, formal_type, TREE_VALUE (tta), 0); ! 1429: if (conv) ! 1430: { ! 1431: if (conv == error_mark_node) ! 1432: win += 2; ! 1433: else ! 1434: win++; ! 1435: } ! 1436: } ! 1437: } ! 1438: } ! 1439: } ! 1440: dont_convert_types = 0; ! 1441: ! 1442: if (win == 1) ! 1443: { ! 1444: user_strikes += 1; ! 1445: cp->v.ansi_harshness[strike_index].code = USER_CODE; ! 1446: win = 0; ! 1447: } ! 1448: else ! 1449: { ! 1450: if (cp->u.bad_arg > strike_index) ! 1451: cp->u.bad_arg = strike_index; ! 1452: ! 1453: evil_strikes = win ? 2 : 1; ! 1454: break; ! 1455: } ! 1456: } ! 1457: ! 1458: ttf = TREE_CHAIN (ttf); ! 1459: tta = TREE_CHAIN (tta); ! 1460: strike_index += 1; ! 1461: } ! 1462: } ! 1463: ! 1464: /* Const member functions get a small penalty because defaulting ! 1465: to const is less useful than defaulting to non-const. */ ! 1466: /* This is bogus, it does not correspond to anything in the ARM. ! 1467: This code will be fixed when this entire section is rewritten ! 1468: to conform to the ARM. (mrs) */ ! 1469: if (TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE) ! 1470: { ! 1471: if (TYPE_READONLY (TREE_TYPE (TREE_VALUE (ttf_in)))) ! 1472: { ! 1473: cp->v.ansi_harshness[0].code |= TRIVIAL_CODE; ! 1474: ++easy_strikes; ! 1475: } ! 1476: else ! 1477: { ! 1478: /* Calling a non-const member function from a const member function ! 1479: is probably invalid, but for now we let it only draw a warning. ! 1480: We indicate that such a mismatch has occurred by setting the ! 1481: harshness to a maximum value. */ ! 1482: if (TREE_CODE (TREE_TYPE (TREE_VALUE (tta_in))) == POINTER_TYPE ! 1483: && (TYPE_READONLY (TREE_TYPE (TREE_TYPE (TREE_VALUE (tta_in)))))) ! 1484: cp->v.ansi_harshness[0].code |= CONST_CODE; ! 1485: } ! 1486: } ! 1487: ! 1488: if (evil_strikes) ! 1489: cp->h.code = EVIL_CODE; ! 1490: if (ellipsis_strikes) ! 1491: cp->h.code |= ELLIPSIS_CODE; ! 1492: if (user_strikes) ! 1493: cp->h.code |= USER_CODE; ! 1494: } ! 1495: ! 1496: void ! 1497: compute_conversion_costs_old (function, tta_in, cp, arglen) ! 1498: tree function; ! 1499: tree tta_in; ! 1500: struct candidate *cp; ! 1501: int arglen; ! 1502: { ! 1503: tree ttf_in = TYPE_ARG_TYPES (TREE_TYPE (function)); ! 1504: tree ttf = ttf_in; ! 1505: tree tta = tta_in; ! 1506: ! 1507: /* Start out with no strikes against. */ ! 1508: int evil_strikes = 0; ! 1509: int ellipsis_strikes = 0; ! 1510: int user_strikes = 0; ! 1511: int b_or_d_strikes = 0; ! 1512: int easy_strikes = 0; ! 1513: ! 1514: int strike_index = 0, win, lose; ! 1515: ! 1516: #ifdef GATHER_STATISTICS ! 1517: n_compute_conversion_costs++; ! 1518: #endif ! 1519: ! 1520: cp->function = function; ! 1521: cp->arg = tta ? TREE_VALUE (tta) : NULL_TREE; ! 1522: cp->u.bad_arg = 0; /* optimistic! */ ! 1523: ! 1524: bzero (cp->v.old_harshness, (arglen+1) * sizeof (short)); ! 1525: ! 1526: while (ttf && tta) ! 1527: { ! 1528: int harshness; ! 1529: ! 1530: if (ttf == void_list_node) ! 1531: break; ! 1532: ! 1533: if (type_unknown_p (TREE_VALUE (tta))) ! 1534: { ! 1535: /* Must perform some instantiation here. */ ! 1536: tree rhs = TREE_VALUE (tta); ! 1537: tree lhstype = TREE_VALUE (ttf); ! 1538: ! 1539: /* Keep quiet about possible contravariance violations. */ ! 1540: int old_inhibit_warnings = inhibit_warnings; ! 1541: inhibit_warnings = 1; ! 1542: ! 1543: /* @@ This is to undo what `grokdeclarator' does to ! 1544: parameter types. It really should go through ! 1545: something more general. */ ! 1546: ! 1547: TREE_TYPE (tta) = unknown_type_node; ! 1548: rhs = instantiate_type (lhstype, rhs, 0); ! 1549: inhibit_warnings = old_inhibit_warnings; ! 1550: ! 1551: if (TREE_CODE (rhs) == ERROR_MARK) ! 1552: harshness = 1; ! 1553: else ! 1554: { ! 1555: harshness = convert_harshness_old (lhstype, TREE_TYPE (rhs), ! 1556: rhs); ! 1557: /* harshness |= 2; */ ! 1558: } ! 1559: } ! 1560: else ! 1561: harshness = convert_harshness_old (TREE_VALUE (ttf), ! 1562: TREE_TYPE (TREE_VALUE (tta)), ! 1563: TREE_VALUE (tta)); ! 1564: ! 1565: cp->v.old_harshness[strike_index] = harshness; ! 1566: if (EVIL_HARSHNESS (harshness) ! 1567: || CONTRAVARIANT_HARSHNESS (harshness)) ! 1568: { ! 1569: cp->u.bad_arg = strike_index; ! 1570: evil_strikes = 1; ! 1571: } ! 1572: else if (ELLIPSIS_HARSHNESS (harshness)) ! 1573: { ! 1574: ellipsis_strikes += 1; ! 1575: } ! 1576: #if 0 ! 1577: /* This is never set by `convert_harshness_old'. */ ! 1578: else if (USER_HARSHNESS (harshness)) ! 1579: { ! 1580: user_strikes += 1; ! 1581: } ! 1582: #endif ! 1583: else if (BASE_DERIVED_HARSHNESS (harshness)) ! 1584: { ! 1585: b_or_d_strikes += INT_FROM_BD_HARSHNESS (harshness); ! 1586: } ! 1587: else ! 1588: easy_strikes += INT_FROM_EASY_HARSHNESS (harshness); ! 1589: ttf = TREE_CHAIN (ttf); ! 1590: tta = TREE_CHAIN (tta); ! 1591: strike_index += 1; ! 1592: } ! 1593: ! 1594: if (tta) ! 1595: { ! 1596: /* ran out of formals, and parmlist is fixed size. */ ! 1597: if (ttf /* == void_type_node */) ! 1598: { ! 1599: cp->evil = 1; ! 1600: cp->u.bad_arg = -1; ! 1601: return; ! 1602: } ! 1603: else ellipsis_strikes += list_length (tta); ! 1604: } ! 1605: else if (ttf && ttf != void_list_node) ! 1606: { ! 1607: /* ran out of actuals, and no defaults. */ ! 1608: if (TREE_PURPOSE (ttf) == NULL_TREE) ! 1609: { ! 1610: cp->evil = 1; ! 1611: cp->u.bad_arg = -2; ! 1612: return; ! 1613: } ! 1614: /* Store index of first default. */ ! 1615: cp->v.old_harshness[arglen] = strike_index+1; ! 1616: } ! 1617: else ! 1618: cp->v.old_harshness[arglen] = 0; ! 1619: ! 1620: /* Argument list lengths work out, so don't need to check them again. */ ! 1621: if (evil_strikes) ! 1622: { ! 1623: /* We do not check for derived->base conversions here, since in ! 1624: no case would they give evil strike counts, unless such conversions ! 1625: are somehow ambiguous. */ ! 1626: ! 1627: /* See if any user-defined conversions apply. ! 1628: But make sure that we do not loop. */ ! 1629: static int dont_convert_types = 0; ! 1630: ! 1631: if (dont_convert_types) ! 1632: { ! 1633: cp->evil = 1; ! 1634: return; ! 1635: } ! 1636: ! 1637: win = 0; /* Only get one chance to win. */ ! 1638: ttf = TYPE_ARG_TYPES (TREE_TYPE (function)); ! 1639: tta = tta_in; ! 1640: strike_index = 0; ! 1641: evil_strikes = 0; ! 1642: ! 1643: while (ttf && tta) ! 1644: { ! 1645: if (ttf == void_list_node) ! 1646: break; ! 1647: ! 1648: lose = cp->v.old_harshness[strike_index]; ! 1649: if (EVIL_HARSHNESS (lose) ! 1650: || CONTRAVARIANT_HARSHNESS (lose)) ! 1651: { ! 1652: tree actual_type = TREE_TYPE (TREE_VALUE (tta)); ! 1653: tree formal_type = TREE_VALUE (ttf); ! 1654: ! 1655: dont_convert_types = 1; ! 1656: ! 1657: if (TREE_CODE (formal_type) == REFERENCE_TYPE) ! 1658: formal_type = TREE_TYPE (formal_type); ! 1659: if (TREE_CODE (actual_type) == REFERENCE_TYPE) ! 1660: actual_type = TREE_TYPE (actual_type); ! 1661: ! 1662: if (formal_type != error_mark_node ! 1663: && actual_type != error_mark_node) ! 1664: { ! 1665: formal_type = TYPE_MAIN_VARIANT (formal_type); ! 1666: actual_type = TYPE_MAIN_VARIANT (actual_type); ! 1667: ! 1668: if (TYPE_HAS_CONSTRUCTOR (formal_type)) ! 1669: { ! 1670: /* If it has a constructor for this type, try to use it. */ ! 1671: if (convert_to_aggr (formal_type, TREE_VALUE (tta), 0, 1) ! 1672: != error_mark_node) ! 1673: { ! 1674: /* @@ There is no way to save this result yet. ! 1675: @@ So success is NULL_TREE for now. */ ! 1676: win++; ! 1677: } ! 1678: } ! 1679: if (TYPE_LANG_SPECIFIC (actual_type) && TYPE_HAS_CONVERSION (actual_type)) ! 1680: { ! 1681: if (TREE_CODE (formal_type) == INTEGER_TYPE ! 1682: && TYPE_HAS_INT_CONVERSION (actual_type)) ! 1683: win++; ! 1684: else if (TREE_CODE (formal_type) == REAL_TYPE ! 1685: && TYPE_HAS_REAL_CONVERSION (actual_type)) ! 1686: win++; ! 1687: else ! 1688: { ! 1689: tree conv = build_type_conversion (CALL_EXPR, TREE_VALUE (ttf), TREE_VALUE (tta), 0); ! 1690: if (conv) ! 1691: { ! 1692: if (conv == error_mark_node) ! 1693: win += 2; ! 1694: else ! 1695: win++; ! 1696: } ! 1697: else if (TREE_CODE (TREE_VALUE (ttf)) == REFERENCE_TYPE) ! 1698: { ! 1699: conv = build_type_conversion (CALL_EXPR, formal_type, TREE_VALUE (tta), 0); ! 1700: if (conv) ! 1701: { ! 1702: if (conv == error_mark_node) ! 1703: win += 2; ! 1704: else ! 1705: win++; ! 1706: } ! 1707: } ! 1708: } ! 1709: } ! 1710: } ! 1711: dont_convert_types = 0; ! 1712: ! 1713: if (win == 1) ! 1714: { ! 1715: user_strikes += 1; ! 1716: cp->v.old_harshness[strike_index] = USER_HARSHNESS (-1); ! 1717: win = 0; ! 1718: } ! 1719: else ! 1720: { ! 1721: if (cp->u.bad_arg > strike_index) ! 1722: cp->u.bad_arg = strike_index; ! 1723: ! 1724: evil_strikes = win ? 2 : 1; ! 1725: break; ! 1726: } ! 1727: } ! 1728: ! 1729: ttf = TREE_CHAIN (ttf); ! 1730: tta = TREE_CHAIN (tta); ! 1731: strike_index += 1; ! 1732: } ! 1733: } ! 1734: ! 1735: /* Const member functions get a small penalty because defaulting ! 1736: to const is less useful than defaulting to non-const. */ ! 1737: /* This is bogus, it does not correspond to anything in the ARM. ! 1738: This code will be fixed when this entire section is rewritten ! 1739: to conform to the ARM. (mrs) */ ! 1740: if (TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE) ! 1741: { ! 1742: if (TYPE_READONLY (TREE_TYPE (TREE_VALUE (ttf_in)))) ! 1743: { ! 1744: cp->v.old_harshness[0] += INT_TO_EASY_HARSHNESS (1); ! 1745: ++easy_strikes; ! 1746: } ! 1747: else ! 1748: { ! 1749: /* Calling a non-const member function from a const member function ! 1750: is probably invalid, but for now we let it only draw a warning. ! 1751: We indicate that such a mismatch has occurred by setting the ! 1752: harshness to a maximum value. */ ! 1753: if (TREE_CODE (TREE_TYPE (TREE_VALUE (tta_in))) == POINTER_TYPE ! 1754: && (TYPE_READONLY (TREE_TYPE (TREE_TYPE (TREE_VALUE (tta_in)))))) ! 1755: cp->v.old_harshness[0] |= CONST_HARSHNESS (-1); ! 1756: } ! 1757: } ! 1758: ! 1759: cp->evil = evil_strikes; ! 1760: cp->ellipsis = ellipsis_strikes; ! 1761: cp->user = user_strikes; ! 1762: cp->b_or_d = b_or_d_strikes; ! 1763: cp->easy = easy_strikes; ! 1764: } ! 1765: ! 1766: void ! 1767: compute_conversion_costs (function, tta_in, cp, arglen) ! 1768: tree function; ! 1769: tree tta_in; ! 1770: struct candidate *cp; ! 1771: int arglen; ! 1772: { ! 1773: if (flag_ansi_overloading) ! 1774: compute_conversion_costs_ansi (function, tta_in, cp, arglen); ! 1775: else ! 1776: compute_conversion_costs_old (function, tta_in, cp, arglen); ! 1777: } ! 1778: ! 1779: /* When one of several possible overloaded functions and/or methods ! 1780: can be called, choose the best candidate for overloading. ! 1781: ! 1782: BASETYPE is the context from which we start method resolution ! 1783: or NULL if we are comparing overloaded functions. ! 1784: CANDIDATES is the array of candidates we have to choose from. ! 1785: N_CANDIDATES is the length of CANDIDATES. ! 1786: PARMS is a TREE_LIST of parameters to the function we'll ultimately ! 1787: choose. It is modified in place when resolving methods. It is not ! 1788: modified in place when resolving overloaded functions. ! 1789: LEN is the length of the parameter list. */ ! 1790: ! 1791: static struct candidate * ! 1792: ideal_candidate_old (basetype, candidates, n_candidates, parms, len) ! 1793: tree basetype; ! 1794: struct candidate *candidates; ! 1795: int n_candidates; ! 1796: tree parms; ! 1797: int len; ! 1798: { ! 1799: struct candidate *cp = candidates + n_candidates; ! 1800: int index, i; ! 1801: tree ttf; ! 1802: ! 1803: qsort (candidates, /* char *base */ ! 1804: n_candidates, /* int nel */ ! 1805: sizeof (struct candidate), /* int width */ ! 1806: rank_for_overload); /* int (*compar)() */ ! 1807: ! 1808: /* If the best candidate requires user-defined conversions, ! 1809: and its user-defined conversions are a strict subset ! 1810: of all other candidates requiring user-defined conversions, ! 1811: then it is, in fact, the best. */ ! 1812: for (i = -1; cp + i != candidates; i--) ! 1813: if (cp[i].user == 0) ! 1814: break; ! 1815: ! 1816: if (i < -1) ! 1817: { ! 1818: tree ttf0; ! 1819: ! 1820: /* Check that every other candidate requires those conversions ! 1821: as a strict subset of their conversions. */ ! 1822: if (cp[i].user == cp[-1].user) ! 1823: goto non_subset; ! 1824: ! 1825: /* Look at subset relationship more closely. */ ! 1826: while (i != -1) ! 1827: { ! 1828: for (ttf = TYPE_ARG_TYPES (TREE_TYPE (cp[i].function)), ! 1829: ttf0 = TYPE_ARG_TYPES (TREE_TYPE (cp[-1].function)), ! 1830: index = 0; index < len; index++) ! 1831: { ! 1832: if (USER_HARSHNESS (cp[i].v.old_harshness[index])) ! 1833: { ! 1834: /* If our "best" candidate also needs a conversion, ! 1835: it must be the same one. */ ! 1836: if (USER_HARSHNESS (cp[-1].v.old_harshness[index]) ! 1837: && TREE_VALUE (ttf) != TREE_VALUE (ttf0)) ! 1838: goto non_subset; ! 1839: } ! 1840: ttf = TREE_CHAIN (ttf); ! 1841: ttf0 = TREE_CHAIN (ttf0); ! 1842: /* Handle `...' gracefully. */ ! 1843: if (ttf == NULL_TREE || ttf0 == NULL_TREE) ! 1844: break; ! 1845: } ! 1846: i++; ! 1847: } ! 1848: /* The best was the best. */ ! 1849: return cp - 1; ! 1850: non_subset: ! 1851: /* Use other rules for determining "bestness". */ ! 1852: ; ! 1853: } ! 1854: ! 1855: /* If the best two candidates we find require user-defined ! 1856: conversions, we may need to report and error message. */ ! 1857: if (cp[-1].user && cp[-2].user ! 1858: && (cp[-1].b_or_d || cp[-2].b_or_d == 0)) ! 1859: { ! 1860: /* If the best two methods found involved user-defined ! 1861: type conversions, then we must see whether one ! 1862: of them is exactly what we wanted. If not, then ! 1863: we have an ambiguity. */ ! 1864: int best = 0; ! 1865: tree tta = parms; ! 1866: tree f1; ! 1867: #if 0 ! 1868: /* for LUCID */ ! 1869: tree p1; ! 1870: #endif ! 1871: ! 1872: /* Stash all of our parameters in safe places ! 1873: so that we can perform type conversions in place. */ ! 1874: while (tta) ! 1875: { ! 1876: TREE_PURPOSE (tta) = TREE_VALUE (tta); ! 1877: tta = TREE_CHAIN (tta); ! 1878: } ! 1879: ! 1880: i = 0; ! 1881: do ! 1882: { ! 1883: int exact_conversions = 0; ! 1884: ! 1885: i -= 1; ! 1886: tta = parms; ! 1887: if (DECL_STATIC_FUNCTION_P (cp[i].function)) ! 1888: tta = TREE_CHAIN (tta); ! 1889: /* special note, we don't go through len parameters, because we ! 1890: may only need len-1 parameters because of a call to a static ! 1891: member. */ ! 1892: for (ttf = TYPE_ARG_TYPES (TREE_TYPE (cp[i].function)), index = 0; ! 1893: tta; ! 1894: tta = TREE_CHAIN (tta), ttf = TREE_CHAIN (ttf), index++) ! 1895: { ! 1896: /* If this is a varargs function, there's no conversion to do, ! 1897: but don't accept an arg that needs a copy ctor. */ ! 1898: if (ttf == NULL_TREE) ! 1899: { ! 1900: /* FIXME: verify that we cannot get here with an ! 1901: arg that needs a ctor. */ ! 1902: break; ! 1903: } ! 1904: ! 1905: if (USER_HARSHNESS (cp[i].v.old_harshness[index])) ! 1906: { ! 1907: tree this_parm = build_type_conversion (CALL_EXPR, TREE_VALUE (ttf), TREE_PURPOSE (tta), 2); ! 1908: if (basetype != NULL_TREE) ! 1909: TREE_VALUE (tta) = this_parm; ! 1910: if (this_parm) ! 1911: { ! 1912: if (TREE_CODE (this_parm) != CONVERT_EXPR ! 1913: && (TREE_CODE (this_parm) != NOP_EXPR ! 1914: || comp_target_types (TREE_TYPE (this_parm), ! 1915: TREE_TYPE (TREE_OPERAND (this_parm, 0)), 1))) ! 1916: exact_conversions += 1; ! 1917: } ! 1918: else if (PROMOTES_TO_AGGR_TYPE (TREE_VALUE (ttf), REFERENCE_TYPE)) ! 1919: { ! 1920: /* To get here we had to have succeeded via ! 1921: a constructor. */ ! 1922: TREE_VALUE (tta) = TREE_PURPOSE (tta); ! 1923: exact_conversions += 1; ! 1924: } ! 1925: } ! 1926: } ! 1927: if (exact_conversions == cp[i].user) ! 1928: { ! 1929: if (best == 0) ! 1930: { ! 1931: best = i; ! 1932: f1 = cp[best].function; ! 1933: #if 0 ! 1934: /* For LUCID */ ! 1935: p1 = TYPE_ARG_TYPES (TREE_TYPE (f1)); ! 1936: #endif ! 1937: } ! 1938: else ! 1939: { ! 1940: /* Don't complain if next best is from base class. */ ! 1941: tree f2 = cp[i].function; ! 1942: ! 1943: if (TREE_CODE (TREE_TYPE (f1)) == METHOD_TYPE ! 1944: && TREE_CODE (TREE_TYPE (f2)) == METHOD_TYPE ! 1945: && BASE_DERIVED_HARSHNESS (cp[i].v.old_harshness[0]) ! 1946: && cp[best].v.old_harshness[0] < cp[i].v.old_harshness[0]) ! 1947: { ! 1948: #if 0 ! 1949: tree p2 = TYPE_ARG_TYPES (TREE_TYPE (f2)); ! 1950: /* For LUCID. */ ! 1951: if (! compparms (TREE_CHAIN (p1), TREE_CHAIN (p2), 1)) ! 1952: goto ret0; ! 1953: else ! 1954: #endif ! 1955: continue; ! 1956: } ! 1957: else ! 1958: { ! 1959: /* Ensure that there's nothing ambiguous about these ! 1960: two fns. */ ! 1961: int identical = 1; ! 1962: for (index = 0; index < len; index++) ! 1963: { ! 1964: /* Type conversions must be piecewise equivalent. */ ! 1965: if (USER_HARSHNESS (cp[best].v.old_harshness[index]) ! 1966: != USER_HARSHNESS (cp[i].v.old_harshness[index])) ! 1967: goto ret0; ! 1968: /* If there's anything we like better about the ! 1969: other function, consider it ambiguous. */ ! 1970: if (cp[i].v.old_harshness[index] < cp[best].v.old_harshness[index]) ! 1971: goto ret0; ! 1972: /* If any single one it diffent, then the whole is ! 1973: not identical. */ ! 1974: if (cp[i].v.old_harshness[index] != cp[best].v.old_harshness[index]) ! 1975: identical = 0; ! 1976: } ! 1977: ! 1978: /* If we can't tell the difference between the two, it ! 1979: is ambiguous. */ ! 1980: if (identical) ! 1981: goto ret0; ! 1982: ! 1983: /* If we made it to here, it means we're satisfied that ! 1984: BEST is still best. */ ! 1985: continue; ! 1986: } ! 1987: } ! 1988: } ! 1989: } while (cp + i != candidates); ! 1990: ! 1991: if (best) ! 1992: { ! 1993: int exact_conversions = cp[best].user; ! 1994: tta = parms; ! 1995: if (DECL_STATIC_FUNCTION_P (cp[best].function)) ! 1996: tta = TREE_CHAIN (parms); ! 1997: for (ttf = TYPE_ARG_TYPES (TREE_TYPE (cp[best].function)), index = 0; ! 1998: exact_conversions > 0; ! 1999: tta = TREE_CHAIN (tta), ttf = TREE_CHAIN (ttf), index++) ! 2000: { ! 2001: if (USER_HARSHNESS (cp[best].v.old_harshness[index])) ! 2002: { ! 2003: /* We must now fill in the slot we left behind. ! 2004: @@ This could be optimized to use the value previously ! 2005: @@ computed by build_type_conversion in some cases. */ ! 2006: if (basetype != NULL_TREE) ! 2007: TREE_VALUE (tta) = convert (TREE_VALUE (ttf), TREE_PURPOSE (tta)); ! 2008: exact_conversions -= 1; ! 2009: } ! 2010: else ! 2011: TREE_VALUE (tta) = TREE_PURPOSE (tta); ! 2012: } ! 2013: return cp + best; ! 2014: } ! 2015: goto ret0; ! 2016: } ! 2017: /* If the best two candidates we find both use default parameters, ! 2018: we may need to report and error. Don't need to worry if next-best ! 2019: candidate is forced to use user-defined conversion when best is not. */ ! 2020: if (cp[-2].user == 0 ! 2021: && cp[-1].v.old_harshness[len] != 0 && cp[-2].v.old_harshness[len] != 0) ! 2022: { ! 2023: tree tt1 = TYPE_ARG_TYPES (TREE_TYPE (cp[-1].function)); ! 2024: tree tt2 = TYPE_ARG_TYPES (TREE_TYPE (cp[-2].function)); ! 2025: unsigned i = cp[-1].v.old_harshness[len]; ! 2026: ! 2027: if (cp[-2].v.old_harshness[len] < i) ! 2028: i = cp[-2].v.old_harshness[len]; ! 2029: while (--i > 0) ! 2030: { ! 2031: if (TYPE_MAIN_VARIANT (TREE_VALUE (tt1)) ! 2032: != TYPE_MAIN_VARIANT (TREE_VALUE (tt2))) ! 2033: /* These lists are not identical, so we can choose our best candidate. */ ! 2034: return cp - 1; ! 2035: tt1 = TREE_CHAIN (tt1); ! 2036: tt2 = TREE_CHAIN (tt2); ! 2037: } ! 2038: /* To get here, both lists had the same parameters up to the defaults ! 2039: which were used. This is an ambiguous request. */ ! 2040: goto ret0; ! 2041: } ! 2042: ! 2043: /* Otherwise, return our best candidate. Note that if we get candidates ! 2044: from independent base classes, we have an ambiguity, even if one ! 2045: argument list look a little better than another one. */ ! 2046: if (cp[-1].b_or_d && basetype && TYPE_USES_MULTIPLE_INHERITANCE (basetype)) ! 2047: { ! 2048: int i = n_candidates - 1, best = i; ! 2049: tree base1 = NULL_TREE; ! 2050: ! 2051: if (TREE_CODE (TREE_TYPE (candidates[i].function)) == FUNCTION_TYPE) ! 2052: return cp - 1; ! 2053: ! 2054: for (; i >= 0 && candidates[i].user == 0 && candidates[i].evil == 0; i--) ! 2055: { ! 2056: if (TREE_CODE (TREE_TYPE (candidates[i].function)) == METHOD_TYPE) ! 2057: { ! 2058: tree newbase = DECL_CLASS_CONTEXT (candidates[i].function); ! 2059: ! 2060: if (base1 != NULL_TREE) ! 2061: { ! 2062: /* newbase could be a base or a parent of base1 */ ! 2063: if (newbase != base1 && ! UNIQUELY_DERIVED_FROM_P (newbase, base1) ! 2064: && ! UNIQUELY_DERIVED_FROM_P (base1, newbase)) ! 2065: { ! 2066: cp_error ("ambiguous request for function from distinct base classes of type `%T'", basetype); ! 2067: cp_error_at (" first candidate is `%#D'", ! 2068: candidates[best].function); ! 2069: cp_error_at (" second candidate is `%#D'", ! 2070: candidates[i].function); ! 2071: cp[-1].evil = 1; ! 2072: return cp - 1; ! 2073: } ! 2074: } ! 2075: else ! 2076: { ! 2077: best = i; ! 2078: base1 = newbase; ! 2079: } ! 2080: } ! 2081: else ! 2082: return cp - 1; ! 2083: } ! 2084: } ! 2085: ! 2086: /* Don't accept a candidate as being ideal if it's indistinguishable ! 2087: from another candidate. */ ! 2088: if (rank_for_overload (cp-1, cp-2) == 0) ! 2089: { ! 2090: /* If the types are distinguishably different (like ! 2091: `long' vs. `unsigned long'), that's ok. But if they are arbitrarily ! 2092: different, such as `int (*)(void)' vs. `void (*)(int)', ! 2093: that's not ok. */ ! 2094: tree p1 = TYPE_ARG_TYPES (TREE_TYPE (cp[-1].function)); ! 2095: tree p2 = TYPE_ARG_TYPES (TREE_TYPE (cp[-2].function)); ! 2096: while (p1 && p2) ! 2097: { ! 2098: if (TREE_CODE (TREE_VALUE (p1)) == POINTER_TYPE ! 2099: && TREE_CODE (TREE_TYPE (TREE_VALUE (p1))) == FUNCTION_TYPE ! 2100: && TREE_VALUE (p1) != TREE_VALUE (p2)) ! 2101: return NULL; ! 2102: p1 = TREE_CHAIN (p1); ! 2103: p2 = TREE_CHAIN (p2); ! 2104: } ! 2105: if (p1 || p2) ! 2106: return NULL; ! 2107: } ! 2108: ! 2109: return cp - 1; ! 2110: ! 2111: ret0: ! 2112: /* In the case where there is no ideal candidate, restore ! 2113: TREE_VALUE slots of PARMS from TREE_PURPOSE slots. */ ! 2114: while (parms) ! 2115: { ! 2116: TREE_VALUE (parms) = TREE_PURPOSE (parms); ! 2117: parms = TREE_CHAIN (parms); ! 2118: } ! 2119: return NULL; ! 2120: } ! 2121: ! 2122: /* Subroutine of ideal_candidate. See if X or Y is a better match ! 2123: than the other. */ ! 2124: static int ! 2125: strictly_better (x, y) ! 2126: unsigned short x, y; ! 2127: { ! 2128: unsigned short xor; ! 2129: ! 2130: if (x == y) ! 2131: return 0; ! 2132: ! 2133: xor = x ^ y; ! 2134: if (xor >= x || xor >= y) ! 2135: return 1; ! 2136: return 0; ! 2137: } ! 2138: ! 2139: static struct candidate * ! 2140: ideal_candidate_ansi (basetype, candidates, n_candidates, parms, len) ! 2141: tree basetype; ! 2142: struct candidate *candidates; ! 2143: int n_candidates; ! 2144: tree parms; ! 2145: int len; ! 2146: { ! 2147: struct candidate *cp = candidates+n_candidates; ! 2148: int i, j, best_code; ! 2149: ! 2150: /* For each argument, sort the functions from best to worst for the arg. ! 2151: For each function that's not best for this arg, set its overall ! 2152: harshness to EVIL so that other args won't like it. The candidate ! 2153: list for the last argument is the intersection of all the best-liked ! 2154: functions. */ ! 2155: ! 2156: for (i = 0; i < len; i++) ! 2157: { ! 2158: qsort (candidates, n_candidates, sizeof (struct candidate), ! 2159: rank_for_overload); ! 2160: best_code = cp[-1].h.code; ! 2161: ! 2162: /* To find out functions that are worse than that represented ! 2163: by BEST_CODE, we can't just do a comparison like h.code>best_code. ! 2164: The total harshness for the "best" fn may be 8|8 for two args, and ! 2165: the harshness for the next-best may be 8|2. If we just compared, ! 2166: that would be checking 8>10, which would lead to the next-best ! 2167: being disqualified. What we actually want to do is get rid ! 2168: of functions that are definitely worse than that represented ! 2169: by best_code, i.e. those which have bits set higher than the ! 2170: highest in best_code. Sooooo, what we do is clear out everything ! 2171: represented by best_code, and see if we still come up with something ! 2172: higher. If so (e.g., 8|8 vs 8|16), it'll disqualify it properly. */ ! 2173: for (j = n_candidates-2; j >= 0; j--) ! 2174: if ((candidates[j].h.code & ~best_code) > best_code) ! 2175: candidates[j].h.code = EVIL_CODE; ! 2176: } ! 2177: ! 2178: if (cp[-1].h.code & EVIL_CODE) ! 2179: return NULL; ! 2180: ! 2181: /* If they're at least as good as each other, do an arg-by-arg check. */ ! 2182: if (! strictly_better (cp[-1].h.code, cp[-2].h.code)) ! 2183: { ! 2184: int better = 0; ! 2185: int worse = 0; ! 2186: ! 2187: for (j = 0; j < n_candidates; j++) ! 2188: if (! strictly_better (candidates[j].h.code, best_code)) ! 2189: break; ! 2190: ! 2191: qsort (candidates+j, n_candidates-j, sizeof (struct candidate), ! 2192: rank_for_ideal); ! 2193: for (i = 0; i < len; i++) ! 2194: { ! 2195: if (cp[-1].v.ansi_harshness[i].code < cp[-2].v.ansi_harshness[i].code) ! 2196: better = 1; ! 2197: else if (cp[-1].v.ansi_harshness[i].code > cp[-2].v.ansi_harshness[i].code) ! 2198: worse = 1; ! 2199: else if (cp[-1].v.ansi_harshness[i].code & STD_CODE) ! 2200: { ! 2201: /* If it involves a standard conversion, let the ! 2202: inheritance lattice be the final arbiter. */ ! 2203: if (cp[-1].v.ansi_harshness[i].distance > cp[-2].v.ansi_harshness[i].distance) ! 2204: worse = 1; ! 2205: else if (cp[-1].v.ansi_harshness[i].distance < cp[-2].v.ansi_harshness[i].distance) ! 2206: better = 1; ! 2207: } ! 2208: else if (cp[-1].v.ansi_harshness[i].code & PROMO_CODE) ! 2209: { ! 2210: /* For integral promotions, take into account a finer granularity for ! 2211: determining which types should be favored over others in such ! 2212: promotions. */ ! 2213: if (cp[-1].v.ansi_harshness[i].int_penalty > cp[-2].v.ansi_harshness[i].int_penalty) ! 2214: worse = 1; ! 2215: else if (cp[-1].v.ansi_harshness[i].int_penalty < cp[-2].v.ansi_harshness[i].int_penalty) ! 2216: better = 1; ! 2217: } ! 2218: } ! 2219: ! 2220: if (! better || worse) ! 2221: return NULL; ! 2222: } ! 2223: return cp-1; ! 2224: } ! 2225: ! 2226: static struct candidate * ! 2227: ideal_candidate (basetype, candidates, n_candidates, parms, len) ! 2228: tree basetype; ! 2229: struct candidate *candidates; ! 2230: int n_candidates; ! 2231: tree parms; ! 2232: int len; ! 2233: { ! 2234: if (flag_ansi_overloading) ! 2235: return ideal_candidate_ansi (basetype, candidates, n_candidates, parms, ! 2236: len); ! 2237: else ! 2238: return ideal_candidate_old (basetype, candidates, n_candidates, parms, ! 2239: len); ! 2240: } ! 2241: ! 2242: /* Assume that if the class referred to is not in the ! 2243: current class hierarchy, that it may be remote. ! 2244: PARENT is assumed to be of aggregate type here. */ ! 2245: static int ! 2246: may_be_remote (parent) ! 2247: tree parent; ! 2248: { ! 2249: if (TYPE_OVERLOADS_METHOD_CALL_EXPR (parent) == 0) ! 2250: return 0; ! 2251: ! 2252: if (current_class_type == NULL_TREE) ! 2253: return 0; ! 2254: ! 2255: if (parent == current_class_type) ! 2256: return 0; ! 2257: ! 2258: if (UNIQUELY_DERIVED_FROM_P (parent, current_class_type)) ! 2259: return 0; ! 2260: return 1; ! 2261: } ! 2262: ! 2263: tree ! 2264: build_vfield_ref (datum, type) ! 2265: tree datum, type; ! 2266: { ! 2267: tree rval; ! 2268: int old_assume_nonnull_objects = flag_assume_nonnull_objects; ! 2269: ! 2270: if (datum == error_mark_node) ! 2271: return error_mark_node; ! 2272: ! 2273: /* Vtable references are always made from non-null objects. */ ! 2274: flag_assume_nonnull_objects = 1; ! 2275: if (TREE_CODE (TREE_TYPE (datum)) == REFERENCE_TYPE) ! 2276: datum = convert_from_reference (datum); ! 2277: ! 2278: if (! TYPE_USES_COMPLEX_INHERITANCE (type)) ! 2279: rval = build (COMPONENT_REF, TREE_TYPE (CLASSTYPE_VFIELD (type)), ! 2280: datum, CLASSTYPE_VFIELD (type)); ! 2281: else ! 2282: rval = build_component_ref (datum, DECL_NAME (CLASSTYPE_VFIELD (type)), 0, 0); ! 2283: flag_assume_nonnull_objects = old_assume_nonnull_objects; ! 2284: ! 2285: return rval; ! 2286: } ! 2287: ! 2288: /* Build a call to a member of an object. I.e., one that overloads ! 2289: operator ()(), or is a pointer-to-function or pointer-to-method. */ ! 2290: static tree ! 2291: build_field_call (basetype_path, instance_ptr, name, parms, err_name) ! 2292: tree basetype_path, instance_ptr, name, parms; ! 2293: char *err_name; ! 2294: { ! 2295: tree field, instance; ! 2296: ! 2297: if (instance_ptr == current_class_decl) ! 2298: { ! 2299: /* Check to see if we really have a reference to an instance variable ! 2300: with `operator()()' overloaded. */ ! 2301: field = IDENTIFIER_CLASS_VALUE (name); ! 2302: ! 2303: if (field == NULL_TREE) ! 2304: { ! 2305: error ("`this' has no member named `%s'", err_name); ! 2306: return error_mark_node; ! 2307: } ! 2308: ! 2309: if (TREE_CODE (field) == FIELD_DECL) ! 2310: { ! 2311: /* If it's a field, try overloading operator (), ! 2312: or calling if the field is a pointer-to-function. */ ! 2313: instance = build_component_ref_1 (C_C_D, field, 0); ! 2314: if (instance == error_mark_node) ! 2315: return error_mark_node; ! 2316: ! 2317: if (TYPE_LANG_SPECIFIC (TREE_TYPE (instance)) ! 2318: && TYPE_OVERLOADS_CALL_EXPR (TREE_TYPE (instance))) ! 2319: return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, instance, parms, NULL_TREE); ! 2320: ! 2321: if (TREE_CODE (TREE_TYPE (instance)) == POINTER_TYPE) ! 2322: { ! 2323: if (TREE_CODE (TREE_TYPE (TREE_TYPE (instance))) == FUNCTION_TYPE) ! 2324: return build_function_call (instance, parms); ! 2325: else if (TREE_CODE (TREE_TYPE (TREE_TYPE (instance))) == METHOD_TYPE) ! 2326: return build_function_call (instance, tree_cons (NULL_TREE, current_class_decl, parms)); ! 2327: } ! 2328: } ! 2329: return NULL_TREE; ! 2330: } ! 2331: ! 2332: /* Check to see if this is not really a reference to an instance variable ! 2333: with `operator()()' overloaded. */ ! 2334: field = lookup_field (basetype_path, name, 1, 0); ! 2335: ! 2336: /* This can happen if the reference was ambiguous ! 2337: or for visibility violations. */ ! 2338: if (field == error_mark_node) ! 2339: return error_mark_node; ! 2340: ! 2341: if (field) ! 2342: { ! 2343: tree basetype; ! 2344: tree ftype = TREE_TYPE (field); ! 2345: ! 2346: if (TREE_CODE (ftype) == REFERENCE_TYPE) ! 2347: ftype = TREE_TYPE (ftype); ! 2348: ! 2349: if (TYPE_LANG_SPECIFIC (ftype) && TYPE_OVERLOADS_CALL_EXPR (ftype)) ! 2350: { ! 2351: /* Make the next search for this field very short. */ ! 2352: basetype = DECL_FIELD_CONTEXT (field); ! 2353: instance_ptr = convert_pointer_to (basetype, instance_ptr); ! 2354: ! 2355: instance = build_indirect_ref (instance_ptr, NULL_PTR); ! 2356: return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, ! 2357: build_component_ref_1 (instance, field, 0), ! 2358: parms, NULL_TREE); ! 2359: } ! 2360: if (TREE_CODE (ftype) == POINTER_TYPE) ! 2361: { ! 2362: if (TREE_CODE (TREE_TYPE (ftype)) == FUNCTION_TYPE ! 2363: || TREE_CODE (TREE_TYPE (ftype)) == METHOD_TYPE) ! 2364: { ! 2365: /* This is a member which is a pointer to function. */ ! 2366: tree ref ! 2367: = build_component_ref_1 (build_indirect_ref (instance_ptr, ! 2368: NULL_PTR), ! 2369: field, LOOKUP_COMPLAIN); ! 2370: if (ref == error_mark_node) ! 2371: return error_mark_node; ! 2372: return build_function_call (ref, parms); ! 2373: } ! 2374: } ! 2375: else if (TREE_CODE (ftype) == METHOD_TYPE) ! 2376: { ! 2377: error ("invalid call via pointer-to-member function"); ! 2378: return error_mark_node; ! 2379: } ! 2380: else ! 2381: return NULL_TREE; ! 2382: } ! 2383: return NULL_TREE; ! 2384: } ! 2385: ! 2386: tree ! 2387: find_scoped_type (type, inner_name, inner_types) ! 2388: tree type, inner_name, inner_types; ! 2389: { ! 2390: tree tags = CLASSTYPE_TAGS (type); ! 2391: ! 2392: while (tags) ! 2393: { ! 2394: /* The TREE_PURPOSE of an enum tag (which becomes a member of the ! 2395: enclosing class) is set to the name for the enum type. So, if ! 2396: inner_name is `bar', and we strike `baz' for `enum bar { baz }', ! 2397: then this test will be true. */ ! 2398: if (TREE_PURPOSE (tags) == inner_name) ! 2399: { ! 2400: if (inner_types == NULL_TREE) ! 2401: return DECL_NESTED_TYPENAME (TYPE_NAME (TREE_VALUE (tags))); ! 2402: return resolve_scope_to_name (TREE_VALUE (tags), inner_types); ! 2403: } ! 2404: tags = TREE_CHAIN (tags); ! 2405: } ! 2406: ! 2407: #if 0 ! 2408: /* XXX This needs to be fixed better. */ ! 2409: if (TREE_CODE (type) == UNINSTANTIATED_P_TYPE) ! 2410: { ! 2411: sorry ("nested class lookup in template type"); ! 2412: return NULL_TREE; ! 2413: } ! 2414: #endif ! 2415: ! 2416: /* Look for a TYPE_DECL. */ ! 2417: for (tags = TYPE_FIELDS (type); tags; tags = TREE_CHAIN (tags)) ! 2418: if (TREE_CODE (tags) == TYPE_DECL && DECL_NAME (tags) == inner_name) ! 2419: { ! 2420: /* Code by raeburn. */ ! 2421: if (inner_types == NULL_TREE) ! 2422: return DECL_NESTED_TYPENAME (tags); ! 2423: return resolve_scope_to_name (TREE_TYPE (tags), inner_types); ! 2424: } ! 2425: ! 2426: return NULL_TREE; ! 2427: } ! 2428: ! 2429: /* Resolve an expression NAME1::NAME2::...::NAMEn to ! 2430: the name that names the above nested type. INNER_TYPES ! 2431: is a chain of nested type names (held together by SCOPE_REFs); ! 2432: OUTER_TYPE is the type we know to enclose INNER_TYPES. ! 2433: Returns NULL_TREE if there is an error. */ ! 2434: tree ! 2435: resolve_scope_to_name (outer_type, inner_types) ! 2436: tree outer_type, inner_types; ! 2437: { ! 2438: register tree tmp; ! 2439: tree inner_name; ! 2440: ! 2441: if (outer_type == NULL_TREE && current_class_type != NULL_TREE) ! 2442: { ! 2443: /* We first try to look for a nesting in our current class context, ! 2444: then try any enclosing classes. */ ! 2445: tree type = current_class_type; ! 2446: ! 2447: while (type && (TREE_CODE (type) == RECORD_TYPE ! 2448: || TREE_CODE (type) == UNION_TYPE)) ! 2449: { ! 2450: tree rval = resolve_scope_to_name (type, inner_types); ! 2451: ! 2452: if (rval != NULL_TREE) ! 2453: return rval; ! 2454: type = DECL_CONTEXT (TYPE_NAME (type)); ! 2455: } ! 2456: } ! 2457: ! 2458: if (TREE_CODE (inner_types) == SCOPE_REF) ! 2459: { ! 2460: inner_name = TREE_OPERAND (inner_types, 0); ! 2461: inner_types = TREE_OPERAND (inner_types, 1); ! 2462: } ! 2463: else ! 2464: { ! 2465: inner_name = inner_types; ! 2466: inner_types = NULL_TREE; ! 2467: } ! 2468: ! 2469: if (outer_type == NULL_TREE) ! 2470: { ! 2471: /* If we have something that's already a type by itself, ! 2472: use that. */ ! 2473: if (IDENTIFIER_HAS_TYPE_VALUE (inner_name)) ! 2474: { ! 2475: if (inner_types) ! 2476: return resolve_scope_to_name (IDENTIFIER_TYPE_VALUE (inner_name), ! 2477: inner_types); ! 2478: return inner_name; ! 2479: } ! 2480: return NULL_TREE; ! 2481: } ! 2482: ! 2483: if (! IS_AGGR_TYPE (outer_type)) ! 2484: return NULL_TREE; ! 2485: ! 2486: /* Look for member classes or enums. */ ! 2487: tmp = find_scoped_type (outer_type, inner_name, inner_types); ! 2488: ! 2489: /* If it's not a type in this class, then go down into the ! 2490: base classes and search there. */ ! 2491: if (! tmp && TYPE_BINFO (outer_type)) ! 2492: { ! 2493: tree binfos = TYPE_BINFO_BASETYPES (outer_type); ! 2494: int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; ! 2495: ! 2496: for (i = 0; i < n_baselinks; i++) ! 2497: { ! 2498: tree base_binfo = TREE_VEC_ELT (binfos, i); ! 2499: tmp = find_scoped_type (BINFO_TYPE (base_binfo), ! 2500: inner_name, inner_types); ! 2501: if (tmp) ! 2502: return tmp; ! 2503: } ! 2504: tmp = NULL_TREE; ! 2505: } ! 2506: ! 2507: return tmp; ! 2508: } ! 2509: ! 2510: /* Build a method call of the form `EXP->SCOPES::NAME (PARMS)'. ! 2511: This is how virtual function calls are avoided. */ ! 2512: tree ! 2513: build_scoped_method_call (exp, scopes, name, parms) ! 2514: tree exp, scopes, name, parms; ! 2515: { ! 2516: /* Because this syntactic form does not allow ! 2517: a pointer to a base class to be `stolen', ! 2518: we need not protect the derived->base conversion ! 2519: that happens here. ! 2520: ! 2521: @@ But we do have to check visibility privileges later. */ ! 2522: tree basename = resolve_scope_to_name (NULL_TREE, scopes); ! 2523: tree basetype, binfo, decl; ! 2524: tree type = TREE_TYPE (exp); ! 2525: ! 2526: if (type == error_mark_node ! 2527: || basename == NULL_TREE) ! 2528: return error_mark_node; ! 2529: ! 2530: basetype = IDENTIFIER_TYPE_VALUE (basename); ! 2531: ! 2532: if (TREE_CODE (type) == REFERENCE_TYPE) ! 2533: type = TREE_TYPE (type); ! 2534: ! 2535: /* Destructors can be "called" for simple types; see 5.2.4 and 12.4 Note ! 2536: that explicit ~int is caught in the parser; this deals with typedefs ! 2537: and template parms. */ ! 2538: if (TREE_CODE (name) == BIT_NOT_EXPR && ! is_aggr_typedef (basename, 0)) ! 2539: { ! 2540: if (type != basetype) ! 2541: cp_error ("type of `%E' does not match destructor type `%T' (type was `%T')", ! 2542: exp, basetype, type); ! 2543: name = IDENTIFIER_TYPE_VALUE (TREE_OPERAND (name, 0)); ! 2544: if (basetype != name) ! 2545: cp_error ("qualified type `%T' does not match destructor type `%T'", ! 2546: basetype, name); ! 2547: return void_zero_node; ! 2548: } ! 2549: ! 2550: if (! is_aggr_typedef (basename, 1)) ! 2551: return error_mark_node; ! 2552: ! 2553: if (! IS_AGGR_TYPE (type)) ! 2554: { ! 2555: cp_error ("base object `%E' of scoped method call is of non-aggregate type `%T'", ! 2556: exp, type); ! 2557: return error_mark_node; ! 2558: } ! 2559: ! 2560: if (binfo = binfo_or_else (basetype, type)) ! 2561: { ! 2562: if (binfo == error_mark_node) ! 2563: return error_mark_node; ! 2564: if (TREE_CODE (exp) == INDIRECT_REF) ! 2565: decl = build_indirect_ref (convert_pointer_to (binfo, ! 2566: build_unary_op (ADDR_EXPR, exp, 0)), NULL_PTR); ! 2567: else ! 2568: decl = build_scoped_ref (exp, scopes); ! 2569: ! 2570: /* Call to a destructor. */ ! 2571: if (TREE_CODE (name) == BIT_NOT_EXPR) ! 2572: { ! 2573: /* Explicit call to destructor. */ ! 2574: name = TREE_OPERAND (name, 0); ! 2575: if (TREE_TYPE (decl) != ! 2576: (IDENTIFIER_CLASS_VALUE (name) ! 2577: ? IDENTIFIER_CLASS_TYPE_VALUE (name) ! 2578: : IDENTIFIER_TYPE_VALUE (name))) ! 2579: { ! 2580: cp_error ! 2581: ("qualified type `%T' does not match destructor type `%T'", ! 2582: TREE_TYPE (decl), name); ! 2583: return error_mark_node; ! 2584: } ! 2585: if (! TYPE_HAS_DESTRUCTOR (TREE_TYPE (decl))) ! 2586: return void_zero_node; ! 2587: ! 2588: return build_delete (TREE_TYPE (decl), decl, integer_two_node, ! 2589: LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, ! 2590: 0); ! 2591: } ! 2592: ! 2593: /* Call to a method. */ ! 2594: return build_method_call (decl, name, parms, NULL_TREE, ! 2595: LOOKUP_NORMAL|LOOKUP_NONVIRTUAL); ! 2596: } ! 2597: return error_mark_node; ! 2598: } ! 2599: ! 2600: /* Build something of the form ptr->method (args) ! 2601: or object.method (args). This can also build ! 2602: calls to constructors, and find friends. ! 2603: ! 2604: Member functions always take their class variable ! 2605: as a pointer. ! 2606: ! 2607: INSTANCE is a class instance. ! 2608: ! 2609: NAME is the NAME field of the struct, union, or class ! 2610: whose type is that of INSTANCE. ! 2611: ! 2612: PARMS help to figure out what that NAME really refers to. ! 2613: ! 2614: BASETYPE_PATH, if non-NULL, tells which basetypes of INSTANCE ! 2615: we should be traversed before starting our search. We need ! 2616: this information to get protected accesses correct. ! 2617: ! 2618: FLAGS is the logical disjunction of zero or more LOOKUP_ ! 2619: flags. See cp-tree.h for more info. ! 2620: ! 2621: If this is all OK, calls build_function_call with the resolved ! 2622: member function. ! 2623: ! 2624: This function must also handle being called to perform ! 2625: initialization, promotion/coercion of arguments, and ! 2626: instantiation of default parameters. ! 2627: ! 2628: Note that NAME may refer to an instance variable name. If ! 2629: `operator()()' is defined for the type of that field, then we return ! 2630: that result. */ ! 2631: tree ! 2632: build_method_call (instance, name, parms, basetype_path, flags) ! 2633: tree instance, name, parms, basetype_path; ! 2634: int flags; ! 2635: { ! 2636: register tree function, fntype, value_type; ! 2637: register tree basetype, save_basetype; ! 2638: register tree baselink, result, method_name, parmtypes, parm; ! 2639: tree last; ! 2640: int pass; ! 2641: enum visibility_type visibility; ! 2642: ! 2643: /* Range of cases for vtable optimization. */ ! 2644: enum vtable_needs { not_needed, maybe_needed, unneeded, needed }; ! 2645: enum vtable_needs need_vtbl = not_needed; ! 2646: ! 2647: char *err_name; ! 2648: char *name_kind; ! 2649: int ever_seen = 0; ! 2650: tree instance_ptr = NULL_TREE; ! 2651: int all_virtual = flag_all_virtual; ! 2652: int static_call_context = 0; ! 2653: tree saw_private = NULL_TREE; ! 2654: tree saw_protected = NULL_TREE; ! 2655: ! 2656: /* Keep track of `const' and `volatile' objects. */ ! 2657: int constp, volatilep; ! 2658: ! 2659: #ifdef GATHER_STATISTICS ! 2660: n_build_method_call++; ! 2661: #endif ! 2662: ! 2663: if (instance == error_mark_node ! 2664: || name == error_mark_node ! 2665: || parms == error_mark_node ! 2666: || (instance != NULL_TREE && TREE_TYPE (instance) == error_mark_node)) ! 2667: return error_mark_node; ! 2668: ! 2669: /* This is the logic that magically deletes the second argument to ! 2670: operator delete, if it is not needed. */ ! 2671: if (name == ansi_opname[(int) DELETE_EXPR] && list_length (parms)==2) ! 2672: { ! 2673: tree save_last = TREE_CHAIN (parms); ! 2674: tree result; ! 2675: /* get rid of unneeded argument */ ! 2676: TREE_CHAIN (parms) = NULL_TREE; ! 2677: result = build_method_call (instance, name, parms, basetype_path, ! 2678: (LOOKUP_SPECULATIVELY|flags) ! 2679: &~LOOKUP_COMPLAIN); ! 2680: /* If it works, return it. */ ! 2681: if (result && result != error_mark_node) ! 2682: return build_method_call (instance, name, parms, basetype_path, flags); ! 2683: /* If it doesn't work, two argument delete must work */ ! 2684: TREE_CHAIN (parms) = save_last; ! 2685: } ! 2686: ! 2687: if (TREE_CODE (name) == BIT_NOT_EXPR) ! 2688: { ! 2689: flags |= LOOKUP_DESTRUCTOR; ! 2690: name = TREE_OPERAND (name, 0); ! 2691: if (parms) ! 2692: error ("destructors take no parameters"); ! 2693: basetype = IDENTIFIER_TYPE_VALUE (name); ! 2694: if (basetype == NULL_TREE) ! 2695: basetype = IDENTIFIER_CLASS_TYPE_VALUE (name); ! 2696: if (! TYPE_HAS_DESTRUCTOR (basetype)) ! 2697: return void_zero_node; ! 2698: instance = default_conversion (instance); ! 2699: if (TREE_CODE (TREE_TYPE (instance)) == POINTER_TYPE) ! 2700: instance_ptr = instance; ! 2701: else ! 2702: instance_ptr = build_unary_op (ADDR_EXPR, instance, 0); ! 2703: return build_delete (build_pointer_type (basetype), ! 2704: instance_ptr, integer_two_node, ! 2705: LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0); ! 2706: } ! 2707: ! 2708: /* Initialize name for error reporting. */ ! 2709: if (IDENTIFIER_TYPENAME_P (name)) ! 2710: err_name = "type conversion operator"; ! 2711: else if (IDENTIFIER_OPNAME_P (name)) ! 2712: { ! 2713: char *p = operator_name_string (name); ! 2714: err_name = (char *)alloca (strlen (p) + 10); ! 2715: sprintf (err_name, "operator %s", p); ! 2716: } ! 2717: else if (TREE_CODE (name) == SCOPE_REF) ! 2718: err_name = IDENTIFIER_POINTER (TREE_OPERAND (name, 1)); ! 2719: else ! 2720: err_name = IDENTIFIER_POINTER (name); ! 2721: ! 2722: if (IDENTIFIER_OPNAME_P (name)) ! 2723: GNU_xref_call (current_function_decl, IDENTIFIER_POINTER (name)); ! 2724: else ! 2725: GNU_xref_call (current_function_decl, err_name); ! 2726: ! 2727: if (instance == NULL_TREE) ! 2728: { ! 2729: basetype = NULL_TREE; ! 2730: /* Check cases where this is really a call to raise ! 2731: an exception. */ ! 2732: if (current_class_type && TREE_CODE (name) == IDENTIFIER_NODE) ! 2733: { ! 2734: basetype = purpose_member (name, CLASSTYPE_TAGS (current_class_type)); ! 2735: if (basetype) ! 2736: basetype = TREE_VALUE (basetype); ! 2737: } ! 2738: else if (TREE_CODE (name) == SCOPE_REF ! 2739: && TREE_CODE (TREE_OPERAND (name, 0)) == IDENTIFIER_NODE) ! 2740: { ! 2741: if (! is_aggr_typedef (TREE_OPERAND (name, 0), 1)) ! 2742: return error_mark_node; ! 2743: basetype = purpose_member (TREE_OPERAND (name, 1), ! 2744: CLASSTYPE_TAGS (IDENTIFIER_TYPE_VALUE (TREE_OPERAND (name, 0)))); ! 2745: if (basetype) ! 2746: basetype = TREE_VALUE (basetype); ! 2747: } ! 2748: ! 2749: if (basetype != NULL_TREE) ! 2750: ; ! 2751: /* call to a constructor... */ ! 2752: else if (IDENTIFIER_HAS_TYPE_VALUE (name)) ! 2753: { ! 2754: basetype = IDENTIFIER_TYPE_VALUE (name); ! 2755: name = constructor_name_full (basetype); ! 2756: } ! 2757: else ! 2758: { ! 2759: tree typedef_name = lookup_name (name, 1); ! 2760: if (typedef_name && TREE_CODE (typedef_name) == TYPE_DECL) ! 2761: { ! 2762: /* Canonicalize the typedef name. */ ! 2763: basetype = TREE_TYPE (typedef_name); ! 2764: name = TYPE_IDENTIFIER (basetype); ! 2765: } ! 2766: else ! 2767: { ! 2768: cp_error ("no constructor named `%T' in visible scope", ! 2769: name); ! 2770: return error_mark_node; ! 2771: } ! 2772: } ! 2773: ! 2774: if (! IS_AGGR_TYPE (basetype)) ! 2775: { ! 2776: non_aggr_error: ! 2777: if ((flags & LOOKUP_COMPLAIN) && TREE_CODE (basetype) != ERROR_MARK) ! 2778: error ("request for member `%s' in something not a structure or union", err_name); ! 2779: ! 2780: return error_mark_node; ! 2781: } ! 2782: } ! 2783: else if (instance == C_C_D || instance == current_class_decl) ! 2784: { ! 2785: /* When doing initialization, we side-effect the TREE_TYPE of ! 2786: C_C_D, hence we cannot set up BASETYPE from CURRENT_CLASS_TYPE. */ ! 2787: basetype = TREE_TYPE (C_C_D); ! 2788: ! 2789: /* Anything manifestly `this' in constructors and destructors ! 2790: has a known type, so virtual function tables are not needed. */ ! 2791: if (TYPE_VIRTUAL_P (basetype) ! 2792: && !(flags & LOOKUP_NONVIRTUAL)) ! 2793: need_vtbl = (dtor_label || ctor_label) ! 2794: ? unneeded : maybe_needed; ! 2795: ! 2796: instance = C_C_D; ! 2797: instance_ptr = current_class_decl; ! 2798: result = build_field_call (TYPE_BINFO (current_class_type), ! 2799: instance_ptr, name, parms, err_name); ! 2800: ! 2801: if (result) ! 2802: return result; ! 2803: } ! 2804: else if (TREE_CODE (instance) == RESULT_DECL) ! 2805: { ! 2806: basetype = TREE_TYPE (instance); ! 2807: /* Should we ever have to make a virtual function reference ! 2808: from a RESULT_DECL, know that it must be of fixed type ! 2809: within the scope of this function. */ ! 2810: if (!(flags & LOOKUP_NONVIRTUAL) && TYPE_VIRTUAL_P (basetype)) ! 2811: need_vtbl = maybe_needed; ! 2812: instance_ptr = build1 (ADDR_EXPR, TYPE_POINTER_TO (basetype), instance); ! 2813: } ! 2814: else if (instance == current_exception_object) ! 2815: { ! 2816: instance_ptr = build1 (ADDR_EXPR, TYPE_POINTER_TO (current_exception_type), ! 2817: TREE_OPERAND (current_exception_object, 0)); ! 2818: mark_addressable (TREE_OPERAND (current_exception_object, 0)); ! 2819: result = build_field_call (TYPE_BINFO (current_exception_type), ! 2820: instance_ptr, name, parms, err_name); ! 2821: if (result) ! 2822: return result; ! 2823: error ("exception member `%s' cannot be invoked", err_name); ! 2824: return error_mark_node; ! 2825: } ! 2826: else ! 2827: { ! 2828: /* The MAIN_VARIANT of the type that `instance_ptr' winds up being. */ ! 2829: tree inst_ptr_basetype; ! 2830: ! 2831: static_call_context = (TREE_CODE (instance) == NOP_EXPR ! 2832: && TREE_OPERAND (instance, 0) == error_mark_node); ! 2833: ! 2834: /* the base type of an instance variable is pointer to class */ ! 2835: basetype = TREE_TYPE (instance); ! 2836: ! 2837: if (TREE_CODE (basetype) == REFERENCE_TYPE) ! 2838: { ! 2839: basetype = TYPE_MAIN_VARIANT (TREE_TYPE (basetype)); ! 2840: if (! IS_AGGR_TYPE (basetype)) ! 2841: goto non_aggr_error; ! 2842: /* Call to convert not needed because we are remaining ! 2843: within the same type. */ ! 2844: instance_ptr = build1 (NOP_EXPR, TYPE_POINTER_TO (basetype), instance); ! 2845: inst_ptr_basetype = basetype; ! 2846: } ! 2847: else ! 2848: { ! 2849: if (TREE_CODE (basetype) == POINTER_TYPE) ! 2850: { ! 2851: basetype = TREE_TYPE (basetype); ! 2852: instance_ptr = instance; ! 2853: } ! 2854: ! 2855: if (! IS_AGGR_TYPE (basetype)) ! 2856: goto non_aggr_error; ! 2857: ! 2858: if (! instance_ptr) ! 2859: { ! 2860: if ((lvalue_p (instance) ! 2861: && (instance_ptr = build_unary_op (ADDR_EXPR, instance, 0))) ! 2862: || (instance_ptr = unary_complex_lvalue (ADDR_EXPR, instance))) ! 2863: { ! 2864: if (instance_ptr == error_mark_node) ! 2865: return error_mark_node; ! 2866: } ! 2867: else if (TREE_CODE (instance) == NOP_EXPR ! 2868: || TREE_CODE (instance) == CONSTRUCTOR) ! 2869: { ! 2870: /* A cast is not an lvalue. Initialize a fresh temp ! 2871: with the value we are casting from, and proceed with ! 2872: that temporary. We can't cast to a reference type, ! 2873: so that simplifies the initialization to something ! 2874: we can manage. */ ! 2875: tree temp = get_temp_name (TREE_TYPE (instance), 0); ! 2876: if (IS_AGGR_TYPE (TREE_TYPE (instance))) ! 2877: expand_aggr_init (temp, instance, 0); ! 2878: else ! 2879: { ! 2880: store_init_value (temp, instance); ! 2881: expand_decl_init (temp); ! 2882: } ! 2883: instance = temp; ! 2884: instance_ptr = build_unary_op (ADDR_EXPR, instance, 0); ! 2885: } ! 2886: else ! 2887: { ! 2888: if (TREE_CODE (instance) != CALL_EXPR) ! 2889: my_friendly_abort (125); ! 2890: if (TYPE_NEEDS_CONSTRUCTOR (basetype)) ! 2891: instance = build_cplus_new (basetype, instance, 0); ! 2892: else ! 2893: { ! 2894: instance = get_temp_name (basetype, 0); ! 2895: TREE_ADDRESSABLE (instance) = 1; ! 2896: } ! 2897: instance_ptr = build_unary_op (ADDR_EXPR, instance, 0); ! 2898: } ! 2899: /* @@ Should we call comp_target_types here? */ ! 2900: inst_ptr_basetype = TREE_TYPE (TREE_TYPE (instance_ptr)); ! 2901: if (TYPE_MAIN_VARIANT (basetype) == TYPE_MAIN_VARIANT (inst_ptr_basetype)) ! 2902: basetype = inst_ptr_basetype; ! 2903: else ! 2904: { ! 2905: instance_ptr = convert (TYPE_POINTER_TO (basetype), instance_ptr); ! 2906: if (instance_ptr == error_mark_node) ! 2907: return error_mark_node; ! 2908: } ! 2909: } ! 2910: else ! 2911: inst_ptr_basetype = TREE_TYPE (TREE_TYPE (instance_ptr)); ! 2912: } ! 2913: ! 2914: if (basetype_path == NULL_TREE) ! 2915: basetype_path = TYPE_BINFO (inst_ptr_basetype); ! 2916: ! 2917: result = build_field_call (basetype_path, instance_ptr, name, parms, err_name); ! 2918: if (result) ! 2919: return result; ! 2920: ! 2921: if (!(flags & LOOKUP_NONVIRTUAL) && TYPE_VIRTUAL_P (basetype)) ! 2922: { ! 2923: if (TREE_SIDE_EFFECTS (instance_ptr)) ! 2924: { ! 2925: /* This action is needed because the instance is needed ! 2926: for providing the base of the virtual function table. ! 2927: Without using a SAVE_EXPR, the function we are building ! 2928: may be called twice, or side effects on the instance ! 2929: variable (such as a post-increment), may happen twice. */ ! 2930: instance_ptr = save_expr (instance_ptr); ! 2931: instance = build_indirect_ref (instance_ptr, NULL_PTR); ! 2932: } ! 2933: else if (TREE_CODE (TREE_TYPE (instance)) == POINTER_TYPE) ! 2934: { ! 2935: /* This happens when called for operator new (). */ ! 2936: instance = build_indirect_ref (instance, NULL_PTR); ! 2937: } ! 2938: ! 2939: need_vtbl = maybe_needed; ! 2940: } ! 2941: } ! 2942: ! 2943: if (TYPE_SIZE (basetype) == 0) ! 2944: { ! 2945: /* This is worth complaining about, I think. */ ! 2946: cp_error ("cannot lookup method in incomplete type `%T'", basetype); ! 2947: return error_mark_node; ! 2948: } ! 2949: ! 2950: save_basetype = basetype; ! 2951: ! 2952: #if 0 ! 2953: if (all_virtual == 1 ! 2954: && (! strncmp (IDENTIFIER_POINTER (name), OPERATOR_METHOD_FORMAT, ! 2955: OPERATOR_METHOD_LENGTH) ! 2956: || instance_ptr == NULL_TREE ! 2957: || (TYPE_OVERLOADS_METHOD_CALL_EXPR (basetype) == 0))) ! 2958: all_virtual = 0; ! 2959: #endif ! 2960: ! 2961: last = NULL_TREE; ! 2962: for (parmtypes = NULL_TREE, parm = parms; parm; parm = TREE_CHAIN (parm)) ! 2963: { ! 2964: tree t = TREE_TYPE (TREE_VALUE (parm)); ! 2965: if (TREE_CODE (t) == OFFSET_TYPE) ! 2966: { ! 2967: /* Convert OFFSET_TYPE entities to their normal selves. */ ! 2968: TREE_VALUE (parm) = resolve_offset_ref (TREE_VALUE (parm)); ! 2969: t = TREE_TYPE (TREE_VALUE (parm)); ! 2970: } ! 2971: if (TREE_CODE (t) == ARRAY_TYPE) ! 2972: { ! 2973: /* Perform the conversion from ARRAY_TYPE to POINTER_TYPE in place. ! 2974: This eliminates needless calls to `compute_conversion_costs'. */ ! 2975: TREE_VALUE (parm) = default_conversion (TREE_VALUE (parm)); ! 2976: t = TREE_TYPE (TREE_VALUE (parm)); ! 2977: } ! 2978: if (t == error_mark_node) ! 2979: return error_mark_node; ! 2980: last = build_tree_list (NULL_TREE, t); ! 2981: parmtypes = chainon (parmtypes, last); ! 2982: } ! 2983: ! 2984: if (instance) ! 2985: { ! 2986: constp = TREE_READONLY (instance); ! 2987: volatilep = TREE_THIS_VOLATILE (instance); ! 2988: parms = tree_cons (NULL_TREE, instance_ptr, parms); ! 2989: } ! 2990: else ! 2991: { ! 2992: /* Raw constructors are always in charge. */ ! 2993: if (TYPE_USES_VIRTUAL_BASECLASSES (basetype) ! 2994: && ! (flags & LOOKUP_HAS_IN_CHARGE)) ! 2995: { ! 2996: flags |= LOOKUP_HAS_IN_CHARGE; ! 2997: parms = tree_cons (NULL_TREE, integer_one_node, parms); ! 2998: parmtypes = tree_cons (NULL_TREE, integer_type_node, parmtypes); ! 2999: } ! 3000: ! 3001: if (flag_this_is_variable > 0) ! 3002: { ! 3003: constp = 0; ! 3004: volatilep = 0; ! 3005: parms = tree_cons (NULL_TREE, build1 (NOP_EXPR, TYPE_POINTER_TO (basetype), integer_zero_node), parms); ! 3006: } ! 3007: else ! 3008: { ! 3009: constp = 0; ! 3010: volatilep = 0; ! 3011: instance_ptr = build_new (NULL_TREE, basetype, void_type_node, 0); ! 3012: if (instance_ptr == error_mark_node) ! 3013: return error_mark_node; ! 3014: instance_ptr = save_expr (instance_ptr); ! 3015: TREE_CALLS_NEW (instance_ptr) = 1; ! 3016: instance = build_indirect_ref (instance_ptr, NULL_PTR); ! 3017: ! 3018: /* If it's a default argument initialized from a ctor, what we get ! 3019: from instance_ptr will match the arglist for the FUNCTION_DECL ! 3020: of the constructor. */ ! 3021: if (parms && TREE_CODE (TREE_VALUE (parms)) == CALL_EXPR ! 3022: && TREE_OPERAND (TREE_VALUE (parms), 1) ! 3023: && TREE_CALLS_NEW (TREE_VALUE (TREE_OPERAND (TREE_VALUE (parms), 1)))) ! 3024: parms = build_tree_list (NULL_TREE, instance_ptr); ! 3025: else ! 3026: parms = tree_cons (NULL_TREE, instance_ptr, parms); ! 3027: } ! 3028: } ! 3029: parmtypes = tree_cons (NULL_TREE, ! 3030: build_pointer_type (build_type_variant (basetype, constp, volatilep)), ! 3031: parmtypes); ! 3032: if (last == NULL_TREE) ! 3033: last = parmtypes; ! 3034: ! 3035: /* Look up function name in the structure type definition. */ ! 3036: ! 3037: if ((IDENTIFIER_HAS_TYPE_VALUE (name) ! 3038: && IS_AGGR_TYPE (IDENTIFIER_TYPE_VALUE (name))) ! 3039: || name == constructor_name (basetype)) ! 3040: { ! 3041: tree tmp = NULL_TREE; ! 3042: if (IDENTIFIER_TYPE_VALUE (name) == basetype ! 3043: || name == constructor_name (basetype)) ! 3044: tmp = TYPE_BINFO (basetype); ! 3045: else ! 3046: tmp = get_binfo (IDENTIFIER_TYPE_VALUE (name), basetype, 0); ! 3047: ! 3048: if (tmp != NULL_TREE) ! 3049: { ! 3050: name_kind = "constructor"; ! 3051: ! 3052: if (TYPE_USES_VIRTUAL_BASECLASSES (basetype) ! 3053: && ! (flags & LOOKUP_HAS_IN_CHARGE)) ! 3054: { ! 3055: /* Constructors called for initialization ! 3056: only are never in charge. */ ! 3057: tree tmplist; ! 3058: ! 3059: flags |= LOOKUP_HAS_IN_CHARGE; ! 3060: tmplist = tree_cons (NULL_TREE, integer_zero_node, ! 3061: TREE_CHAIN (parms)); ! 3062: TREE_CHAIN (parms) = tmplist; ! 3063: tmplist = tree_cons (NULL_TREE, integer_type_node, TREE_CHAIN (parmtypes)); ! 3064: TREE_CHAIN (parmtypes) = tmplist; ! 3065: } ! 3066: basetype = BINFO_TYPE (tmp); ! 3067: } ! 3068: else ! 3069: name_kind = "method"; ! 3070: } ! 3071: else ! 3072: name_kind = "method"; ! 3073: ! 3074: if (basetype_path == NULL_TREE) ! 3075: basetype_path = TYPE_BINFO (basetype); ! 3076: result = lookup_fnfields (basetype_path, name, ! 3077: (flags & LOOKUP_COMPLAIN)); ! 3078: if (result == error_mark_node) ! 3079: return error_mark_node; ! 3080: ! 3081: ! 3082: /* Now, go look for this method name. We do not find destructors here. ! 3083: ! 3084: Putting `void_list_node' on the end of the parmtypes ! 3085: fakes out `build_decl_overload' into doing the right thing. */ ! 3086: TREE_CHAIN (last) = void_list_node; ! 3087: method_name = build_decl_overload (name, parmtypes, ! 3088: 1 + (name == constructor_name (save_basetype) ! 3089: || name == constructor_name_full (save_basetype))); ! 3090: TREE_CHAIN (last) = NULL_TREE; ! 3091: ! 3092: for (pass = 0; pass < 2; pass++) ! 3093: { ! 3094: struct candidate *candidates; ! 3095: struct candidate *cp; ! 3096: int len; ! 3097: unsigned best = 1; ! 3098: ! 3099: /* This increments every time we go up the type hierarchy. ! 3100: The idea is to prefer a function of the derived class if possible. */ ! 3101: int b_or_d = 0; ! 3102: ! 3103: baselink = result; ! 3104: ! 3105: if (pass > 0) ! 3106: { ! 3107: candidates ! 3108: = (struct candidate *) alloca ((ever_seen+1) ! 3109: * sizeof (struct candidate)); ! 3110: bzero (candidates, (ever_seen + 1) * sizeof (struct candidate)); ! 3111: cp = candidates; ! 3112: len = list_length (parms); ! 3113: ! 3114: /* First see if a global function has a shot at it. */ ! 3115: if (flags & LOOKUP_GLOBAL) ! 3116: { ! 3117: tree friend_parms; ! 3118: tree parm = TREE_VALUE (parms); ! 3119: ! 3120: if (TREE_CODE (TREE_TYPE (parm)) == REFERENCE_TYPE) ! 3121: friend_parms = parms; ! 3122: else if (TREE_CODE (TREE_TYPE (parm)) == POINTER_TYPE) ! 3123: { ! 3124: tree new_type; ! 3125: parm = build_indirect_ref (parm, "friendifying parms (compiler error)"); ! 3126: new_type = build_reference_type (TREE_TYPE (parm)); ! 3127: /* It is possible that this should go down a layer. */ ! 3128: new_type = build_type_variant (new_type, ! 3129: TREE_READONLY (parm), ! 3130: TREE_THIS_VOLATILE (parm)); ! 3131: parm = convert (new_type, parm); ! 3132: friend_parms = tree_cons (NULL_TREE, parm, TREE_CHAIN (parms)); ! 3133: } ! 3134: else ! 3135: my_friendly_abort (167); ! 3136: ! 3137: if (flag_ansi_overloading) ! 3138: { ! 3139: cp->v.ansi_harshness ! 3140: = (struct harshness_code *)alloca ((len+1) * sizeof (struct harshness_code)); ! 3141: cp->h_len = len; ! 3142: } ! 3143: else ! 3144: cp->v.old_harshness ! 3145: = (unsigned short *)alloca ((len+1) * sizeof (short)); ! 3146: ! 3147: result = build_overload_call (name, friend_parms, 0, cp); ! 3148: /* If it turns out to be the one we were actually looking for ! 3149: (it was probably a friend function), the return the ! 3150: good result. */ ! 3151: if (TREE_CODE (result) == CALL_EXPR) ! 3152: return result; ! 3153: ! 3154: if (flag_ansi_overloading) ! 3155: while ((cp->h.code & EVIL_CODE) == 0) ! 3156: { ! 3157: /* non-standard uses: set the field to 0 to indicate ! 3158: we are using a non-member function. */ ! 3159: cp->u.field = 0; ! 3160: if (cp->v.ansi_harshness[len].distance == 0 ! 3161: && cp->h.code < best) ! 3162: best = cp->h.code; ! 3163: cp += 1; ! 3164: } ! 3165: else ! 3166: while (cp->evil == 0) ! 3167: { ! 3168: /* non-standard uses: set the field to 0 to indicate ! 3169: we are using a non-member function. */ ! 3170: cp->u.field = 0; ! 3171: if (cp->v.old_harshness[len] == 0 ! 3172: && cp->v.old_harshness[len] == 0 ! 3173: && cp->ellipsis == 0 && cp->user == 0 && cp->b_or_d == 0 ! 3174: && cp->easy < best) ! 3175: best = cp->easy; ! 3176: cp += 1; ! 3177: } ! 3178: } ! 3179: } ! 3180: ! 3181: while (baselink) ! 3182: { ! 3183: /* We have a hit (of sorts). If the parameter list is ! 3184: "error_mark_node", or some variant thereof, it won't ! 3185: match any methods. Since we have verified that the is ! 3186: some method vaguely matching this one (in name at least), ! 3187: silently return. ! 3188: ! 3189: Don't stop for friends, however. */ ! 3190: tree basetypes = TREE_PURPOSE (baselink); ! 3191: ! 3192: function = TREE_VALUE (baselink); ! 3193: if (TREE_CODE (basetypes) == TREE_LIST) ! 3194: basetypes = TREE_VALUE (basetypes); ! 3195: basetype = BINFO_TYPE (basetypes); ! 3196: ! 3197: /* Cast the instance variable to the appropriate type. */ ! 3198: TREE_VALUE (parmtypes) = TYPE_POINTER_TO (basetype); ! 3199: ! 3200: if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (function))) ! 3201: function = DECL_CHAIN (function); ! 3202: ! 3203: for (; function; function = DECL_CHAIN (function)) ! 3204: { ! 3205: #ifdef GATHER_STATISTICS ! 3206: n_inner_fields_searched++; ! 3207: #endif ! 3208: ever_seen++; ! 3209: ! 3210: /* Not looking for friends here. */ ! 3211: if (TREE_CODE (TREE_TYPE (function)) == FUNCTION_TYPE ! 3212: && ! DECL_STATIC_FUNCTION_P (function)) ! 3213: continue; ! 3214: ! 3215: if (pass == 0 ! 3216: && DECL_ASSEMBLER_NAME (function) == method_name) ! 3217: { ! 3218: if (flags & LOOKUP_PROTECT) ! 3219: { ! 3220: visibility = compute_visibility (basetypes, function); ! 3221: if (visibility == visibility_protected ! 3222: && flags & LOOKUP_PROTECTED_OK) ! 3223: visibility = visibility_public; ! 3224: } ! 3225: ! 3226: if ((flags & LOOKUP_PROTECT) == 0 ! 3227: || visibility == visibility_public) ! 3228: goto found_and_ok; ! 3229: else if (visibility == visibility_private) ! 3230: saw_private = function; ! 3231: else if (visibility == visibility_protected) ! 3232: saw_protected = function; ! 3233: /* If we fail on the exact match, we have ! 3234: an immediate failure. */ ! 3235: goto found; ! 3236: } ! 3237: if (pass > 0) ! 3238: { ! 3239: tree these_parms = parms; ! 3240: ! 3241: #ifdef GATHER_STATISTICS ! 3242: n_inner_fields_searched++; ! 3243: #endif ! 3244: if (flag_ansi_overloading) ! 3245: { ! 3246: cp->v.ansi_harshness ! 3247: = (struct harshness_code *)alloca ((len+1) * sizeof (struct harshness_code)); ! 3248: cp->h_len = len; ! 3249: } ! 3250: else ! 3251: cp->v.old_harshness ! 3252: = (unsigned short *)alloca ((len+1) * sizeof (short)); ! 3253: ! 3254: if (DECL_STATIC_FUNCTION_P (function)) ! 3255: these_parms = TREE_CHAIN (these_parms); ! 3256: compute_conversion_costs (function, these_parms, cp, len); ! 3257: ! 3258: if (!flag_ansi_overloading) ! 3259: cp->b_or_d += b_or_d; ! 3260: ! 3261: if ((flag_ansi_overloading && (cp->h.code & EVIL_CODE) == 0) ! 3262: || (!flag_ansi_overloading && cp->evil == 0)) ! 3263: { ! 3264: cp->u.field = function; ! 3265: cp->function = function; ! 3266: if (flags & LOOKUP_PROTECT) ! 3267: { ! 3268: enum visibility_type this_v; ! 3269: this_v = compute_visibility (basetypes, function); ! 3270: if (this_v == visibility_protected ! 3271: && (flags & LOOKUP_PROTECTED_OK)) ! 3272: this_v = visibility_public; ! 3273: if (this_v != visibility_public) ! 3274: { ! 3275: if (this_v == visibility_private) ! 3276: saw_private = function; ! 3277: else ! 3278: saw_protected = function; ! 3279: continue; ! 3280: } ! 3281: } ! 3282: ! 3283: /* No "two-level" conversions. */ ! 3284: if (flags & LOOKUP_NO_CONVERSION ! 3285: && ((flag_ansi_overloading ! 3286: && (cp->h.code & USER_CODE)) ! 3287: || (!flag_ansi_overloading ! 3288: && cp->user != 0))) ! 3289: continue; ! 3290: ! 3291: /* If we used default parameters, we must ! 3292: check to see whether anyone else might ! 3293: use them also, and report a possible ! 3294: ambiguity. */ ! 3295: if (! TYPE_USES_MULTIPLE_INHERITANCE (save_basetype) ! 3296: && ((flag_ansi_overloading ! 3297: && cp->v.ansi_harshness[len].distance == 0 ! 3298: && cp->h.code < best) ! 3299: || (!flag_ansi_overloading ! 3300: && cp->v.old_harshness[len] == 0 ! 3301: && CONST_HARSHNESS (cp->v.old_harshness[0]) == 0 ! 3302: && cp->ellipsis == 0 && cp->user == 0 && cp->b_or_d == 0 ! 3303: && cp->easy < best))) ! 3304: { ! 3305: if (! DECL_STATIC_FUNCTION_P (function)) ! 3306: TREE_VALUE (parms) = cp->arg; ! 3307: if (best == 1) ! 3308: goto found_and_maybe_warn; ! 3309: } ! 3310: cp++; ! 3311: } ! 3312: } ! 3313: } ! 3314: /* Now we have run through one link's member functions. ! 3315: arrange to head-insert this link's links. */ ! 3316: baselink = next_baselink (baselink); ! 3317: b_or_d += 1; ! 3318: /* Don't grab functions from base classes. lookup_fnfield will ! 3319: do the work to get us down into the right place. */ ! 3320: baselink = NULL_TREE; ! 3321: } ! 3322: if (pass == 0) ! 3323: { ! 3324: tree igv = IDENTIFIER_GLOBAL_VALUE (name); ! 3325: ! 3326: /* No exact match could be found. Now try to find match ! 3327: using default conversions. */ ! 3328: if ((flags & LOOKUP_GLOBAL) && igv) ! 3329: { ! 3330: if (TREE_CODE (igv) == FUNCTION_DECL) ! 3331: ever_seen += 1; ! 3332: else if (TREE_CODE (igv) == TREE_LIST) ! 3333: ever_seen += list_length (igv); ! 3334: } ! 3335: ! 3336: if (ever_seen == 0) ! 3337: { ! 3338: if ((flags & (LOOKUP_SPECULATIVELY|LOOKUP_COMPLAIN)) ! 3339: == LOOKUP_SPECULATIVELY) ! 3340: return NULL_TREE; ! 3341: if (flags & LOOKUP_GLOBAL) ! 3342: error ("no global or non-hidden member function `%s' defined", err_name); ! 3343: else ! 3344: cp_error ("no non-hidden member function `%T::%s' defined", save_basetype, err_name); ! 3345: return error_mark_node; ! 3346: } ! 3347: continue; ! 3348: } ! 3349: ! 3350: if (cp - candidates != 0) ! 3351: { ! 3352: /* Rank from worst to best. Then cp will point to best one. ! 3353: Private fields have their bits flipped. For unsigned ! 3354: numbers, this should make them look very large. ! 3355: If the best alternate has a (signed) negative value, ! 3356: then all we ever saw were private members. */ ! 3357: if (cp - candidates > 1) ! 3358: { ! 3359: cp = ideal_candidate (save_basetype, candidates, ! 3360: cp - candidates, parms, len); ! 3361: if (cp == (struct candidate *)0) ! 3362: { ! 3363: error ("ambiguous type conversion requested for %s `%s'", ! 3364: name_kind, err_name); ! 3365: return error_mark_node; ! 3366: } ! 3367: if ((flag_ansi_overloading && (cp->h.code & EVIL_CODE)) ! 3368: || (!flag_ansi_overloading && cp->evil)) ! 3369: return error_mark_node; ! 3370: } ! 3371: else if ((flag_ansi_overloading && (cp[-1].h.code & EVIL_CODE)) ! 3372: || (!flag_ansi_overloading && cp[-1].evil == 2)) ! 3373: { ! 3374: error ("ambiguous type conversion requested for %s `%s'", ! 3375: name_kind, err_name); ! 3376: return error_mark_node; ! 3377: } ! 3378: else ! 3379: cp--; ! 3380: ! 3381: /* The global function was the best, so use it. */ ! 3382: if (cp->u.field == 0) ! 3383: { ! 3384: /* We must convert the instance pointer into a reference type. ! 3385: Global overloaded functions can only either take ! 3386: aggregate objects (which come for free from references) ! 3387: or reference data types anyway. */ ! 3388: TREE_VALUE (parms) = copy_node (instance_ptr); ! 3389: TREE_TYPE (TREE_VALUE (parms)) = build_reference_type (TREE_TYPE (TREE_TYPE (instance_ptr))); ! 3390: return build_function_call (cp->function, parms); ! 3391: } ! 3392: ! 3393: function = cp->function; ! 3394: if (! DECL_STATIC_FUNCTION_P (function)) ! 3395: TREE_VALUE (parms) = cp->arg; ! 3396: goto found_and_maybe_warn; ! 3397: } ! 3398: ! 3399: if ((flags & ~LOOKUP_GLOBAL) & (LOOKUP_COMPLAIN|LOOKUP_SPECULATIVELY)) ! 3400: { ! 3401: char *tag_name, *buf; ! 3402: ! 3403: if ((flags & (LOOKUP_SPECULATIVELY|LOOKUP_COMPLAIN)) ! 3404: == LOOKUP_SPECULATIVELY) ! 3405: return NULL_TREE; ! 3406: ! 3407: if (DECL_STATIC_FUNCTION_P (cp->function)) ! 3408: parms = TREE_CHAIN (parms); ! 3409: if (ever_seen) ! 3410: { ! 3411: if (((HOST_WIDE_INT)saw_protected|(HOST_WIDE_INT)saw_private) == 0) ! 3412: { ! 3413: if (flags & LOOKUP_SPECULATIVELY) ! 3414: return NULL_TREE; ! 3415: if (static_call_context && TREE_CODE (TREE_TYPE (cp->function)) == METHOD_TYPE) ! 3416: cp_error ("object missing in call to `%T::%s'", ! 3417: TREE_TYPE (TREE_TYPE (instance_ptr)), ! 3418: err_name); ! 3419: else ! 3420: report_type_mismatch (cp, parms, name_kind, err_name); ! 3421: } ! 3422: else ! 3423: { ! 3424: char buf[80]; ! 3425: char *msg; ! 3426: tree seen = saw_private; ! 3427: ! 3428: if (saw_private) ! 3429: { ! 3430: if (saw_protected) ! 3431: msg = "%s `%%D' (and the like) are private or protected"; ! 3432: else ! 3433: msg = "the %s `%%D' is private"; ! 3434: } ! 3435: else ! 3436: { ! 3437: msg = "the %s `%%D' is protected"; ! 3438: seen = saw_protected; ! 3439: } ! 3440: sprintf (buf, msg, name_kind); ! 3441: cp_error_at (buf, seen); ! 3442: error ("within this context"); ! 3443: } ! 3444: return error_mark_node; ! 3445: } ! 3446: ! 3447: if ((flags & (LOOKUP_SPECULATIVELY|LOOKUP_COMPLAIN)) ! 3448: == LOOKUP_COMPLAIN) ! 3449: { ! 3450: if (TREE_CODE (save_basetype) == RECORD_TYPE) ! 3451: tag_name = "structure"; ! 3452: else ! 3453: tag_name = "union"; ! 3454: ! 3455: /* FIXME: is this doing the right thing? */ ! 3456: buf = (char *)alloca (30 + strlen (err_name)); ! 3457: strcpy (buf, "%s has no method named `%s'"); ! 3458: error (buf, tag_name, err_name); ! 3459: return error_mark_node; ! 3460: } ! 3461: return NULL_TREE; ! 3462: } ! 3463: continue; ! 3464: ! 3465: found_and_maybe_warn: ! 3466: if ((flag_ansi_overloading ! 3467: && (cp->v.ansi_harshness[0].code & CONST_CODE)) ! 3468: || (!flag_ansi_overloading ! 3469: && CONST_HARSHNESS (cp->v.old_harshness[0]))) ! 3470: { ! 3471: if (flags & LOOKUP_COMPLAIN) ! 3472: { ! 3473: cp_error_at ("non-const member function `%D'", cp->function); ! 3474: error ("called for const object at this point in file"); ! 3475: } ! 3476: /* Not good enough for a match. */ ! 3477: else ! 3478: return error_mark_node; ! 3479: } ! 3480: goto found_and_ok; ! 3481: } ! 3482: /* Silently return error_mark_node. */ ! 3483: return error_mark_node; ! 3484: ! 3485: found: ! 3486: if (visibility == visibility_private) ! 3487: { ! 3488: if (flags & LOOKUP_COMPLAIN) ! 3489: { ! 3490: error_with_file_and_line (DECL_SOURCE_FILE (function), ! 3491: DECL_SOURCE_LINE (function), ! 3492: TREE_PRIVATE (function) ! 3493: ? "%s `%s' is private" ! 3494: : "%s `%s' is from private base class", ! 3495: name_kind, ! 3496: lang_printable_name (function)); ! 3497: error ("within this context"); ! 3498: } ! 3499: return error_mark_node; ! 3500: } ! 3501: else if (visibility == visibility_protected) ! 3502: { ! 3503: if (flags & LOOKUP_COMPLAIN) ! 3504: { ! 3505: error_with_file_and_line (DECL_SOURCE_FILE (function), ! 3506: DECL_SOURCE_LINE (function), ! 3507: TREE_PROTECTED (function) ! 3508: ? "%s `%s' is protected" ! 3509: : "%s `%s' has protected visibility from this point", ! 3510: name_kind, ! 3511: lang_printable_name (function)); ! 3512: error ("within this context"); ! 3513: } ! 3514: return error_mark_node; ! 3515: } ! 3516: my_friendly_abort (1); ! 3517: ! 3518: found_and_ok: ! 3519: ! 3520: /* From here on down, BASETYPE is the type that INSTANCE_PTR's ! 3521: type (if it exists) is a pointer to. */ ! 3522: function = DECL_MAIN_VARIANT (function); ! 3523: /* Declare external function if necessary. */ ! 3524: assemble_external (function); ! 3525: ! 3526: fntype = TREE_TYPE (function); ! 3527: if (TREE_CODE (fntype) == POINTER_TYPE) ! 3528: fntype = TREE_TYPE (fntype); ! 3529: basetype = DECL_CLASS_CONTEXT (function); ! 3530: ! 3531: /* If we are referencing a virtual function from an object ! 3532: of effectively static type, then there is no need ! 3533: to go through the virtual function table. */ ! 3534: if (need_vtbl == maybe_needed) ! 3535: { ! 3536: int fixed_type = resolves_to_fixed_type_p (instance, 0); ! 3537: ! 3538: if (all_virtual == 1 ! 3539: && DECL_VINDEX (function) ! 3540: && may_be_remote (basetype)) ! 3541: need_vtbl = needed; ! 3542: else if (DECL_VINDEX (function)) ! 3543: need_vtbl = fixed_type ? unneeded : needed; ! 3544: else ! 3545: need_vtbl = not_needed; ! 3546: } ! 3547: ! 3548: if (TREE_CODE (fntype) == METHOD_TYPE && static_call_context ! 3549: && !DECL_CONSTRUCTOR_P (function)) ! 3550: { ! 3551: /* Let's be nice to the user for now, and give reasonable ! 3552: default behavior. */ ! 3553: instance_ptr = current_class_decl; ! 3554: if (instance_ptr) ! 3555: { ! 3556: if (basetype != current_class_type) ! 3557: { ! 3558: tree binfo = get_binfo (basetype, current_class_type, 1); ! 3559: if (binfo == NULL_TREE) ! 3560: { ! 3561: error_not_base_type (function, current_class_type); ! 3562: return error_mark_node; ! 3563: } ! 3564: else if (basetype == error_mark_node) ! 3565: return error_mark_node; ! 3566: } ! 3567: } ! 3568: /* Only allow a static member function to call another static member ! 3569: function. */ ! 3570: else if (DECL_LANG_SPECIFIC (function) ! 3571: && !DECL_STATIC_FUNCTION_P (function)) ! 3572: { ! 3573: cp_error ("cannot call member function `%T::%s' without object", ! 3574: basetype, err_name); ! 3575: return error_mark_node; ! 3576: } ! 3577: } ! 3578: ! 3579: value_type = TREE_TYPE (fntype) ? TREE_TYPE (fntype) : void_type_node; ! 3580: ! 3581: if (TYPE_SIZE (value_type) == 0) ! 3582: { ! 3583: if (flags & LOOKUP_COMPLAIN) ! 3584: incomplete_type_error (0, value_type); ! 3585: return error_mark_node; ! 3586: } ! 3587: ! 3588: /* We do not pass FUNCTION into `convert_arguments', because by ! 3589: now everything should be ok. If not, then we have a serious error. */ ! 3590: if (DECL_STATIC_FUNCTION_P (function)) ! 3591: parms = convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype), ! 3592: TREE_CHAIN (parms), NULL_TREE, LOOKUP_NORMAL); ! 3593: else if (need_vtbl == unneeded) ! 3594: { ! 3595: int sub_flags = DECL_CONSTRUCTOR_P (function) ? flags : LOOKUP_NORMAL; ! 3596: basetype = TREE_TYPE (instance); ! 3597: if (TYPE_METHOD_BASETYPE (TREE_TYPE (function)) != TYPE_MAIN_VARIANT (basetype) ! 3598: && TYPE_USES_COMPLEX_INHERITANCE (basetype)) ! 3599: { ! 3600: basetype = DECL_CLASS_CONTEXT (function); ! 3601: instance_ptr = convert_pointer_to (basetype, instance_ptr); ! 3602: instance = build_indirect_ref (instance_ptr, NULL_PTR); ! 3603: } ! 3604: parms = tree_cons (NULL_TREE, instance_ptr, ! 3605: convert_arguments (NULL_TREE, TREE_CHAIN (TYPE_ARG_TYPES (fntype)), TREE_CHAIN (parms), NULL_TREE, sub_flags)); ! 3606: } ! 3607: else ! 3608: { ! 3609: if ((flags & LOOKUP_NONVIRTUAL) == 0) ! 3610: basetype = DECL_CONTEXT (function); ! 3611: ! 3612: /* First parm could be integer_zerop with casts like ! 3613: ((Object*)0)->Object::IsA() */ ! 3614: if (!integer_zerop (TREE_VALUE (parms))) ! 3615: { ! 3616: /* Since we can't have inheritance with a union, doing get_binfo ! 3617: on it won't work. We do all the convert_pointer_to_real ! 3618: stuff to handle MI correctly...for unions, that's not ! 3619: an issue, so we must short-circuit that extra work here. */ ! 3620: tree tmp = TREE_TYPE (TREE_TYPE (TREE_VALUE (parms))); ! 3621: if (tmp != NULL_TREE && TREE_CODE (tmp) == UNION_TYPE) ! 3622: instance_ptr = TREE_VALUE (parms); ! 3623: else ! 3624: { ! 3625: tree binfo = get_binfo (basetype, ! 3626: TREE_TYPE (TREE_TYPE (TREE_VALUE (parms))), ! 3627: 0); ! 3628: instance_ptr = convert_pointer_to_real (binfo, TREE_VALUE (parms)); ! 3629: } ! 3630: instance_ptr ! 3631: = convert_pointer_to (build_type_variant (basetype, ! 3632: constp, volatilep), ! 3633: instance_ptr); ! 3634: ! 3635: if (TREE_CODE (instance_ptr) == COND_EXPR) ! 3636: { ! 3637: instance_ptr = save_expr (instance_ptr); ! 3638: instance = build_indirect_ref (instance_ptr, NULL_PTR); ! 3639: } ! 3640: else if (TREE_CODE (instance_ptr) == NOP_EXPR ! 3641: && TREE_CODE (TREE_OPERAND (instance_ptr, 0)) == ADDR_EXPR ! 3642: && TREE_OPERAND (TREE_OPERAND (instance_ptr, 0), 0) == instance) ! 3643: ; ! 3644: /* The call to `convert_pointer_to' may return error_mark_node. */ ! 3645: else if (TREE_CODE (instance_ptr) == ERROR_MARK) ! 3646: return instance_ptr; ! 3647: else if (instance == NULL_TREE ! 3648: || TREE_CODE (instance) != INDIRECT_REF ! 3649: || TREE_OPERAND (instance, 0) != instance_ptr) ! 3650: instance = build_indirect_ref (instance_ptr, NULL_PTR); ! 3651: } ! 3652: parms = tree_cons (NULL_TREE, instance_ptr, ! 3653: convert_arguments (NULL_TREE, TREE_CHAIN (TYPE_ARG_TYPES (fntype)), TREE_CHAIN (parms), NULL_TREE, LOOKUP_NORMAL)); ! 3654: } ! 3655: ! 3656: #if 0 ! 3657: /* Constructors do not overload method calls. */ ! 3658: else if (TYPE_OVERLOADS_METHOD_CALL_EXPR (basetype) ! 3659: && name != TYPE_IDENTIFIER (basetype) ! 3660: && (TREE_CODE (function) != FUNCTION_DECL ! 3661: || strncmp (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function)), ! 3662: OPERATOR_METHOD_FORMAT, ! 3663: OPERATOR_METHOD_LENGTH)) ! 3664: && (may_be_remote (basetype) || instance != C_C_D)) ! 3665: { ! 3666: tree fn_as_int; ! 3667: ! 3668: parms = TREE_CHAIN (parms); ! 3669: ! 3670: if (!all_virtual && TREE_CODE (function) == FUNCTION_DECL) ! 3671: fn_as_int = build_unary_op (ADDR_EXPR, function, 0); ! 3672: else ! 3673: fn_as_int = convert (TREE_TYPE (default_conversion (function)), DECL_VINDEX (function)); ! 3674: if (all_virtual == 1) ! 3675: fn_as_int = convert (integer_type_node, fn_as_int); ! 3676: ! 3677: result = build_opfncall (METHOD_CALL_EXPR, LOOKUP_NORMAL, instance, fn_as_int, parms); ! 3678: ! 3679: if (result == NULL_TREE) ! 3680: { ! 3681: compiler_error ("could not overload `operator->()(...)'"); ! 3682: return error_mark_node; ! 3683: } ! 3684: else if (result == error_mark_node) ! 3685: return error_mark_node; ! 3686: ! 3687: #if 0 ! 3688: /* Do this if we want the result of operator->() to inherit ! 3689: the type of the function it is subbing for. */ ! 3690: TREE_TYPE (result) = value_type; ! 3691: #endif ! 3692: ! 3693: return result; ! 3694: } ! 3695: #endif ! 3696: ! 3697: if (need_vtbl == needed) ! 3698: { ! 3699: function = build_vfn_ref (&TREE_VALUE (parms), instance, DECL_VINDEX (function)); ! 3700: TREE_TYPE (function) = build_pointer_type (fntype); ! 3701: } ! 3702: ! 3703: if (TREE_CODE (function) == FUNCTION_DECL) ! 3704: GNU_xref_call (current_function_decl, ! 3705: IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (function))); ! 3706: ! 3707: if (TREE_CODE (function) == FUNCTION_DECL) ! 3708: { ! 3709: if (DECL_INLINE (function)) ! 3710: function = build1 (ADDR_EXPR, build_pointer_type (fntype), function); ! 3711: else ! 3712: { ! 3713: assemble_external (function); ! 3714: TREE_USED (function) = 1; ! 3715: function = default_conversion (function); ! 3716: } ! 3717: } ! 3718: else ! 3719: function = default_conversion (function); ! 3720: ! 3721: result = build_nt (CALL_EXPR, function, parms, NULL_TREE); ! 3722: ! 3723: TREE_TYPE (result) = value_type; ! 3724: TREE_SIDE_EFFECTS (result) = 1; ! 3725: TREE_RAISES (result) ! 3726: = TYPE_RAISES_EXCEPTIONS (fntype) || (parms && TREE_RAISES (parms)); ! 3727: return result; ! 3728: } ! 3729: ! 3730: /* Similar to `build_method_call', but for overloaded non-member functions. ! 3731: The name of this function comes through NAME. The name depends ! 3732: on PARMS. ! 3733: ! 3734: Note that this function must handle simple `C' promotions, ! 3735: as well as variable numbers of arguments (...), and ! 3736: default arguments to boot. ! 3737: ! 3738: If the overloading is successful, we return a tree node which ! 3739: contains the call to the function. ! 3740: ! 3741: If overloading produces candidates which are probable, but not definite, ! 3742: we hold these candidates. If FINAL_CP is non-zero, then we are free ! 3743: to assume that final_cp points to enough storage for all candidates that ! 3744: this function might generate. The `harshness' array is preallocated for ! 3745: the first candidate, but not for subsequent ones. ! 3746: ! 3747: Note that the DECL_RTL of FUNCTION must be made to agree with this ! 3748: function's new name. */ ! 3749: ! 3750: tree ! 3751: build_overload_call_real (fnname, parms, complain, final_cp, buildxxx) ! 3752: tree fnname, parms; ! 3753: int complain; ! 3754: struct candidate *final_cp; ! 3755: int buildxxx; ! 3756: { ! 3757: /* must check for overloading here */ ! 3758: tree overload_name, functions, function, parm; ! 3759: tree parmtypes = NULL_TREE, last = NULL_TREE; ! 3760: register tree outer; ! 3761: int length; ! 3762: int parmlength = list_length (parms); ! 3763: ! 3764: struct candidate *candidates, *cp; ! 3765: ! 3766: if (final_cp) ! 3767: { ! 3768: if (flag_ansi_overloading) ! 3769: { ! 3770: final_cp[0].h.code = 0; ! 3771: final_cp[0].h.distance = 0; ! 3772: final_cp[0].function = 0; ! 3773: /* end marker. */ ! 3774: final_cp[1].h.code = EVIL_CODE; ! 3775: } ! 3776: else ! 3777: { ! 3778: final_cp[0].evil = 0; ! 3779: final_cp[0].user = 0; ! 3780: final_cp[0].b_or_d = 0; ! 3781: final_cp[0].easy = 0; ! 3782: final_cp[0].function = 0; ! 3783: /* end marker. */ ! 3784: final_cp[1].evil = 1; ! 3785: } ! 3786: } ! 3787: ! 3788: for (parm = parms; parm; parm = TREE_CHAIN (parm)) ! 3789: { ! 3790: register tree t = TREE_TYPE (TREE_VALUE (parm)); ! 3791: ! 3792: if (t == error_mark_node) ! 3793: { ! 3794: if (final_cp) ! 3795: { ! 3796: if (flag_ansi_overloading) ! 3797: final_cp->h.code = EVIL_CODE; ! 3798: else ! 3799: final_cp->evil = 1; ! 3800: } ! 3801: return error_mark_node; ! 3802: } ! 3803: if (TREE_CODE (t) == ARRAY_TYPE || TREE_CODE (t) == OFFSET_TYPE) ! 3804: { ! 3805: /* Perform the conversion from ARRAY_TYPE to POINTER_TYPE in place. ! 3806: Also convert OFFSET_TYPE entities to their normal selves. ! 3807: This eliminates needless calls to `compute_conversion_costs'. */ ! 3808: TREE_VALUE (parm) = default_conversion (TREE_VALUE (parm)); ! 3809: t = TREE_TYPE (TREE_VALUE (parm)); ! 3810: } ! 3811: last = build_tree_list (NULL_TREE, t); ! 3812: parmtypes = chainon (parmtypes, last); ! 3813: } ! 3814: if (last) ! 3815: TREE_CHAIN (last) = void_list_node; ! 3816: else ! 3817: parmtypes = void_list_node; ! 3818: ! 3819: if (! flag_ansi_overloading) ! 3820: { ! 3821: /* This is a speed improvement that ends up not working properly in ! 3822: the situation of fns with and without default parameters. I turned ! 3823: this off in the new method so it'll go through the argument matching ! 3824: code to properly diagnose a match/failure. (bpk) */ ! 3825: overload_name = build_decl_overload (fnname, parmtypes, 0); ! 3826: ! 3827: /* Now check to see whether or not we can win. ! 3828: Note that if we are called from `build_method_call', ! 3829: then we cannot have a mis-match, because we would have ! 3830: already found such a winning case. */ ! 3831: ! 3832: if (IDENTIFIER_GLOBAL_VALUE (overload_name)) ! 3833: if (TREE_CODE (IDENTIFIER_GLOBAL_VALUE (overload_name)) != TREE_LIST) ! 3834: return build_function_call (DECL_MAIN_VARIANT (IDENTIFIER_GLOBAL_VALUE (overload_name)), parms); ! 3835: } ! 3836: ! 3837: functions = IDENTIFIER_GLOBAL_VALUE (fnname); ! 3838: ! 3839: if (functions == NULL_TREE) ! 3840: { ! 3841: if (complain) ! 3842: error ("only member functions apply"); ! 3843: if (final_cp) ! 3844: { ! 3845: if (flag_ansi_overloading) ! 3846: final_cp->h.code = EVIL_CODE; ! 3847: else ! 3848: final_cp->evil = 1; ! 3849: } ! 3850: return error_mark_node; ! 3851: } ! 3852: ! 3853: if (TREE_CODE (functions) == FUNCTION_DECL) ! 3854: { ! 3855: functions = DECL_MAIN_VARIANT (functions); ! 3856: if (final_cp) ! 3857: { ! 3858: /* We are just curious whether this is a viable alternative or not. */ ! 3859: compute_conversion_costs (functions, parms, final_cp, parmlength); ! 3860: return functions; ! 3861: } ! 3862: else ! 3863: return build_function_call (functions, parms); ! 3864: } ! 3865: ! 3866: if (TREE_VALUE (functions) == NULL_TREE) ! 3867: { ! 3868: if (complain) ! 3869: cp_error ("function `%D' declared overloaded, but no instances of that function declared", ! 3870: TREE_PURPOSE (functions)); ! 3871: if (final_cp) ! 3872: { ! 3873: if (flag_ansi_overloading) ! 3874: final_cp->h.code = EVIL_CODE; ! 3875: else ! 3876: final_cp->evil = 1; ! 3877: } ! 3878: return error_mark_node; ! 3879: } ! 3880: ! 3881: if (TREE_CODE (TREE_VALUE (functions)) == TREE_LIST) ! 3882: { ! 3883: register tree outer; ! 3884: length = 0; ! 3885: ! 3886: /* The list-of-lists should only occur for class things. */ ! 3887: my_friendly_assert (functions == IDENTIFIER_CLASS_VALUE (fnname), 168); ! 3888: ! 3889: for (outer = functions; outer; outer = TREE_CHAIN (outer)) ! 3890: { ! 3891: /* member functions. */ ! 3892: length += decl_list_length (TREE_VALUE (TREE_VALUE (outer))); ! 3893: /* friend functions. */ ! 3894: length += list_length (TREE_TYPE (TREE_VALUE (outer))); ! 3895: } ! 3896: } ! 3897: else ! 3898: length = list_length (functions); ! 3899: ! 3900: if (final_cp) ! 3901: candidates = final_cp; ! 3902: else ! 3903: { ! 3904: candidates ! 3905: = (struct candidate *)alloca ((length+1) * sizeof (struct candidate)); ! 3906: bzero (candidates, (length + 1) * sizeof (struct candidate)); ! 3907: } ! 3908: ! 3909: cp = candidates; ! 3910: ! 3911: my_friendly_assert (TREE_CODE (TREE_VALUE (functions)) != TREE_LIST, 169); ! 3912: ! 3913: /* OUTER is the list of FUNCTION_DECLS, in a TREE_LIST. */ ! 3914: for (outer = functions; outer; outer = TREE_CHAIN (outer)) ! 3915: { ! 3916: int template_cost = 0; ! 3917: function = TREE_VALUE (outer); ! 3918: if (TREE_CODE (function) != FUNCTION_DECL ! 3919: && ! (TREE_CODE (function) == TEMPLATE_DECL ! 3920: && ! DECL_TEMPLATE_IS_CLASS (function) ! 3921: && TREE_CODE (DECL_TEMPLATE_RESULT (function)) == FUNCTION_DECL)) ! 3922: { ! 3923: enum tree_code code = TREE_CODE (function); ! 3924: if (code == TEMPLATE_DECL) ! 3925: code = TREE_CODE (DECL_TEMPLATE_RESULT (function)); ! 3926: if (code == CONST_DECL) ! 3927: cp_error_at ! 3928: ("enumeral value `%D' conflicts with function of same name", ! 3929: function); ! 3930: else if (code == VAR_DECL) ! 3931: { ! 3932: if (TREE_STATIC (function)) ! 3933: cp_error_at ! 3934: ("variable `%D' conflicts with function of same name", ! 3935: function); ! 3936: else ! 3937: cp_error_at ! 3938: ("constant field `%D' conflicts with function of same name", ! 3939: function); ! 3940: } ! 3941: else if (code == TYPE_DECL) ! 3942: continue; ! 3943: else ! 3944: my_friendly_abort (2); ! 3945: error ("at this point in file"); ! 3946: continue; ! 3947: } ! 3948: if (TREE_CODE (function) == TEMPLATE_DECL) ! 3949: { ! 3950: int ntparms = TREE_VEC_LENGTH (DECL_TEMPLATE_PARMS (function)); ! 3951: tree *targs = (tree *) alloca (sizeof (tree) * ntparms); ! 3952: int i; ! 3953: ! 3954: i = type_unification (DECL_TEMPLATE_PARMS (function), targs, ! 3955: TYPE_ARG_TYPES (TREE_TYPE (function)), ! 3956: parms, &template_cost); ! 3957: if (i == 0) ! 3958: { ! 3959: struct candidate *cp2; ! 3960: ! 3961: function = instantiate_template (function, targs); ! 3962: /* Now check that the template instantiated for this is not ! 3963: the same as a function that's in the list due to some ! 3964: previous instantiation. */ ! 3965: cp2 = candidates; ! 3966: while (cp2 != cp) ! 3967: if (cp2->function == function) ! 3968: break; ! 3969: else ! 3970: cp2 += 1; ! 3971: if (cp2->function == function) ! 3972: continue; ! 3973: } ! 3974: } ! 3975: ! 3976: if (TREE_CODE (function) == TEMPLATE_DECL) ! 3977: { ! 3978: /* Unconverted template -- failed match. */ ! 3979: cp->function = function; ! 3980: cp->u.bad_arg = -4; ! 3981: if (flag_ansi_overloading) ! 3982: cp->h.code = EVIL_CODE; ! 3983: else ! 3984: cp->evil = 1; ! 3985: } ! 3986: else ! 3987: { ! 3988: function = DECL_MAIN_VARIANT (function); ! 3989: ! 3990: /* Can't use alloca here, since result might be ! 3991: passed to calling function. */ ! 3992: if (flag_ansi_overloading) ! 3993: { ! 3994: cp->v.ansi_harshness ! 3995: = (struct harshness_code *)oballoc ((parmlength+1) * sizeof (struct harshness_code)); ! 3996: cp->h_len = parmlength; ! 3997: } ! 3998: else ! 3999: cp->v.old_harshness ! 4000: = (unsigned short *)oballoc ((parmlength+1) * sizeof (short)); ! 4001: ! 4002: compute_conversion_costs (function, parms, cp, parmlength); ! 4003: ! 4004: if (flag_ansi_overloading) ! 4005: /* Make sure this is clear as well. */ ! 4006: cp->h.int_penalty += template_cost; ! 4007: else ! 4008: /* Should really add another field... */ ! 4009: cp->easy = cp->easy * 128 + template_cost; ! 4010: ! 4011: /* It seemed easier to have both if stmts in here, rather ! 4012: than excluding the hell out of it with flag_ansi_overloading ! 4013: everywhere. (bpk) */ ! 4014: if (flag_ansi_overloading) ! 4015: { ! 4016: if ((cp[0].h.code & EVIL_CODE) == 0) ! 4017: { ! 4018: cp[1].h.code = EVIL_CODE; ! 4019: ! 4020: /* int_penalty is set by convert_harshness_ansi for cases ! 4021: where we need to know about any penalties that would ! 4022: otherwise make a TRIVIAL_CODE pass. */ ! 4023: if (final_cp ! 4024: && template_cost == 0 ! 4025: && cp[0].h.code <= TRIVIAL_CODE ! 4026: && cp[0].h.int_penalty == 0) ! 4027: { ! 4028: final_cp[0].h = cp[0].h; ! 4029: return function; ! 4030: } ! 4031: cp++; ! 4032: } ! 4033: } ! 4034: else ! 4035: { ! 4036: if (cp[0].evil == 0) ! 4037: { ! 4038: cp[1].evil = 1; ! 4039: if (final_cp ! 4040: && cp[0].user == 0 && cp[0].b_or_d == 0 ! 4041: && template_cost == 0 ! 4042: && cp[0].easy <= 1) ! 4043: { ! 4044: final_cp[0].easy = cp[0].easy; ! 4045: return function; ! 4046: } ! 4047: cp++; ! 4048: } ! 4049: } ! 4050: } ! 4051: } ! 4052: ! 4053: if (cp - candidates) ! 4054: { ! 4055: tree rval = error_mark_node; ! 4056: ! 4057: /* Leave marker. */ ! 4058: if (flag_ansi_overloading) ! 4059: cp[0].h.code = EVIL_CODE; ! 4060: else ! 4061: cp[0].evil = 1; ! 4062: if (cp - candidates > 1) ! 4063: { ! 4064: struct candidate *best_cp ! 4065: = ideal_candidate (NULL_TREE, candidates, ! 4066: cp - candidates, parms, parmlength); ! 4067: if (best_cp == (struct candidate *)0) ! 4068: { ! 4069: if (complain) ! 4070: cp_error ("call of overloaded `%D' is ambiguous", fnname); ! 4071: return error_mark_node; ! 4072: } ! 4073: else ! 4074: rval = best_cp->function; ! 4075: } ! 4076: else ! 4077: { ! 4078: cp -= 1; ! 4079: if ((flag_ansi_overloading && (cp->h.code & EVIL_CODE)) ! 4080: || (!flag_ansi_overloading && cp->evil > 1)) ! 4081: { ! 4082: if (complain) ! 4083: error ("type conversion ambiguous"); ! 4084: } ! 4085: else ! 4086: rval = cp->function; ! 4087: } ! 4088: ! 4089: if (final_cp) ! 4090: return rval; ! 4091: ! 4092: return buildxxx ? build_function_call_maybe (rval, parms) ! 4093: : build_function_call (rval, parms); ! 4094: } ! 4095: else if (complain) ! 4096: report_type_mismatch (cp, parms, "function", ! 4097: decl_as_string (cp->function, 1)); ! 4098: ! 4099: return error_mark_node; ! 4100: } ! 4101: ! 4102: tree ! 4103: build_overload_call (fnname, parms, complain, final_cp) ! 4104: tree fnname, parms; ! 4105: int complain; ! 4106: struct candidate *final_cp; ! 4107: { ! 4108: return build_overload_call_real (fnname, parms, complain, final_cp, 0); ! 4109: } ! 4110: ! 4111: tree ! 4112: build_overload_call_maybe (fnname, parms, complain, final_cp) ! 4113: tree fnname, parms; ! 4114: int complain; ! 4115: struct candidate *final_cp; ! 4116: { ! 4117: return build_overload_call_real (fnname, parms, complain, final_cp, 1); ! 4118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.