Hi, I am investigating a type error in LLVM. Here is the snippet of code: typedef union GCObject GCObject; typedef unsigned char lu_byte; typedef double lua_Number; typedef union { GCObject *gc; void *p; lua_Number n; int b; } Value; typedef struct lua_TValue { Value value; int tt; } TValue; typedef struct UpVal { GCObject *next; lu_byte tt; lu_byte marked; TValue *v; union { TValue value; struct { struct UpVal *prev; struct UpVal *next; } l; } u; } UpVal; static void close(UpVal *uv) { uv->v = &uv->u.value; } The linearized output is: close: .L0: <entry-point> add.64 %r2 <- %arg1, $24 store.64 %r2 -> 16[%arg1] ret The result of the add operation ends up the same type as arg1 which is UpVal*. But this is then assigned to uv->v which is expected to be TValue*. So LLVM doesn't like it. While in this case we could cast to the expected value before the store - I am worried that in other cases where the value is read and used somewhere it will have the wrong type. I see that the add instruction's type is 'void *'. Any suggestions on how to solve this issue? Thanks and Regards Dibyendu -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html