//===-- ReplaceAutoPtrMatchers.cpp -- std::auto_ptr replacement -----------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// \file /// \brief This file contains the definitions for matcher-generating functions /// and names for bound nodes found by AST matchers. /// //===----------------------------------------------------------------------===// #include "ReplaceAutoPtrMatchers.h" #include "Core/CustomMatchers.h" const char *AutoPtrTokenId = "AutoPtrTokenId"; const char *AutoPtrOwnershipTransferId = "AutoPtrOwnershipTransferId"; namespace clang { namespace ast_matchers { /// \brief Matches expressions that are lvalues. /// /// In the following example, a[0] matches expr(isLValue()): /// \code /// std::string a[2]; /// std::string b; /// b = a[0]; /// b = "this string won't match"; /// \endcode AST_MATCHER(Expr, isLValue) { return Node.getValueKind() == VK_LValue; } } // end namespace ast_matchers } // end namespace clang using namespace clang; using namespace clang::ast_matchers; // shared matchers static DeclarationMatcher AutoPtrDecl = recordDecl(hasName("auto_ptr"), isFromStdNamespace()); static TypeMatcher AutoPtrType = qualType(hasDeclaration(AutoPtrDecl)); // Matcher that finds expressions that are candidates to be wrapped with // 'std::move()'. // // Binds the id \c AutoPtrOwnershipTransferId to the expression. static StatementMatcher MovableArgumentMatcher = expr( allOf(isLValue(), hasType(AutoPtrType))).bind(AutoPtrOwnershipTransferId); TypeLocMatcher makeAutoPtrTypeLocMatcher() { // skip elaboratedType() as the named type will match soon thereafter. return typeLoc(loc(qualType(AutoPtrType, unless(elaboratedType())))) .bind(AutoPtrTokenId); } DeclarationMatcher makeAutoPtrUsingDeclMatcher() { return usingDecl(hasAnyUsingShadowDecl(hasTargetDecl( allOf(hasName("auto_ptr"), isFromStdNamespace())))).bind(AutoPtrTokenId); } StatementMatcher makeTransferOwnershipExprMatcher() { StatementMatcher assignOperator = operatorCallExpr(allOf( hasOverloadedOperatorName("="), callee(methodDecl(ofClass(AutoPtrDecl))), hasArgument(1, MovableArgumentMatcher))); StatementMatcher copyCtor = constructExpr(allOf(hasType(AutoPtrType), argumentCountIs(1), hasArgument(0, MovableArgumentMatcher))); return anyOf(assignOperator, copyCtor); }