* Check if t can be coerced into u. */
| 66 | * Check if t can be coerced into u. |
| 67 | */ |
| 68 | static long coercible(Type t, Type u) |
| 69 | { |
| 70 | if (t == u) |
| 71 | return 0; |
| 72 | if (t > u) |
| 73 | return -1; |
| 74 | |
| 75 | switch (t) |
| 76 | { |
| 77 | case TYPE_INT8: case TYPE_INT16: case TYPE_INT32: |
| 78 | case TYPE_INT64: |
| 79 | switch (u) |
| 80 | { |
| 81 | case TYPE_INT8: case TYPE_INT16: case TYPE_INT32: |
| 82 | case TYPE_INT64: |
| 83 | return u - t; |
| 84 | default: |
| 85 | return -1; |
| 86 | } |
| 87 | default: |
| 88 | break; |
| 89 | } |
| 90 | |
| 91 | if (t == TYPE_NULL_PTR && (u & TYPE_PTR) != 0) |
| 92 | return 4; |
| 93 | if ((t & TYPE_PTR) != 0 && (u & TYPE_PTR) != 0) |
| 94 | { |
| 95 | if (u == (t | TYPE_CONST)) |
| 96 | return 1; // (T *) --> (const T *) |
| 97 | if ((t & TYPE_CONST) == 0 && u == (TYPE_VOID | TYPE_PTR)) |
| 98 | return 5; // (T *) --> (void *) |
| 99 | if (u == (TYPE_CONST | TYPE_VOID | TYPE_PTR)) |
| 100 | return 9; // (T *) or (const T *) --> (const void *) |
| 101 | } |
| 102 | if ((t & TYPE_PTR_PTR) != 0 && (u & TYPE_PTR_PTR) != 0) |
| 103 | { |
| 104 | if (u == (t | TYPE_CONST)) |
| 105 | return 1; // (T **) --> (const T **) |
| 106 | if ((t & TYPE_CONST) == 0 && u == (TYPE_VOID | TYPE_PTR_PTR)) |
| 107 | return 5; // (T **) --> (void **) |
| 108 | if (u == (TYPE_CONST | TYPE_VOID | TYPE_PTR_PTR)) |
| 109 | return 9; // (T **) or (const T **) --> (const void **) |
| 110 | } |
| 111 | |
| 112 | return -1; |
| 113 | } |
| 114 | |
| 115 | /* |
| 116 | * Check if sig1 can be coerced into sig2. Return a score that represents |
no test coverage detected