代码之家  ›  专栏  ›  技术社区  ›  Wouter van Ooijen

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

  •  1
  • Wouter van Ooijen  · 技术社区  · 8 年前

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

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

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

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

    1 回复  |  直到 8 年前
        1
  •  0
  •   Wouter van Ooijen    8 年前

    事实证明,我想要的可以(以有限的方式)用C++概念来完成。概念测试其子句是否格式良好。否则,该概念将返回false。这段代码检查pin\u in\u out是否有set(bool)函数,而pin\u 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 > << "\n";
       std::cout << test_case< pin_in > << "\n";
    }
    

    印刷品

    1
    0
    

    所需的代码有点冗长(每个测试都需要一个单独的conecpt),因此我可能会编写一个Python TestScript到C++的转换器。