public static Expr FromPointer(Expr expr, ExprType type, Env env) {
ExprTypeKind from = expr.Type.Kind;
ExprTypeKind to = type.Kind;
if (from != ExprTypeKind.POINTER) {
throw new InvalidOperationException("Expected a pointer.");
}
// if we are casting to another pointer, do a nop
if (to == ExprTypeKind.POINTER) {
if (expr.IsConstExpr) {
return new ConstPtr(((ConstPtr)expr).Value, type, env);
}
return new TypeCast(TypeCastType.NOP, expr, type, env);
}
// if we are casting to an integral
if (type.IsIntegral) {
// pointer -> ulong -> whatever integral
if (expr.IsConstExpr) {
expr = new ConstULong(((ConstPtr)expr).Value, env);
} else {
expr = new TypeCast(TypeCastType.NOP, expr, new ULongType(type.IsConst, type.IsVolatile), env);
}
return MakeCast(expr, type, env);
}
throw new InvalidOperationException("Casting from a pointer to an unsupported Type.");
}