I came across this in the C standard text, any version I can find for C99 or C11, at §6.8.5 :
iteration-statement: while ( expression ) statement do stat
The production for declaration is:
declaration
declaration: declaration-specifiers init-declarator-listopt ;
So the semicolon is already part of it.