пятница, 11 сентября 2015 г.

[prog.c++11.testing] Захотелось странного: тесты, проверяющие, что код не компилируется

C++11 упрощает проведение различных проверок в компайл-тайм. Тут и замечательный static_assert, и std::enable_if, да и старые добрые шаблонные трюки в наличии. В C++17 еще и концепты подтянут, вообще веселуха начнется :)

Все это делает значительно удешевляет написание библиотечного кода, который запрещает использование тех или иных вещей неправильно. Ну, например, ждет шаблонная функция duplicate() параметром тип, у которого есть метод clone(), значит такой тип ей должен быть предоставлен. И чтобы это было диагностировано максимально близко к вызову duplicate(), а не где-то там, глубоко в потрохах ее реализации.

Но у C++ных шаблонов есть интересное свойство, более характерное для динамически-типизированных языков: если код C++ного шаблона не покрыть полностью тестами, то в нем запросто могут остаться ошибки. Вплоть до синтаксических. Это не шутка, к сожалению. Тот же VC++ делает минимальный анализ тела шаблонных функций, пропуская ляпы, на которые clang и gcc сразу же ругаются. Но и clang/gcc, бывает, находят ошибки в шаблонах только при их инстанциировании.

В связи с этим возникает вопрос: а как же проверять эти самые компайл-тайм проверки? Т.е. как оформлять тесты, доказывающие, что C++ный код, который не должен компилироваться, действительно не компилируется?

Такое ощущение, что пора стряхивать пыль с книжек по Ruby и садиться за выпуск очередной версии mxx_ru :)

PS. А тот же CMake как-то эту проблему решает?

Комментариев нет: