> the implementation may assume any thread will eventually do one of the following: terminate, call a library I/O function, access a volatile glvalue, or perform a synchronization or atomic operation
Why is that rule needed? I could make my for loop try to solve the halting problem and it'll never finish either, circumventing that rule