首页 > 解决方案 > 如何将枚举类型与 clang-query 匹配

问题描述

考虑以下 C 源代码:

$ cat type.c
enum a {
    b
};

int v1;
enum a v2;

如何将枚举类型与 clang AST 匹配器查询匹配?

我可以匹配这样的内置类型:

$ clang-query type.c  --
clang-query> match varDecl(hasType(builtinType()))

Match #1:

/Users/stm/Documents/CTEST/type.c:6:1: note: "root" binds here
int v1;
^~~~~~
1 match.

但是当我尝试匹配使用枚举类型声明的变量时它不起作用:

$ clang-query type.c  --
clang-query> match varDecl(hasType(enumType()))
0 matches.

我使用 clang 11.0.0 进行这些测试。

标签: abstract-syntax-treeclang++

解决方案


我无法解释为什么这是必要的,但通过反复试验,我发现将enumType()匹配器包装在内部hasUnqualifiedDesugaredType()会产生所需的结果:

$ clang-query type.c --
clang-query> match varDecl(hasType(hasUnqualifiedDesugaredType(enumType())))

Match #1:

/Users/stm/Documents/CTEST/type.c:7:1: note: "root" binds here
enum a v2;
^~~~~~~~~
1 match.

推荐阅读