libclang为类型限定符给出错误的结果

时间:2019-06-01 15:54:36

标签: c++ clang llvm-clang libclang

Currentlty我正在一个项目中,使用libclang转储c ++代码的类信息。关于类型限定符,还有一些痛苦的经验:const,volatile,&,&&&&及其组合。这是转储函数delearation的参数类型的示例代码。

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

这些观察对我来说是可疑的:

  1. clang_isConstQualifiedType仅对于const T而不是const T(&,*,&&)返回true
  2. clang_Type_getCXXRefQualifier对于任何类型始终为false
  3. clang_getPointeeType为const T(,&,&&)返回T,为const T(,&,&&)
  4. 返回const T

这些api似乎不符合预期。有什么想法可以为CXType获取正确的const引用volatile限定符状态?

1 个答案:

答案 0 :(得分:1)

  1. 和3。const T (&, *, &&)确实不是const限定类型,它是const限定类型的(引用,指针,r值引用)。 const T * const是指向const限定类型const的{​​{1}}限定指针。 您可以检查cppreference了解更多详细信息。

  2. 来自libclang的documentation

  

检索函数或方法的ref限定符类型。

     

为C ++函数或方法返回ref限定符。对于其他类型或非C ++声明,将返回CXRefQualifier_None。

可能您正在寻找其他东西。而是检查T(在您的代码段中的CXType::kind)中查找_cur_type.kindCXType_PointerCXType_LValueReference

我希望这是有用的。用c高兴地黑客!