I think all these checks should go (also) in the frontend, not just live inside the validator.
I don't know what's Henri's view on that, but there is probably a philosophical point here that was discussed a little bit when introducing the validator, possibly not enough: the way I see it frontends should do their own validation independently of the VSIR validator in `ir.c` or whatever other check is done during the processing of a shader, and the VSIR validator should just remain a development tool to have an independent check that the shader remains valid during its processing. This is the reason why the validation doesn't happen by default, it requires the explicit usage of `force_validation` (we still expect vkd3d-shader to error out on invalid input shaders even if `force_validation` is not used); incidentally, it is not the reason why my initial idea was to `assert()` on validation feature, but it's not my intention to rehash that discussion.
Yes, I think in principle frontends should reject invalid input, and produce valid vsir. There is a subtlety to consider though: it can be valid/useful/required to assemble/disassemble some kinds of invalid shaders. That implies a certain level of optionality for some of the validation that the frontends do.