ajohnson-uoregon created this revision. ajohnson-uoregon added reviewers: klimek, jdoerfert. Herald added a project: All. ajohnson-uoregon requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
new AST matcher that checks the actual number of arguments given to a function call, *excluding* defaults not present; works like argumentCountIs(n) when isTraversalIgnoringImplicitNodes() is true Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D120956 Files: clang/include/clang/ASTMatchers/ASTMatchers.h clang/lib/ASTMatchers/Dynamic/Registry.cpp Index: clang/lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -135,6 +135,7 @@ REGISTER_MATCHER(anyOf); REGISTER_MATCHER(anything); REGISTER_MATCHER(argumentCountIs); + REGISTER_MATCHER(argumentsGivenCountIs); REGISTER_MATCHER(arraySubscriptExpr); REGISTER_MATCHER(arrayType); REGISTER_MATCHER(asString); Index: clang/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchers.h +++ clang/include/clang/ASTMatchers/ASTMatchers.h @@ -4440,6 +4440,29 @@ return NumArgs == N; } +/// Checks that a call expression or a constructor call expression has +/// a specific number of arguments (EXCLUDING absent default arguments). +/// +/// Example matches f(0, 0) but not f(0) (matcher = callExpr(argumentsGivenCountIs(2))) +/// \code +/// void f(int x, int y = 0); +/// f(0, 0); +/// f(0); +/// \endcode +AST_POLYMORPHIC_MATCHER_P(argumentsGivenCountIs, + AST_POLYMORPHIC_SUPPORTED_TYPES( + CallExpr, CXXConstructExpr, + CXXUnresolvedConstructExpr, ObjCMessageExpr), + unsigned, N) { + unsigned NumArgs = Node.getNumArgs(); + while (NumArgs) { + if (!isa<CXXDefaultArgExpr>(Node.getArg(NumArgs - 1))) + break; + --NumArgs; + } + return NumArgs == N; +} + /// Matches the n'th argument of a call expression or a constructor /// call expression. ///
Index: clang/lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -135,6 +135,7 @@ REGISTER_MATCHER(anyOf); REGISTER_MATCHER(anything); REGISTER_MATCHER(argumentCountIs); + REGISTER_MATCHER(argumentsGivenCountIs); REGISTER_MATCHER(arraySubscriptExpr); REGISTER_MATCHER(arrayType); REGISTER_MATCHER(asString); Index: clang/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchers.h +++ clang/include/clang/ASTMatchers/ASTMatchers.h @@ -4440,6 +4440,29 @@ return NumArgs == N; } +/// Checks that a call expression or a constructor call expression has +/// a specific number of arguments (EXCLUDING absent default arguments). +/// +/// Example matches f(0, 0) but not f(0) (matcher = callExpr(argumentsGivenCountIs(2))) +/// \code +/// void f(int x, int y = 0); +/// f(0, 0); +/// f(0); +/// \endcode +AST_POLYMORPHIC_MATCHER_P(argumentsGivenCountIs, + AST_POLYMORPHIC_SUPPORTED_TYPES( + CallExpr, CXXConstructExpr, + CXXUnresolvedConstructExpr, ObjCMessageExpr), + unsigned, N) { + unsigned NumArgs = Node.getNumArgs(); + while (NumArgs) { + if (!isa<CXXDefaultArgExpr>(Node.getArg(NumArgs - 1))) + break; + --NumArgs; + } + return NumArgs == N; +} + /// Matches the n'th argument of a call expression or a constructor /// call expression. ///
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits