Many such programming environments need strict control over stack sizes to avoid any possibility of stack overflow.
I had a similar notion a few years back, thinking about a somewhat wider range of "scoped guarantees". The compiler would compute things such as the maximum stack usage of a function, and this would "roll up" to call sites automatically. This could also be used to enforce non-usage of certain dangerous features such as locks, global flags, or whatever.
Would you still have distinct activation records per call or forfeit the ability to have reentrant functions and recursion?
That's one of the main reasons to move to dynamic (as in a call stack) allocation of your activation records versus a single static allocation per function.
It would be awkward to work with since you'd have to be aware of all of the eventual caller scopes rather than your current local scope when defining it.
I suppose it would be like macros instead of true functions.
PIC16 has a hardware stack of only a few return addresses, and therefore imposes the "all register allocation is static" + "no recursion" that you're asking for.