Тесты на "не компилируемость"

ilnur.khuziev
ilnur.khuziev

Пример

#pragma negative start
void test_cant_do_this(){
 SomeTypeOnlyForUnsignedTypes<into> var;
}
//дополнительно указывает какого типа должна быть ошибка компиляции
#pragma negative catch static_assert_err

#pragma negative end

Кроме этого можно проверять что нельзя вызвать метод (типы ошибок : private, isNotCallable , неоднозначный вызов, нет подходящей перегрузки), что идентификатор не определен, что метод или класс является абстрактным. Еще можно было бы и про "неразрешенный символ", но это уже линковка.

Проверка условий должна проходить при включени флага компиляции, должна быть возможность от компилятора запросить отчет обо всех негативных тестах, для последующей интеграции с ci системами.

 

 

-3
рейтинг
2 комментария
Andrey Davydov
На сколько я понимаю, смысл директивы #pragma ровно в том, что она дается на откуп компиляторам и стандарт никак не может ее регулировать.
То что вы хотите проверять частично возможно уже сейчас:
static_assert(std::is_invocable_v<Fn, Args...>);
static_assert(std::is_abstract_v<MyClass>);
Про линковку стандарт C++ не знает ничего, поэтому кажется что стандартизировать проверку ошибок линковки, к сожалению, невозможно.
Andrey Davydov
dmitriy@izvolov.ru
Идея отличная, при тестировании метафункций было бы огромное подспорье.
Только нужно получше продумать.
Мне бы хотелось иметь возможность проверять произвольное выражение, или даже блок кода:
static_assert(compiles(expression));
dmitriy@izvolov.ru
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).