我正在尝试使用clang中的AST通过源到源转换来实现C ++代码的自动控制流扁平化。这意味着我将函数的控制流更改为一个处理所有基本块的大开关语句。
这也意味着,我需要在函数开头的所有变量声明(在switch语句之前,否则范围会不同)。在声明期间启动变量时,声明必须放在前面,初始化保持不变。
...
A a = b;
return a;
转换为
A a; // at the beginning
...
a = b; //at the point of a's declaration
return a;
到目前为止,这是有效的,C ++不会出现一些问题:类型class A
可以有例如没有默认构造函数。或者更糟糕的是,删除了复制赋值运算符。这将禁止我在声明之后使用class A
的另一个实例化来启动变量。
所以这最终让我想到了一个问题:是否有一种方法可以检查某个类型是否是一个带有已删除的复制赋值运算符的类,以便我能以不同的方式处理它?</ strong>我不能在clang::Type
或clang::QualType
中找不到任何方法。
也许你对如何以不同的方式处理也有了更好的想法,我的方法是(上面的例子):
A *a1; // at the beginning
...
A a = b; //at the point of a's declaration
a1 = &a;
return *(a1); // replace a at every occurrence with *(a1)
这意味着我需要为每个变量声明添加一个额外的指针,这就是为什么我只想在必要时使用它。