This isn't quite true -- it's enforced by sema for user code, but not for code that identifies itself as a system header. I see that this is existing code that's moved around a bit, but we may want to add an assertion here just in case.
Just noting that this trunk of code have very similar logic counter part in EmitCXXGlobalInitFunc. It seems there is no easy way to common them up given the current way of implementing it. It may require a non-trivial amount of refactoring for us to common up the similar logic between init and cleanup.