I agree, and there is tooling to do this kind of thing with C/C++.
If this was embedded into the language, you'll quickly learn that static checking has its limits; dynamic checking introduces a new class of failure mode into your embedded, safety critical (as in kills or destroys) system, which might also not be what you want.
It's a conundrum :(
The second statement contradicts the first - int16_t is too specific and hides errors, but an arbitrary range is not?