我目前正在实现一个 clang 工具。我不知道如何根据函数的
clang::FunctionDecl
找出其 noexcept 性。对于以下代码
struct X {
X() = default;
};
int main() {
X x;
}
clang-query
表明 X
的默认构造函数是 noexcept
:
-CXXConstructorDecl 0x563b8aea50e8 <line:2:3, col:15> col:3 used constexpr X 'void () noexcept' default trivial implicit-inline
`-CompoundStmt 0x563b8aea5768 <col:15>
但是
fd->getExceptionSpecType()
返回 clang::ExceptionSpecificationType::EST_None
。此外,我认为 noexcept-ness 也可能被编码在函数类型中(因为它是自 C++17 以来函数类型的一部分),但我不知道如何提取该信息。
获取 a 的
ExceptionSpecificationType
FunctionDecl
,
称呼
ValueDecl::getType()
得到它的
QualType
,
致电 getTypePtr()
以获取其
Type
,
然后使用
dyn_cast
将其降级为
FunctionProtoType
,
最后打电话
FunctionProtoType::getExceptionSpecType()
。
例如:
clang::FunctionDecl const *functionDecl = /*wherever*/;
clang::Type const *type = functionDecl->getType().getTypePtr();
if (auto fpt = dyn_cast<clang::FunctionProtoType>(type)) {
clang::ExceptionSpecificationType est = fpt->getExceptionSpecType();
// Now do something with 'est'.
}
在您的示例中,对于
X::X()
,上述结果为 EST_BasicNoexcept
。
(我在Linux上使用Clang+LLVM-16.0.0,但这应该是相同的 跨越相当广泛的版本。)
FunctionDecl::getExceptionSpecType()
的文档说:
获取声明的 ExceptionSpecificationType。
“声明”部分意味着它仅包括
noexcept
(如果是)
语法上存在。
相反,通过
FunctionProtoType
,我们得到隐含的
也有异常规范。
如果从示例中删除
main
函数,则上面的
代码片段会产生 EST_Unevaluated
,其文档显示:
尚未评估,对于特殊会员功能
SemaExceptionSpec.cpp:1056
,
等),似乎构造函数的隐式异常规范
等直到需要时才会计算。调用站点是一种“需求”,因为
是虚拟覆盖,也许还有其他一些情况。
ExceptionAnalyzer.cpp
在 Clang 源代码中,因为它对异常进行了大量分析
规范语义。