do {
// some code
} while (false);
обнаружилось, что не выдается предупреждении об использовании константы в выражении. Небольшое расследование показало, что виноваты разработчики Microsoft. В одном из файлов BaseClasses обнаружился такой криминал:
// disable some level-4 warnings, use #pragma warning(enable:###) to re-enable
#pragma warning(disable:4100) // warning C4100: unreferenced formal parameter
#pragma warning(disable:4127) // warning C4127: conditional expression is constant
#pragma warning(disable:4189) // warning C4189: local variable is initialized but not referenced
#pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union
#pragma warning(disable:4511) // warning C4511: copy constructor could not be generated
#pragma warning(disable:4512) // warning C4512: assignment operator could not be generated
#pragma warning(disable:4514) // warning C4514: unreferenced inline function has been removed
#pragma warning(disable:4710) // warning C4710: 'function' not inlined
Вывод тут можно сделать только один - нужно проверять файлы даже от доверенных поставщиков кода и, вообще, быть внимательнее.
Чтобы застраховаться в дальнейшем от таких неожиданностей, нужно сохранить состояние по предупреждениям следующим образом:
#pragma warning( push )
// include external stuff
#pragma warning( pop )