Annotation of gcc/cp/call.c, revision 1.1.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.