如何在 clang 中获得 FunctionDecl 的无异常性?

问题描述 投票:0回答:1

我目前正在实现一个 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 以来函数类型的一部分),但我不知道如何提取该信息。

c++ clang llvm noexcept libtooling
1个回答
0
投票

获取 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 不起作用?

FunctionDecl::getExceptionSpecType()
的文档说:

获取声明的 ExceptionSpecificationType。

“声明”部分意味着它仅包括

noexcept
(如果是) 语法上存在。

相反,通过

FunctionProtoType
,我们得到隐含的 也有异常规范。

警告:未评估的异常规范

如果从示例中删除

main
函数,则上面的 代码片段会产生
EST_Unevaluated
,其文档显示:

尚未评估,对于特殊会员功能

挖掘来源(例如,

SemaExceptionSpec.cpp:1056
, 等),似乎构造函数的隐式异常规范 等直到需要时才会计算。调用站点是一种“需求”,因为 是虚拟覆盖,也许还有其他一些情况。

补充

如果您想深入了解异常规范,您可能需要 看着

ExceptionAnalyzer.cpp
在 Clang 源代码中,因为它对异常进行了大量分析 规范语义。

© www.soinside.com 2019 - 2024. All rights reserved.