|
|
1.1 ! root 1: /* The following structure is used when comparing various alternatives ! 2: for overloading. The unsigned quantity `strikes.i' is used ! 3: for fast comparison of two possibilities. This number is an ! 4: aggregate of four constituents: ! 5: ! 6: EVIL: if this is non-zero, then the candidate should not be considered ! 7: USER: if this is non-zero, then a user-defined type conversion is needed ! 8: B_OR_D: if this is non-zero, then use a base pointer instead of the ! 9: type of the pointer we started with. ! 10: EASY: if this is non-zero, then we have a builtin conversion ! 11: (such as int to long, int to float, etc) to do. ! 12: ! 13: If two candidates require user-defined type conversions, and the ! 14: type conversions are not identical, then an ambiguity error ! 15: is reported. ! 16: ! 17: If two candidates agree on user-defined type conversions, ! 18: and one uses pointers of strictly higher type (derived where ! 19: another uses base), then that alternative is silently chosen. ! 20: ! 21: If two candidates have a non-monotonic derived/base pointer ! 22: relationship, and/or a non-monotonic easy conversion relationship, ! 23: then a warning is emitted to show which paths are possible, and ! 24: which one is being chosen. ! 25: ! 26: For example: ! 27: ! 28: int i; ! 29: double x; ! 30: ! 31: overload f; ! 32: int f (int, int); ! 33: double f (double, double); ! 34: ! 35: f (i, x); // draws a warning ! 36: ! 37: struct B ! 38: { ! 39: f (int); ! 40: } *bb; ! 41: struct D : B ! 42: { ! 43: f (double); ! 44: } *dd; ! 45: ! 46: dd->f (x); // exact match ! 47: dd->f (i); // draws warning ! 48: ! 49: Note that this technique really only works for 255 arguments. Perhaps ! 50: this is not enough. */ ! 51: ! 52: struct candidate ! 53: { ! 54: tree function; /* A FUNCTION_DECL */ ! 55: ! 56: unsigned char evil; /* !0 if this will never convert. */ ! 57: unsigned char user; /* !0 if at least one user-defined type conv. */ ! 58: unsigned short b_or_d; /* count number of derived->base or ! 59: base->derived conv. */ ! 60: unsigned short easy; /* count number of builtin type conv. */ ! 61: tree arg; /* first parm to function. */ ! 62: unsigned short *harshness; /* Indexed by argument number, encodes ! 63: evil, user, d_to_b, and easy strikes for ! 64: that argument. ! 65: At end of array, we store the index+1 ! 66: of where we started using default ! 67: parameters, or 0 if there are none. */ ! 68: union ! 69: { ! 70: tree field; /* If no evil strikes, the FUNCTION_DECL of ! 71: the function (if a member function). */ ! 72: int bad_arg; /* the index of the first bad argument: ! 73: 0 if no bad arguements ! 74: > 0 is first bad argument ! 75: -1 if extra actual arguments ! 76: -2 if too few actual arguments. ! 77: -3 if const/non const method mismatch. ! 78: -4 if type unification failed. ! 79: -5 if contravariance violation. */ ! 80: } u; ! 81: }; ! 82: int rank_for_overload (); ! 83: ! 84: /* Variables shared between cp-class.c and cp-call.c. */ ! 85: ! 86: extern int n_vtables; ! 87: extern int n_vtable_entries; ! 88: extern int n_vtable_searches; ! 89: extern int n_vtable_elems; ! 90: extern int n_convert_harshness; ! 91: extern int n_compute_conversion_costs; ! 92: extern int n_build_method_call; ! 93: extern int n_inner_fields_searched;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.