if (!(target instanceof Assignable))
throw new RuntimeException("Invalid target");
((Assignable)target).checkAssignment(this, env);
Type tT = target.typecheck(env, Optional.empty());
Type vT = value.typecheck(env, Optional.of(tT));
if (!vT.subtype(tT))
ToolError.reportError(ErrorMessage.ACTUAL_FORMAL_TYPE_MISMATCH, this);
} else {
nextExpr.typecheck(env, Optional.empty());
}
return Unit.getInstance();