如何测试编译器不应接受的内容[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何测试编译器不应接受的内容[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我正在编写一个包含许多适配器的C ++库。很容易进行自动化测试,可以将适配器foo应用于类型a,只需编写代码foo并检查它是否编译。为了更有信心,您甚至可以检查它是否按预期工作;)有许多单元测试框架可以帮助实现这一点。

但是某些东西不能编译同样重要,例如foo不应该接受类型b。关于以自动方式测试这个有共同的智慧吗?一步可能是运行编译器并验证它是否返回错误状态(或不生成输出文件)。但是每次测试需要一个源文件!一些宏魔法可以将测试组合到一个源文件中,但它仍然需要许多编译运行。

我无法相信我是第一个与这个问题斗争的人。那么,组织和运行此类测试的好方法是什么?

(在以前的生活中,我写了一个小编译器,它有一个命令行选项-fail 12,它导致编译器返回错误代码,除非遇到错误或第12行。也许我应该修补GCC以接受类似的东西。)

答案

事实证明我想要的(以有限的方式)可以用C ++概念完成。一个概念测试其条款是否格式良好。如果不是,则该概念返回false。此代码检查pin_in_out是否具有set(bool)函数,而pin_in没有。

struct pin_in_out { static void set( bool v ){} };
struct pin_in{ };

template< typename T >
concept bool test_case = requires( bool v ) {
    { T::set( v ) } -> void;
};

int main(){
   std::cout << test_case< pin_in_out > << "
";
   std::cout << test_case< pin_in > << "
";
}

版画

1
0

所需的代码有点冗长(每个测试需要一个单独的概念),所以我可能会编写一个Python测试脚本到C ++的转换器。

以上是关于如何测试编译器不应接受的内容[重复]的主要内容,如果未能解决你的问题,请参考以下文章

iOS代码片段CodeSnippets

单元测试私有代码[重复]

如何创建片段以重复变量编号中的代码行

KLOC 在每个测试阶段的成功标准是啥

如何从片段 KOTLIN 中调用意图 [重复]

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]