while (GetWhitespace(textStream))
    ;

I personally would never use an empty statement. If I for some bizarre reason wanted to play code golf and write something like

while(Foo(x++)) ;

I'd be more inclined to use {} instead of ; as the "do nothing statement". I think that is more clear.

Pretty much it's there for historic reasons. There's nothing there that you cannot also do with {}.

UPDATE: I just thought of one possible usage case. In a debug build it allows you to put a breakpoint somewhere that you are guaranteed that you can break at which is not going to have any side effect when you step. If the code surrounding the breakpoint is particularly complicated it might be useful.

UPDATE UPDATE: I am WRONG WRONG WRONG. That doesn't work. It just moves the breakpoint to the next statement. How irksome.