Это ошибка оптимизации VS2012?

Работаем над обновлением VS2010 до 2012 здесь, и есть пара неудачных тестов из-за плохой генерации кода или ошибки программирования, но я не уверен, какой именно.
Код, который я публикую, почти идентичен оригинальному, а также воспроизводит проблемы.

Вот случай; все классы / реализации находятся в отдельных файлах.

class Base
{
public:
virtual ~Base(){}
void DoIt(){ DoItImpl(); }
protected:
virtual void DoItImpl() = 0;
};

class Base2 : public Base
{
public:
virtual void DoStuff() = 0;
};

class Impl : public Base2
{
public:
Impl();
void DoStuff();
protected:
void DoItImpl();
};

void Impl::DoStuff()
{
throw std::runtime_error( "oops" );
}

void Impl::DoItImpl()
{
throw std::runtime_error( "oops" );
}

Вышеуказанное находится в dll и протестировано с использованием unittest ++ в exe (я отправил CHECK_THROW макрос для ясности, ничего не меняет):

SUITE( Base )
{
TEST( Impl )
{
Impl c;
bool caught = false;
try
{
c.DoIt();
}
catch( const std::exception& )
{
caught = true;
}

//this point is never reached, instead control goes to the
//try/catch in unittest++'s ExecuteTest function
CHECK( caught );
}
}

Является ли это ошибкой или нет, есть ли обходной путь, который я могу использовать немедленно, или какие-то общие правила, как этого избежать?

редактировать Добавлена ​​реализация DoStuff()если я назову это вместо DoIt() нет проблем!

редактировать Это должно исключить возможность того, что инфраструктура unittest или любой другой код является проблемой, или перехват по константной ссылке, или компилятор, не знающий runtime_error, происходит из исключения; Я расширил макросы unittest, чтобы показать, что они на самом деле делают, и создал новый проект, содержащий только этот исходный файл:

namespace SuiteImpl
{
class TestImpl
{
public:
TestImpl() {}
virtual void RunImpl() const;
};

void TestImpl::RunImpl() const
{
xxx::Impl c;
try
{
c.DoIt();
}
catch( std::exception& )
{
std::cout << "good" << std::endl;
}
}
}

int main()
{
SuiteImpl::TestImpl impl;

try
{
impl.RunImpl();
}
catch( const std::exception& )
{
std::cout << "not good" << std::endl;
}
}

Выход not good,

4

Решение

Это подтверждена ошибка оптимизатора и они надеются это исправить VS2012 Update 4.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]