MCPcopy Create free account
hub / github.com/GJDuck/e9patch / coercible

Function coercible

src/e9tool/e9types.cpp:68–113  ·  view source on GitHub ↗

* Check if t can be coerced into u. */

Source from the content-addressed store, hash-verified

66 * Check if t can be coerced into u.
67 */
68static 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

Callers 2

lookupSymbolFunction · 0.85
lookupSymbolWarningsFunction · 0.85

Calls 1

getTypeFunction · 0.85

Tested by

no test coverage detected