Annotation of GNUtools/cc/cp-class.h, revision 1.1.1.1

1.1       root        1: /* Variables and structures for overloading rules.
                      2:    Copyright (C) 1993 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 2, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU CC is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU CC; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: /* The following structure is used when comparing various alternatives
                     21:    for overloading.  The unsigned quantity `strikes.i' is used
                     22:    for fast comparison of two possibilities.  This number is an
                     23:    aggregate of four constituents:
                     24: 
                     25:      EVIL: if this is non-zero, then the candidate should not be considered
                     26:      ELLIPSIS: if this is non-zero, then some actual argument has been matched
                     27:                against an ellipsis
                     28:      USER: if this is non-zero, then a user-defined type conversion is needed
                     29:      B_OR_D: if this is non-zero, then use a base pointer instead of the
                     30:              type of the pointer we started with.
                     31:      EASY: if this is non-zero, then we have a builtin conversion
                     32:            (such as int to long, int to float, etc) to do.
                     33: 
                     34:    If two candidates require user-defined type conversions, and the
                     35:    type conversions are not identical, then an ambiguity error
                     36:    is reported.
                     37: 
                     38:    If two candidates agree on user-defined type conversions,
                     39:    and one uses pointers of strictly higher type (derived where
                     40:    another uses base), then that alternative is silently chosen.
                     41: 
                     42:    If two candidates have a non-monotonic derived/base pointer
                     43:    relationship, and/or a non-monotonic easy conversion relationship,
                     44:    then a warning is emitted to show which paths are possible, and
                     45:    which one is being chosen.
                     46: 
                     47:    For example:
                     48: 
                     49:    int i;
                     50:    double x;
                     51: 
                     52:    overload f;
                     53:    int f (int, int);
                     54:    double f (double, double);
                     55: 
                     56:    f (i, x);   // draws a warning
                     57: 
                     58:    struct B
                     59:    {
                     60:      f (int);
                     61:    } *bb;
                     62:    struct D : B
                     63:    {
                     64:      f (double);
                     65:    } *dd;
                     66: 
                     67:    dd->f (x);  // exact match
                     68:    dd->f (i);  // draws warning
                     69: 
                     70:    Note that this technique really only works for 255 arguments.  Perhaps
                     71:    this is not enough.  */
                     72: 
                     73: /* These macros and harshness_code are used by the NEW METHOD.  */
                     74: #define EVIL_CODE (1<<7)
                     75: #define CONST_CODE (1<<6)
                     76: #define ELLIPSIS_CODE (1<<5)
                     77: #define USER_CODE (1<<4)
                     78: #define STD_CODE (1<<3)
                     79: #define PROMO_CODE (1<<2)
                     80: #define QUAL_CODE (1<<1)
                     81: #define TRIVIAL_CODE (1<<0)
                     82: 
                     83: struct harshness_code
                     84: {
                     85:   /* What kind of conversion is involved.  */
                     86:   unsigned short code;
                     87: 
                     88:   /* The inheritance distance.  */
                     89:   short distance;
                     90: 
                     91:   /* For a PROMO_CODE, Any special penalties involved in integral conversions.
                     92:      This exists because $4.1 of the ARM states that something like
                     93:      `short unsigned int' should promote to `int', not `unsigned int'.
                     94:      If, for example, it tries to match two fns, f(int) and f(unsigned),
                     95:      f(int) should be a better match than f(unsigned) by this rule.  Without
                     96:      this extra metric, they both only appear as "integral promotions", which
                     97:      will lead to an ambiguity.
                     98:      For a TRIVIAL_CODE, This is also used by build_overload_call_real and
                     99:      convert_harshness to keep track of other information we need.  */
                    100:   unsigned short int_penalty;
                    101: };
                    102: 
                    103: struct candidate
                    104: {
                    105:   /* OLD METHOD */
                    106:   unsigned char evil;        /* !0 if this will never convert.  */
                    107:   unsigned char ellipsis;     /* !0 if a match against an ellipsis occurred */
                    108:   unsigned char user;        /* !0 if at least one user-defined type conv.  */
                    109:   unsigned short b_or_d;      /* count number of derived->base or
                    110:                                 base->derived conv.  */
                    111:   unsigned short easy;       /* count number of builtin type conv.  */
                    112: 
                    113:   /* NEW METHOD */
                    114:   struct harshness_code h;     /* Used for single-argument conversions.  */
                    115: 
                    116:   int h_len;                   /* The length of the harshness vector.  */
                    117: 
                    118:   /* Both methods.  */
                    119:   tree function;               /* A FUNCTION_DECL */
                    120:   tree arg;                    /* first parm to function.  */
                    121: 
                    122:   /* This union is only here while we maintain both the old and new
                    123:      argument matching schemes.  When it goes away, all v.ansi_harshness
                    124:      references will be just `harshness'.  */
                    125:   union
                    126:     {
                    127:       /* Indexed by argument number, encodes evil, user, d_to_b, and easy
                    128:         strikes for that argument.  At end of array, we store the index+1
                    129:         of where we started using default parameters, or 0 if there are
                    130:         none.  */
                    131:       struct harshness_code *ansi_harshness; /* NEW METHOD */
                    132:       unsigned short *old_harshness;  /* OLD METHOD */
                    133:     } v;
                    134: 
                    135:   union
                    136:     {
                    137:       tree field;              /* If no evil strikes, the FUNCTION_DECL of
                    138:                                   the function (if a member function).  */
                    139:       int bad_arg;             /* the index of the first bad argument:
                    140:                                   0 if no bad arguments
                    141:                                   > 0 is first bad argument
                    142:                                   -1 if extra actual arguments
                    143:                                   -2 if too few actual arguments.
                    144:                                   -3 if const/non const method mismatch.
                    145:                                   -4 if type unification failed.
                    146:                                   -5 if contravariance violation.  */
                    147:     } u;
                    148: };
                    149: int rank_for_overload ();
                    150: 
                    151: /* Variables shared between cp-class.c and cp-call.c.  */
                    152: 
                    153: extern int n_vtables;
                    154: extern int n_vtable_entries;
                    155: extern int n_vtable_searches;
                    156: extern int n_vtable_elems;
                    157: extern int n_convert_harshness;
                    158: extern int n_compute_conversion_costs;
                    159: extern int n_build_method_call;
                    160: extern int n_inner_fields_searched;

unix.superglobalmegacorp.com

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