clang::ast_matchers::thisPointerType 对重载函数的调用不明确

clang::ast_matchers::thisPointerType ambiguous call to overloaded function

我正在从事一个涉及 Clang AST 匹配器的项目。这是我拥有的一个这样的 AST 匹配器。

StatementMatcher getNumUses_matcher1 = binaryOperator(
    hasOperatorName(">"),
    hasLHS(ignoringParenImpCasts(
        cxxMemberCallExpr(
            thisPointerType(hasDeclaration(cxxRecordDecl(isSameOrDerivedFrom("Value")))),
            hasDeclaration(cxxMethodDecl(hasName("getNumUses")))
        )
    )),
    hasRHS(ignoringParenImpCasts(
        integerLiteral(equals(0))
    ))
).bind("type1");

我正在使用 Microsoft Visual Studio 编译器在 Windows 上编译项目。我检查了一下,匹配器在语法上看起来没问题。但是编译器抱怨。

cxxMemberCallExpr term does not evaluate to a function taking 2 arguments
thisPointerType more than one instance of overloaded function "thisPointerType" matches the argument list
thisPointerType 'clang::ast_matchers::thisPointerType': ambiguous call to overloaded function

看来这是一个编译器语法错误。但这是奇怪的部分。

每当我 运行 通过 clang-query 使用完全相同的匹配器时,它就可以正常工作! clang-query也会检查语法,但是这里没有报语法错误。它 运行ms ast 匹配器并按预期成功匹配所需的表达式。

clang-query> match binaryOperator(hasOperatorName(">"),hasLHS(ignoringParenImpCasts(cxxMemberCallExpr(thisPointerType(hasDeclaration(cxxRecordDecl(isSameOrDerivedFrom("Value")))),hasDeclaration(cxxMethodDecl(hasName("getNumUses")))))),hasRHS(ignoringParenImpCasts(integerLiteral(equals(0)))))

Match #1:

C:\work\sample_example\sample_example.cpp:77:9: note: "root" binds here
        pGlobalVar->getNumUses() > 0
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

如果我尝试使用 clang++ 编译器编译相同的代码:

ReplaceGetNumUses.cpp:62:17: error: call to 'thisPointerType' is ambiguous
                thisPointerType(hasDeclaration(cxxRecordDecl(isSameOrDerivedFrom("Value")))),
                ^~~~~~~~~~~~~~~
C:\clang_llvm\llvm-project-master\clang\include\clang/ASTMatchers/ASTMatchers.h:3741:43: note: candidate function
AST_MATCHER_P_OVERLOAD(CXXMemberCallExpr, thisPointerType,
                                          ^
C:\clang_llvm\llvm-project-master\clang\include\clang/ASTMatchers/ASTMatchers.h:3749:43: note: candidate function
AST_MATCHER_P_OVERLOAD(CXXMemberCallExpr, thisPointerType,
                                          ^

我不确定为什么 clang-query 接受上面的 AST 匹配器,而 clang++ 和 Microsoft Visual Studio cl 编译器都将其标记为语法错误。不过我找到了解决办法。

我重构了我的 AST 匹配器。我为此使用了稍微不同的语法。现在这个可以编译,并且 clang-query 接受它,生成与上面的 AST 匹配器相同的结果。

StatementMatcher getNumUses_matcher1 = binaryOperator(
    hasOperatorName(">"),
    hasLHS(ignoringParenImpCasts(
        cxxMemberCallExpr(hasDeclaration(cxxMethodDecl(
            hasName("getNumUses"),
            ofClass(isSameOrDerivedFrom("Value"))
        )))
    )),
    hasRHS(ignoringParenImpCasts(
        integerLiteral(equals(0))
    ))
).bind("type1");

现在,在这种方法中,我通过对 cxxMethodDecl() 应用 ofClass() 而不是对 [=19] 使用 thisPointerType() 来搜索 class 的名称=].

问题可能在于 thisPointerType() 有两个重载。根据 AST Matcher Reference.

Return type                 Name             Parameters

Matcher<CXXMemberCallExpr>  thisPointerType Matcher<Decl> InnerMatcher

Matcher<CXXMemberCallExpr>  thisPointerType Matcher<QualType> InnerMatcher

但我对此了解不多,无法确定。谁能给我解释一下这是为什么?