libclang 给出类型限定符的错误结果
libclang give wrong result for type qualifier
Currentlty 我正在做一个项目,用 libclang 为 c++ 代码转储 class 信息。还有一些关于类型限定符的悲惨经历:const、volatile、&、&& 以及它们的组合。以下是转储函数删除参数类型的示例代码。
auto _cur_cursor = one_node->get_cursor();
auto _cur_type = clang_getCursorType(_cur_cursor);
auto is_const = clang_isConstQualifiedType(_cur_type);
auto is_refer = clang_Type_getCXXRefQualifier(_cur_type);
auto is_volatile = clang_isVolatileQualifiedType(_cur_type);
auto is_pointer = clang_getPointeeType(_cur_type);
auto is_const_ref = false;
if (is_pointer.kind)
{
is_const_ref = clang_isConstQualifiedType(is_pointer);
}
the_logger.info("get parameter name {} type {} is_const {} is_reference {} is volatile {} is_pointer {} is_const_ref {}", utils::to_string(clang_getCursorSpelling(_cur_cursor)), utils::to_string(clang_getTypeSpelling(_cur_type)), is_const, is_refer, is_volatile, utils::to_string(is_pointer), is_const_ref);
我的测试用例如下
int test_1(const std::vector<std::unordered_map<int, int>>& a, std::vector<int>&& b, std::vector<std::uint32_t>& c)
{
return b.size();
}
这个函数的输出是
[2019-06-01 23:14:18.171] [meta] [info] get parameter name a type const std::vector<std::unordered_map<int, int> > & is_const 0 is_reference 0 is volatile 0 is_pointer const std::vector<std::unordered_map<int, int> > is_const_ref true
[2019-06-01 23:14:18.171] [meta] [info] get parameter name b type std::vector<int> && is_const 0 is_reference 0 is volatile 0 is_pointer std::vector<int> is_const_ref false
[2019-06-01 23:14:18.171] [meta] [info] get parameter name c type std::vector<std::uint32_t> & is_const 0 is_reference 0 is volatile 0 is_pointer std::vector<std::uint32_t> is_const_ref false
这些观察结果对我来说是可疑的:
- clang_isConstQualifiedType return 仅适用于 const T,不适用于 const T (&, *, &&)
- clang_Type_getCXXRefQualifier 对任何类型总是 false
- clang_getPointeeType return T for T(,&, &&), return const T for const T(, &, && )
这些 api 似乎没有按预期运行。有没有关于获得 CXType 的正确 const 引用 volatile 限定符状态的想法?
和 3. const T (&, *, &&)
确实不是 const
限定类型,它是 [=11= 的(引用,指针,r-value 引用) ] 限定型。 const T * const
将是指向 const
合格类型 T
的 const
合格指针。
您可以查看 cppreference 了解更多详情。
来自 libclang 的 documentation:
Retrieve the ref-qualifier kind of a function or method.
The ref-qualifier is returned for C++ functions or methods. For other types or non-C++ declarations, CXRefQualifier_None is returned.
您可能正在寻找其他东西。检查 CXType::kind
(您的代码段中的 _cur_type.kind
)是否有 CXType_Pointer
、CXType_LValueReference
和 CXType_RValueReference
。
希望对您有用。用 clang 快乐黑客!
Currentlty 我正在做一个项目,用 libclang 为 c++ 代码转储 class 信息。还有一些关于类型限定符的悲惨经历:const、volatile、&、&& 以及它们的组合。以下是转储函数删除参数类型的示例代码。
auto _cur_cursor = one_node->get_cursor();
auto _cur_type = clang_getCursorType(_cur_cursor);
auto is_const = clang_isConstQualifiedType(_cur_type);
auto is_refer = clang_Type_getCXXRefQualifier(_cur_type);
auto is_volatile = clang_isVolatileQualifiedType(_cur_type);
auto is_pointer = clang_getPointeeType(_cur_type);
auto is_const_ref = false;
if (is_pointer.kind)
{
is_const_ref = clang_isConstQualifiedType(is_pointer);
}
the_logger.info("get parameter name {} type {} is_const {} is_reference {} is volatile {} is_pointer {} is_const_ref {}", utils::to_string(clang_getCursorSpelling(_cur_cursor)), utils::to_string(clang_getTypeSpelling(_cur_type)), is_const, is_refer, is_volatile, utils::to_string(is_pointer), is_const_ref);
我的测试用例如下
int test_1(const std::vector<std::unordered_map<int, int>>& a, std::vector<int>&& b, std::vector<std::uint32_t>& c)
{
return b.size();
}
这个函数的输出是
[2019-06-01 23:14:18.171] [meta] [info] get parameter name a type const std::vector<std::unordered_map<int, int> > & is_const 0 is_reference 0 is volatile 0 is_pointer const std::vector<std::unordered_map<int, int> > is_const_ref true
[2019-06-01 23:14:18.171] [meta] [info] get parameter name b type std::vector<int> && is_const 0 is_reference 0 is volatile 0 is_pointer std::vector<int> is_const_ref false
[2019-06-01 23:14:18.171] [meta] [info] get parameter name c type std::vector<std::uint32_t> & is_const 0 is_reference 0 is volatile 0 is_pointer std::vector<std::uint32_t> is_const_ref false
这些观察结果对我来说是可疑的:
- clang_isConstQualifiedType return 仅适用于 const T,不适用于 const T (&, *, &&)
- clang_Type_getCXXRefQualifier 对任何类型总是 false
- clang_getPointeeType return T for T(,&, &&), return const T for const T(, &, && )
这些 api 似乎没有按预期运行。有没有关于获得 CXType 的正确 const 引用 volatile 限定符状态的想法?
和 3.
const T (&, *, &&)
确实不是const
限定类型,它是 [=11= 的(引用,指针,r-value 引用) ] 限定型。const T * const
将是指向const
合格类型T
的const
合格指针。 您可以查看 cppreference 了解更多详情。来自 libclang 的 documentation:
Retrieve the ref-qualifier kind of a function or method.
The ref-qualifier is returned for C++ functions or methods. For other types or non-C++ declarations, CXRefQualifier_None is returned.
您可能正在寻找其他东西。检查 CXType::kind
(您的代码段中的 _cur_type.kind
)是否有 CXType_Pointer
、CXType_LValueReference
和 CXType_RValueReference
。
希望对您有用。用 clang 快乐黑客!