Annotation of gcc/cp/call.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.