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
但我对此了解不多,无法确定。谁能给我解释一下这是为什么?
我正在从事一个涉及 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
但我对此了解不多,无法确定。谁能给我解释一下这是为什么?