steveire updated this revision to Diff 237417.
steveire added a comment.

Fix case


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D72530/new/

https://reviews.llvm.org/D72530

Files:
  clang-tools-extra/clang-tidy/abseil/DurationDivisionCheck.cpp
  clang-tools-extra/clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp
  clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp
  clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.cpp
  clang-tools-extra/clang-tidy/abseil/UpgradeDurationConversionsCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/BoolPointerImplicitConversionCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/InaccurateEraseCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/IncorrectRoundingsCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/IntegerDivisionCheck.cpp
  
clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/MisplacedWideningCastCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/ParentVirtualCallCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/SuspiciousMissingCommaCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/SuspiciousStringCompareCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/TooSmallLoopVariableCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/UndelegatedConstructorCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp
  clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.cpp
  clang-tools-extra/clang-tidy/cert/ProperlySeededRandomGeneratorCheck.cpp
  clang-tools-extra/clang-tidy/cert/StaticObjectExceptionCheck.cpp
  clang-tools-extra/clang-tidy/cert/ThrownExceptionTypeCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/InterfacesGlobalInitCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/OwningMemoryCheck.cpp
  
clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.cpp
  clang-tools-extra/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.cpp
  clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp
  clang-tools-extra/clang-tidy/llvm/PreferRegisterOverUnsignedCheck.cpp
  clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp
  clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
  clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
  clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
  clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp
  clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp
  clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp
  clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.cpp
  clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp
  clang-tools-extra/clang-tidy/modernize/UseBoolLiteralsCheck.cpp
  clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
  clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp
  clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
  clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.cpp
  clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.cpp
  clang-tools-extra/clang-tidy/performance/InefficientAlgorithmCheck.cpp
  clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
  clang-tools-extra/clang-tidy/performance/MoveConstructorInitCheck.cpp
  clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp
  clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
  clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
  clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
  clang-tools-extra/clang-tidy/readability/DeleteNullPointerCheck.cpp
  clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
  clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
  clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp
  clang-tools-extra/clang-tidy/readability/MisplacedArrayIndexCheck.cpp
  clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
  
clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.cpp
  clang-tools-extra/clang-tidy/readability/RedundantMemberInitCheck.cpp
  clang-tools-extra/clang-tidy/readability/RedundantStringCStrCheck.cpp
  clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp
  clang-tools-extra/clang-tidy/readability/StringCompareCheck.cpp
  clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp
  clang-tools-extra/clang-tidy/utils/ExprSequence.cpp
  clang-tools-extra/clang-tidy/zircon/TemporaryObjectsCheck.cpp

Index: clang-tools-extra/clang-tidy/zircon/TemporaryObjectsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/zircon/TemporaryObjectsCheck.cpp
+++ clang-tools-extra/clang-tidy/zircon/TemporaryObjectsCheck.cpp
@@ -28,18 +28,18 @@
 
 void TemporaryObjectsCheck::registerMatchers(MatchFinder *Finder) {
   // Matcher for default constructors.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxTemporaryObjectExpr(hasDeclaration(cxxConstructorDecl(hasParent(
                                  cxxRecordDecl(matchesAnyName(Names))))))
-          .bind("temps"),
+          .bind("temps")),
       this);
 
   // Matcher for user-defined constructors.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxConstructExpr(hasParent(cxxFunctionalCastExpr()),
                        hasDeclaration(cxxConstructorDecl(
                            hasParent(cxxRecordDecl(matchesAnyName(Names))))))
-          .bind("temps"),
+          .bind("temps")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/utils/ExprSequence.cpp
===================================================================
--- clang-tools-extra/clang-tidy/utils/ExprSequence.cpp
+++ clang-tools-extra/clang-tidy/utils/ExprSequence.cpp
@@ -28,6 +28,7 @@
                                                    ASTContext *Context) {
   SmallVector<const Stmt *, 1> Result;
 
+  TraversalKindScope RAII(*Context, ast_type_traits::TK_AsIs);
   ASTContext::DynTypedNodeList Parents = Context->getParents(*S);
 
   SmallVector<ast_type_traits::DynTypedNode, 1> NodesToProcess(Parents.begin(),
Index: clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp
@@ -196,12 +196,12 @@
   // Sadly, we can't check whether the literal has sufix or not.
   // E.g. i32 suffix still results in 'BuiltinType::Kind::Int'.
   // And such an info is not stored in the *Literal itself.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       stmt(eachOf(integerLiteral().bind(IntegerLiteralCheck::Name),
                   floatLiteral().bind(FloatingLiteralCheck::Name)),
            unless(anyOf(hasParent(userDefinedLiteral()),
                         hasAncestor(isImplicit()),
-                        hasAncestor(substNonTypeTemplateParmExpr())))),
+                        hasAncestor(substNonTypeTemplateParmExpr()))))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/readability/StringCompareCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/StringCompareCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/StringCompareCheck.cpp
@@ -34,17 +34,18 @@
       callee(memberExpr().bind("str1")));
 
   // First and second case: cast str.compare(str) to boolean.
-  Finder->addMatcher(implicitCastExpr(hasImplicitDestinationType(booleanType()),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    implicitCastExpr(hasImplicitDestinationType(booleanType()),
                                       has(StrCompare))
-                         .bind("match1"),
+                         .bind("match1")),
                      this);
 
   // Third and fourth case: str.compare(str) == 0 and str.compare(str) != 0.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       binaryOperator(anyOf(hasOperatorName("=="), hasOperatorName("!=")),
                      hasEitherOperand(StrCompare.bind("compare")),
                      hasEitherOperand(integerLiteral(equals(0)).bind("zero")))
-          .bind("match2"),
+          .bind("match2")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/RedundantStringInitCheck.cpp
@@ -69,16 +69,16 @@
   // Examples:
   //     string foo = "";
   //     string bar("");
-  Finder->addMatcher(
-      namedDecl(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+       namedDecl(
           varDecl(
               hasType(hasUnqualifiedDesugaredType(recordType(
                   hasDeclaration(cxxRecordDecl(hasStringTypeName))))),
               hasInitializer(expr(ignoringImplicit(anyOf(
                   EmptyStringCtorExpr, EmptyStringCtorExprWithTemporaries)))))
               .bind("vardecl"),
-          unless(parmVarDecl())),
-      this);
+          unless(parmVarDecl()))),
+       this);
 }
 
 void RedundantStringInitCheck::check(const MatchFinder::MatchResult &Result) {
Index: clang-tools-extra/clang-tidy/readability/RedundantStringCStrCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/RedundantStringCStrCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/RedundantStringCStrCheck.cpp
@@ -95,8 +95,9 @@
           .bind("call");
 
   // Detect redundant 'c_str()' calls through a string constructor.
-  Finder->addMatcher(cxxConstructExpr(StringConstructorExpr,
-                                      hasArgument(0, StringCStrCallExpr)),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    cxxConstructExpr(StringConstructorExpr,
+                                      hasArgument(0, StringCStrCallExpr))),
                      this);
 
   // Detect: 's == str.c_str()'  ->  's == str'
@@ -153,7 +154,7 @@
       this);
 
   // Detect redundant 'c_str()' calls through a StringRef constructor.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxConstructExpr(
           // Implicit constructors of these classes are overloaded
           // wrt. string types and they internally make a StringRef
@@ -167,7 +168,7 @@
           // a constructor from string which is more efficient (avoids
           // strlen), so we can construct StringRef from the string
           // directly.
-          hasArgument(0, StringCStrCallExpr)),
+          hasArgument(0, StringCStrCallExpr))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/readability/RedundantMemberInitCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/RedundantMemberInitCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/RedundantMemberInitCheck.cpp
@@ -35,19 +35,19 @@
               cxxRecordDecl(unless(isTriviallyDefaultConstructible()))))))
           .bind("construct");
 
-  Finder->addMatcher(
-      cxxConstructorDecl(
-          unless(isDelegatingConstructor()),
-          ofClass(unless(
-              anyOf(isUnion(), ast_matchers::isTemplateInstantiation()))),
-          forEachConstructorInitializer(
+   Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+       cxxConstructorDecl(
+           unless(isDelegatingConstructor()),
+           ofClass(unless(
+               anyOf(isUnion(), ast_matchers::isTemplateInstantiation()))),
+           forEachConstructorInitializer(
               cxxCtorInitializer(
                   isWritten(), withInitializer(ignoringImplicit(Construct)),
                   unless(forField(hasType(isConstQualified()))),
                   unless(forField(hasParent(recordDecl(isUnion())))))
                   .bind("init")))
-          .bind("constructor"),
-      this);
+          .bind("constructor")),
+       this);
 }
 
 void RedundantMemberInitCheck::check(const MatchFinder::MatchResult &Result) {
Index: clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/RedundantFunctionPtrDereferenceCheck.cpp
@@ -17,10 +17,11 @@
 namespace readability {
 
 void RedundantFunctionPtrDereferenceCheck::registerMatchers(MatchFinder *Finder) {
-  Finder->addMatcher(unaryOperator(hasOperatorName("*"),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    unaryOperator(hasOperatorName("*"),
                                    has(implicitCastExpr(
                                        hasCastKind(CK_FunctionToPointerDecay))))
-                         .bind("op"),
+                         .bind("op")),
                      this);
 }
 
Index: clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/NonConstParameterCheck.cpp
@@ -28,11 +28,12 @@
   Finder->addMatcher(declRefExpr().bind("Ref"), this);
 
   // Analyse parameter usage in function.
-  Finder->addMatcher(stmt(anyOf(unaryOperator(anyOf(hasOperatorName("++"),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    stmt(anyOf(unaryOperator(anyOf(hasOperatorName("++"),
                                                     hasOperatorName("--"))),
                                 binaryOperator(), callExpr(), returnStmt(),
                                 cxxConstructExpr()))
-                         .bind("Mark"),
+                         .bind("Mark")),
                      this);
   Finder->addMatcher(varDecl(hasInitializer(anything())).bind("Mark"), this);
 }
Index: clang-tools-extra/clang-tidy/readability/MisplacedArrayIndexCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/MisplacedArrayIndexCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/MisplacedArrayIndexCheck.cpp
@@ -19,9 +19,10 @@
 namespace readability {
 
 void MisplacedArrayIndexCheck::registerMatchers(MatchFinder *Finder) {
-  Finder->addMatcher(arraySubscriptExpr(hasLHS(hasType(isInteger())),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    arraySubscriptExpr(hasLHS(hasType(isInteger())),
                                         hasRHS(hasType(isAnyPointer())))
-                         .bind("expr"),
+                         .bind("expr")),
                      this);
 }
 
Index: clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp
@@ -211,7 +211,7 @@
   if (!getLangOpts().CPlusPlus)
     return;
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxMethodDecl(
           isDefinition(), isUserProvided(),
           unless(anyOf(
@@ -226,7 +226,7 @@
               isInsideMacroDefinition(),
               hasCanonicalDecl(isInsideMacroDefinition()))),
           usesThisAsConst())
-          .bind("x"),
+          .bind("x")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp
@@ -119,6 +119,9 @@
 }
 
 void MagicNumbersCheck::check(const MatchFinder::MatchResult &Result) {
+
+  TraversalKindScope RAII(*Result.Context, ast_type_traits::TK_AsIs);
+
   checkBoundMatch<IntegerLiteral>(Result, "integer");
   checkBoundMatch<FloatingLiteral>(Result, "float");
 }
Index: clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -278,7 +278,7 @@
   auto boolXor =
       binaryOperator(hasOperatorName("^"), hasLHS(implicitCastFromBool),
                      hasRHS(implicitCastFromBool));
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(
           anyOf(hasCastKind(CK_IntegralToBoolean),
                 hasCastKind(CK_FloatingToBoolean),
@@ -296,7 +296,7 @@
           anyOf(hasParent(stmt().bind("parentStmt")), anything()),
           unless(isInTemplateInstantiation()),
           unless(hasAncestor(functionTemplateDecl())))
-          .bind("implicitCastToBool"),
+          .bind("implicitCastToBool")),
       this);
 
   auto boolComparison = binaryOperator(
@@ -310,7 +310,7 @@
   auto bitfieldConstruct = cxxConstructorDecl(hasDescendant(cxxCtorInitializer(
       withInitializer(equalsBoundNode("implicitCastFromBool")),
       forField(hasBitWidth(1)))));
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(
           implicitCastFromBool,
           // Exclude comparisons of bools, as they are always cast to integers
@@ -325,12 +325,15 @@
           anyOf(hasParent(implicitCastExpr().bind("furtherImplicitCast")),
                 anything()),
           unless(isInTemplateInstantiation()),
-          unless(hasAncestor(functionTemplateDecl()))),
+          unless(hasAncestor(functionTemplateDecl())))),
       this);
 }
 
 void ImplicitBoolConversionCheck::check(
     const MatchFinder::MatchResult &Result) {
+
+  TraversalKindScope RAII(*Result.Context, ast_type_traits::TK_AsIs);
+
   if (const auto *CastToBool =
           Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastToBool")) {
     const auto *Parent = Result.Nodes.getNodeAs<Stmt>("parentStmt");
Index: clang-tools-extra/clang-tidy/readability/DeleteNullPointerCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/DeleteNullPointerCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/DeleteNullPointerCheck.cpp
@@ -39,14 +39,14 @@
       binaryOperator(hasEitherOperand(castExpr(hasCastKind(CK_NullToPointer))),
                      hasEitherOperand(PointerExpr));
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       ifStmt(hasCondition(anyOf(PointerCondition, BinaryPointerCheckCondition)),
              hasThen(anyOf(
                  DeleteExpr, DeleteMemberExpr,
                  compoundStmt(anyOf(has(DeleteExpr), has(DeleteMemberExpr)),
                               statementCountIs(1))
                      .bind("compound"))))
-          .bind("ifWithDelete"),
+          .bind("ifWithDelete")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
+++ clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp
@@ -61,7 +61,9 @@
       cxxMemberCallExpr(on(expr(anyOf(hasType(ValidContainer),
                                       hasType(pointsTo(ValidContainer)),
                                       hasType(references(ValidContainer))))),
-                        callee(cxxMethodDecl(hasName("size"))), WrongUse,
+                        callee(cxxMethodDecl(hasName("size"))),
+                        traverse(ast_type_traits::TK_AsIs,
+                          cxxMemberCallExpr(WrongUse)),
                         unless(hasAncestor(cxxMethodDecl(
                             ofClass(equalsBoundNode("container"))))))
           .bind("SizeCallExpr"),
@@ -89,6 +91,7 @@
                     expr(hasType(pointsTo(ValidContainer))).bind("Pointee"))),
             expr(hasType(ValidContainer)).bind("STLObject"));
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       cxxOperatorCallExpr(
           anyOf(hasOverloadedOperatorName("=="),
                 hasOverloadedOperatorName("!=")),
@@ -96,7 +99,7 @@
                 allOf(hasArgument(0, STLArg), hasArgument(1, WrongComparend))),
           unless(hasAncestor(
               cxxMethodDecl(ofClass(equalsBoundNode("container"))))))
-          .bind("BinCmp"),
+          .bind("BinCmp")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
@@ -42,10 +42,11 @@
 bool hasLoopStmtAncestor(const DeclRefExpr &DeclRef, const Decl &Decl,
                          ASTContext &Context) {
   auto Matches =
-      match(decl(forEachDescendant(declRefExpr(
+      match(traverse(ast_type_traits::TK_AsIs,
+        decl(forEachDescendant(declRefExpr(
                 equalsNode(&DeclRef),
                 unless(hasAncestor(stmt(anyOf(forStmt(), cxxForRangeStmt(),
-                                              whileStmt(), doStmt()))))))),
+                                              whileStmt(), doStmt())))))))),
             Decl, Context);
   return Matches.empty();
 }
@@ -84,11 +85,11 @@
                        hasDeclaration(namedDecl(
                            matchers::matchesAnyListedName(AllowedTypes))))))),
       decl().bind("param"));
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       functionDecl(hasBody(stmt()), isDefinition(), unless(isImplicit()),
                    unless(cxxMethodDecl(anyOf(isOverride(), isFinal()))),
                    has(typeLoc(forEach(ExpensiveValueParamDecl))),
-                   unless(isInstantiated()), decl().bind("functionDecl")),
+                   unless(isInstantiated()), decl().bind("functionDecl"))),
       this);
 }
 
@@ -96,6 +97,8 @@
   const auto *Param = Result.Nodes.getNodeAs<ParmVarDecl>("param");
   const auto *Function = Result.Nodes.getNodeAs<FunctionDecl>("functionDecl");
 
+  TraversalKindScope RAII(*Result.Context, ast_type_traits::TK_AsIs);
+
   FunctionParmMutationAnalyzer &Analyzer =
       MutationAnalyzers.try_emplace(Function, *Function, *Result.Context)
           .first->second;
Index: clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
+++ clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp
@@ -79,12 +79,14 @@
         .bind("blockStmt");
   };
 
-  Finder->addMatcher(localVarCopiedFrom(anyOf(ConstRefReturningFunctionCall,
-                                              ConstRefReturningMethodCall)),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    localVarCopiedFrom(anyOf(ConstRefReturningFunctionCall,
+                                              ConstRefReturningMethodCall))),
                      this);
 
-  Finder->addMatcher(localVarCopiedFrom(declRefExpr(
-                         to(varDecl(hasLocalStorage()).bind("oldVarDecl")))),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    localVarCopiedFrom(declRefExpr(
+                         to(varDecl(hasLocalStorage()).bind("oldVarDecl"))))),
                      this);
 }
 
@@ -96,6 +98,8 @@
   const auto *BlockStmt = Result.Nodes.getNodeAs<Stmt>("blockStmt");
   const auto *CtorCall = Result.Nodes.getNodeAs<CXXConstructExpr>("ctorCall");
 
+  TraversalKindScope RAII(*Result.Context, ast_type_traits::TK_AsIs);
+
   // Do not propose fixes if the DeclStmt has multiple VarDecls or in macros
   // since we cannot place them correctly.
   bool IssueFix =
Index: clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/NoAutomaticMoveCheck.cpp
@@ -47,13 +47,13 @@
           hasParameter(0, hasType(rValueReferenceType(
                               pointee(type(equalsBoundNode("SrcT")))))))))));
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       returnStmt(
           hasReturnValue(ignoringElidableConstructorCall(ignoringParenImpCasts(
               cxxConstructExpr(hasDeclaration(LValueRefCtor),
                                hasArgument(0, ignoringParenImpCasts(declRefExpr(
                                                   to(ConstLocalVariable)))))
-                  .bind("ctor_call"))))),
+                  .bind("ctor_call")))))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/performance/MoveConstructorInitCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/MoveConstructorInitCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/MoveConstructorInitCheck.cpp
@@ -32,14 +32,14 @@
   if (!getLangOpts().CPlusPlus11)
     return;
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxConstructorDecl(
           unless(isImplicit()), isMoveConstructor(),
           hasAnyConstructorInitializer(
               cxxCtorInitializer(
                   withInitializer(cxxConstructExpr(hasDeclaration(
                       cxxConstructorDecl(isCopyConstructor()).bind("ctor")))))
-                  .bind("move-init"))),
+                  .bind("move-init")))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
@@ -48,13 +48,16 @@
                unless(isInTemplateInstantiation()))
           .bind("call-move");
 
-  Finder->addMatcher(MoveCallMatcher, this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    MoveCallMatcher), this);
 
   auto ConstParamMatcher = forEachArgumentWithParam(
       MoveCallMatcher, parmVarDecl(hasType(references(isConstQualified()))));
 
-  Finder->addMatcher(callExpr(ConstParamMatcher).bind("receiving-expr"), this);
-  Finder->addMatcher(cxxConstructExpr(ConstParamMatcher).bind("receiving-expr"),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    callExpr(ConstParamMatcher).bind("receiving-expr")), this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    cxxConstructExpr(ConstParamMatcher).bind("receiving-expr")),
                      this);
 }
 
Index: clang-tools-extra/clang-tidy/performance/InefficientAlgorithmCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/InefficientAlgorithmCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/InefficientAlgorithmCheck.cpp
@@ -40,7 +40,7 @@
       "::std::unordered_set", "::std::unordered_map",
       "::std::unordered_multiset", "::std::unordered_multimap"));
 
-  const auto Matcher =
+  const auto Matcher = traverse(ast_type_traits::TK_AsIs,
       callExpr(
           callee(functionDecl(Algorithms)),
           hasArgument(
@@ -59,7 +59,7 @@
                          hasDeclaration(equalsBoundNode("IneffContObj"))))))))),
           hasArgument(2, expr().bind("AlgParam")),
           unless(isInTemplateInstantiation()))
-          .bind("IneffAlg");
+          .bind("IneffAlg"));
 
   Finder->addMatcher(Matcher, this);
 }
Index: clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/ImplicitConversionInLoopCheck.cpp
@@ -46,7 +46,7 @@
   // conversion operator, the node is a CXXMemberCallExpr, not a
   // CXXOperatorCallExpr, so it should not get caught by the
   // cxxOperatorCallExpr() matcher.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxForRangeStmt(hasLoopVariable(
           varDecl(
               hasType(qualType(references(qualType(isConstQualified())))),
@@ -56,7 +56,7 @@
                              hasDescendant(unaryOperator(hasOperatorName("*"))
                                                .bind("operator-call"))))
                       .bind("init")))
-              .bind("faulty-var"))),
+              .bind("faulty-var")))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.cpp
@@ -43,14 +43,17 @@
                        hasDeclaration(namedDecl(
                            matchers::matchesAnyListedName(AllowedTypes))))))),
       unless(hasInitializer(expr(hasDescendant(materializeTemporaryExpr())))));
-  Finder->addMatcher(cxxForRangeStmt(hasLoopVariable(LoopVar.bind("loopVar")))
-                         .bind("forRange"),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    cxxForRangeStmt(hasLoopVariable(LoopVar.bind("loopVar")))
+                         .bind("forRange")),
                      this);
 }
 
 void ForRangeCopyCheck::check(const MatchFinder::MatchResult &Result) {
   const auto *Var = Result.Nodes.getNodeAs<VarDecl>("loopVar");
 
+  TraversalKindScope RAII(*Result.Context, ast_type_traits::TK_AsIs);
+
   // Ignore code in macros since we can't place the fixes correctly.
   if (Var->getBeginLoc().isMacroID())
     return;
Index: clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
@@ -477,13 +477,16 @@
   // modernization, it is reasonable to run it on any C++ standard with the
   // assumption the user is trying to modernize their codebase.
   if (getLangOpts().CPlusPlus)
-    Finder->addMatcher(makeCastSequenceMatcher(), this);
+    Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+      makeCastSequenceMatcher()), this);
 }
 
 void UseNullptrCheck::check(const MatchFinder::MatchResult &Result) {
   const auto *NullCast = Result.Nodes.getNodeAs<CastExpr>(CastSequence);
   assert(NullCast && "Bad Callback. No node provided");
 
+  TraversalKindScope RAII(*Result.Context, ast_type_traits::TK_AsIs);
+
   // Given an implicit null-ptr cast or an explicit cast with an implicit
   // null-to-pointer cast within use CastSequenceVisitor to identify sequences
   // of explicit casts that can be converted into 'nullptr'.
Index: clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp
@@ -74,7 +74,7 @@
   for (const auto *Base : BasesToInit) {
     // The initialization of a base class should be a call to a copy
     // constructor of the base.
-    if (match(
+    if (match(traverse(ast_type_traits::TK_AsIs,
             cxxConstructorDecl(forEachConstructorInitializer(cxxCtorInitializer(
                 isBaseInitializer(),
                 withInitializer(cxxConstructExpr(
@@ -82,7 +82,7 @@
                     hasDeclaration(cxxConstructorDecl(isCopyConstructor())),
                     argumentCountIs(1),
                     hasArgument(
-                        0, declRefExpr(to(varDecl(equalsNode(Param)))))))))),
+                        0, declRefExpr(to(varDecl(equalsNode(Param))))))))))),
             *Ctor, *Context)
             .empty())
       return false;
@@ -92,7 +92,7 @@
   for (const auto *Field : FieldsToInit) {
     auto AccessToFieldInParam = accessToFieldInVar(Field, Param);
     // The initialization is a CXXConstructExpr for class types.
-    if (match(
+    if (match(traverse(ast_type_traits::TK_AsIs,
             cxxConstructorDecl(forEachConstructorInitializer(cxxCtorInitializer(
                 isMemberInitializer(), forField(equalsNode(Field)),
                 withInitializer(anyOf(
@@ -101,7 +101,7 @@
                     cxxConstructExpr(
                         hasDeclaration(cxxConstructorDecl(isCopyConstructor())),
                         argumentCountIs(1),
-                        hasArgument(0, AccessToFieldInParam))))))),
+                        hasArgument(0, AccessToFieldInParam)))))))),
             *Ctor, *Context)
             .empty())
       return false;
@@ -130,8 +130,9 @@
   // statement:
   //   return *this;
   if (Compound->body_empty() ||
-      match(returnStmt(has(ignoringParenImpCasts(unaryOperator(
-                hasOperatorName("*"), hasUnaryOperand(cxxThisExpr()))))),
+      match(traverse(ast_type_traits::TK_AsIs,
+        returnStmt(has(ignoringParenImpCasts(unaryOperator(
+                hasOperatorName("*"), hasUnaryOperand(cxxThisExpr())))))),
             *Compound->body_back(), *Context)
           .empty())
     return false;
@@ -145,7 +146,7 @@
     //   ((Base*)this)->operator=((Base)Other);
     //
     // So we are looking for a member call that fulfills:
-    if (match(
+    if (match(traverse(ast_type_traits::TK_AsIs,
             compoundStmt(has(ignoringParenImpCasts(cxxMemberCallExpr(
                 // - The object is an implicit cast of 'this' to a pointer to
                 //   a base class.
@@ -158,7 +159,8 @@
                 // - The argument is (an implicit cast to a Base of) the
                 // argument taken by "Operator".
                 argumentCountIs(1),
-                hasArgument(0, declRefExpr(to(varDecl(equalsNode(Param))))))))),
+                hasArgument(0,
+                  declRefExpr(to(varDecl(equalsNode(Param)))))))))),
             *Compound, *Context)
             .empty())
       return false;
@@ -173,12 +175,12 @@
     auto LHS = memberExpr(hasObjectExpression(cxxThisExpr()),
                           member(fieldDecl(equalsNode(Field))));
     auto RHS = accessToFieldInVar(Field, Param);
-    if (match(
+    if (match(traverse(ast_type_traits::TK_AsIs,
             compoundStmt(has(ignoringParenImpCasts(stmt(anyOf(
                 binaryOperator(hasOperatorName("="), hasLHS(LHS), hasRHS(RHS)),
                 cxxOperatorCallExpr(hasOverloadedOperatorName("="),
                                     argumentCountIs(2), hasArgument(0, LHS),
-                                    hasArgument(1, RHS))))))),
+                                    hasArgument(1, RHS)))))))),
             *Compound, *Context)
             .empty())
       return false;
@@ -212,9 +214,10 @@
     return;
 
   // Destructor.
-  Finder->addMatcher(cxxDestructorDecl(isDefinition()).bind(SpecialFunction),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    cxxDestructorDecl(isDefinition()).bind(SpecialFunction)),
                      this);
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxConstructorDecl(
           isDefinition(),
           anyOf(
@@ -227,16 +230,16 @@
                     // constructor because all the other arguments have
                     // default values.
                     parameterCountIs(1))))
-          .bind(SpecialFunction),
+          .bind(SpecialFunction)),
       this);
   // Copy-assignment operator.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxMethodDecl(isDefinition(), isCopyAssignmentOperator(),
                     // isCopyAssignmentOperator() allows the parameter to be
                     // passed by value, and in this case it cannot be
                     // defaulted.
                     hasParameter(0, hasType(lValueReferenceType())))
-          .bind(SpecialFunction),
+          .bind(SpecialFunction)),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/UseEmplaceCheck.cpp
@@ -112,9 +112,10 @@
       anyOf(has(MakeTuple), has(MakeTupleCtor),
             HasConstructExpr, has(cxxFunctionalCastExpr(HasConstructExpr))));
 
-  Finder->addMatcher(cxxMemberCallExpr(CallPushBack, has(SoughtParam),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    cxxMemberCallExpr(CallPushBack, has(SoughtParam),
                                        unless(isInTemplateInstantiation()))
-                         .bind("call"),
+                         .bind("call")),
                      this);
 }
 
Index: clang-tools-extra/clang-tidy/modernize/UseBoolLiteralsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/UseBoolLiteralsCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/UseBoolLiteralsCheck.cpp
@@ -27,14 +27,16 @@
     return;
 
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(
           has(ignoringParenImpCasts(integerLiteral().bind("literal"))),
           hasImplicitDestinationType(qualType(booleanType())),
           unless(isInTemplateInstantiation()),
-          anyOf(hasParent(explicitCastExpr().bind("cast")), anything())),
+          anyOf(hasParent(explicitCastExpr().bind("cast")), anything()))),
       this);
 
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       conditionalOperator(
           hasParent(implicitCastExpr(
               hasImplicitDestinationType(qualType(booleanType())),
@@ -42,7 +44,8 @@
           eachOf(hasTrueExpression(
                      ignoringParenImpCasts(integerLiteral().bind("literal"))),
                  hasFalseExpression(
-                     ignoringParenImpCasts(integerLiteral().bind("literal"))))),
+                     ignoringParenImpCasts(
+                      integerLiteral().bind("literal")))))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/UseAutoCheck.cpp
@@ -328,7 +328,8 @@
   // Only register the matchers for C++; the functionality currently does not
   // provide any benefit to other languages, despite being benign.
   if (getLangOpts().CPlusPlus) {
-    Finder->addMatcher(makeCombinedMatcher(), this);
+    Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+      makeCombinedMatcher()), this);
   }
 }
 
Index: clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/ShrinkToFitCheck.cpp
@@ -40,7 +40,7 @@
                  unaryOperator(has(ignoringParenImpCasts(declRefExpr(
                      hasDeclaration(equalsBoundNode("ContainerDecl"))))))));
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxMemberCallExpr(
           on(hasType(hasCanonicalType(hasDeclaration(namedDecl(
               hasAnyName("std::basic_string", "std::deque", "std::vector")))))),
@@ -48,7 +48,7 @@
           has(ignoringParenImpCasts(memberExpr(hasDescendant(CopyCtorCall)))),
           hasArgument(0, SwapParam.bind("ContainerToShrink")),
           unless(isInTemplateInstantiation()))
-          .bind("CopyAndSwapTrick"),
+          .bind("CopyAndSwapTrick")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/ReturnBracedInitListCheck.cpp
@@ -34,12 +34,12 @@
   auto CtorAsArgument = materializeTemporaryExpr(anyOf(
       has(ConstructExpr), has(cxxFunctionalCastExpr(has(ConstructExpr)))));
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       functionDecl(isDefinition(), // Declarations don't have return statements.
                    returns(unless(anyOf(builtinType(), autoType()))),
                    hasDescendant(returnStmt(hasReturnValue(
                        has(cxxConstructExpr(has(CtorAsArgument)))))))
-          .bind("fn"),
+          .bind("fn")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp
@@ -33,12 +33,12 @@
   const auto Begin = hasArgument(0, expr());
   const auto End = hasArgument(1, expr());
   const auto RandomFunc = hasArgument(2, expr().bind("randomFunc"));
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       callExpr(anyOf(allOf(Begin, End, argumentCountIs(2)),
                      allOf(Begin, End, RandomFunc, argumentCountIs(3))),
                hasDeclaration(functionDecl(hasName("::std::random_shuffle"))),
                has(implicitCastExpr(has(declRefExpr().bind("name")))))
-          .bind("match"),
+          .bind("match")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp
@@ -99,18 +99,20 @@
   //
   //   std::auto_ptr<int> fn(std::auto_ptr<int>);
   //        ^~~~~~~~~~~~~         ^~~~~~~~~~~~~
-  Finder->addMatcher(typeLoc(loc(qualType(AutoPtrType,
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    typeLoc(loc(qualType(AutoPtrType,
                                           // Skip elaboratedType() as the named
                                           // type will match soon thereafter.
                                           unless(elaboratedType()))))
-                         .bind(AutoPtrTokenId),
+                         .bind(AutoPtrTokenId)),
                      this);
 
   //   using std::auto_ptr;
   //   ^~~~~~~~~~~~~~~~~~~
-  Finder->addMatcher(usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(namedDecl(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(namedDecl(
                                    hasName("auto_ptr"), isFromStdNamespace()))))
-                         .bind(AutoPtrTokenId),
+                         .bind(AutoPtrTokenId)),
                      this);
 
   // Find ownership transfers via copy construction and assignment.
@@ -122,13 +124,14 @@
   auto MovableArgumentMatcher =
       expr(isLValue(), hasType(AutoPtrType)).bind(AutoPtrOwnershipTransferId);
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxOperatorCallExpr(hasOverloadedOperatorName("="),
                           callee(cxxMethodDecl(ofClass(AutoPtrDecl))),
-                          hasArgument(1, MovableArgumentMatcher)),
+                          hasArgument(1, MovableArgumentMatcher))),
       this);
-  Finder->addMatcher(cxxConstructExpr(hasType(AutoPtrType), argumentCountIs(1),
-                                      hasArgument(0, MovableArgumentMatcher)),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    cxxConstructExpr(hasType(AutoPtrType), argumentCountIs(1),
+                                      hasArgument(0, MovableArgumentMatcher))),
                      this);
 }
 
Index: clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
@@ -136,6 +136,7 @@
     return;
 
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       cxxConstructorDecl(
           forEachConstructorInitializer(
               cxxCtorInitializer(
@@ -160,7 +161,7 @@
                           hasDeclContext(
                               cxxRecordDecl(isMoveConstructible())))))))
                   .bind("Initializer")))
-          .bind("Ctor"),
+          .bind("Ctor")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
@@ -85,6 +85,7 @@
       cxxConstructExpr(hasDeclaration(decl(unless(isPublic())))))));
 
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       cxxBindTemporaryExpr(has(ignoringParenImpCasts(
           cxxConstructExpr(
               hasType(getSmartPointerTypeMatcher()), argumentCountIs(1),
@@ -94,16 +95,17 @@
                                      CanCallCtor)
                               .bind(NewExpression)),
               unless(isInTemplateInstantiation()))
-              .bind(ConstructorCall)))),
+              .bind(ConstructorCall))))),
       this);
 
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       cxxMemberCallExpr(
           thisPointerType(getSmartPointerTypeMatcher()),
           callee(cxxMethodDecl(hasName("reset"))),
           hasArgument(0, cxxNewExpr(CanCallCtor).bind(NewExpression)),
           unless(isInTemplateInstantiation()))
-          .bind(ResetCall),
+          .bind(ResetCall)),
       this);
 }
 
@@ -112,6 +114,8 @@
   // pointer, 'make_smart_ptr' refers to 'std::make_shared' or
   // 'std::make_unique' or other function that creates smart_ptr.
 
+  TraversalKindScope RAII(*Result.Context, ast_type_traits::TK_AsIs);
+
   SourceManager &SM = *Result.SourceManager;
   const auto *Construct =
       Result.Nodes.getNodeAs<CXXConstructExpr>(ConstructorCall);
Index: clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
@@ -486,9 +486,12 @@
   if (!getLangOpts().CPlusPlus)
     return;
 
-  Finder->addMatcher(makeArrayLoopMatcher(), this);
-  Finder->addMatcher(makeIteratorLoopMatcher(), this);
-  Finder->addMatcher(makePseudoArrayLoopMatcher(), this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    makeArrayLoopMatcher()), this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    makeIteratorLoopMatcher()), this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    makePseudoArrayLoopMatcher()), this);
 }
 
 /// Given the range of a single declaration, such as:
@@ -810,6 +813,8 @@
   Confidence ConfidenceLevel(Confidence::CL_Safe);
   ASTContext *Context = Result.Context;
 
+  TraversalKindScope RAII(*Context, ast_type_traits::TK_AsIs);
+
   const ForStmt *Loop;
   LoopFixerKind FixerKind;
   RangeDescriptor Descriptor;
Index: clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp
+++ clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp
@@ -696,7 +696,7 @@
       integerLiteral(expandedByMacro(KnownBannedMacroNames));
 
   // Binary with equivalent operands, like (X != 2 && X != 2).
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       binaryOperator(anyOf(hasOperatorName("-"), hasOperatorName("/"),
                            hasOperatorName("%"), hasOperatorName("|"),
                            hasOperatorName("&"), hasOperatorName("^"),
@@ -711,19 +711,20 @@
                      unless(hasEitherOperand(hasType(realFloatingPointType()))),
                      unless(hasLHS(AnyLiteralExpr)),
                      unless(hasDescendant(BannedIntegerLiteral)))
-          .bind("binary"),
+          .bind("binary")),
       this);
 
   // Conditional (trenary) operator with equivalent operands, like (Y ? X : X).
-  Finder->addMatcher(conditionalOperator(expressionsAreEquivalent(),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    conditionalOperator(expressionsAreEquivalent(),
                                          // Filter noisy false positives.
                                          unless(conditionalOperatorIsInMacro()),
                                          unless(isInTemplateInstantiation()))
-                         .bind("cond"),
+                         .bind("cond")),
                      this);
 
   // Overloaded operators with equivalent operands.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxOperatorCallExpr(
           anyOf(
               hasOverloadedOperatorName("-"), hasOverloadedOperatorName("/"),
@@ -737,11 +738,11 @@
           parametersAreEquivalent(),
           // Filter noisy false positives.
           unless(isMacro()), unless(isInTemplateInstantiation()))
-          .bind("call"),
+          .bind("call")),
       this);
 
   // Match expressions like: !(1 | 2 | 3)
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(
           hasImplicitDestinationType(isInteger()),
           has(unaryOperator(
@@ -752,11 +753,11 @@
                                                         hasOperatorName("&"))),
                                    integerLiteral())),
                       hasRHS(integerLiteral())))))
-                  .bind("logical-bitwise-confusion"))),
+                  .bind("logical-bitwise-confusion")))),
       this);
 
   // Match expressions like: (X << 8) & 0xFF
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       binaryOperator(hasOperatorName("&"),
                      hasEitherOperand(ignoringParenImpCasts(binaryOperator(
                          hasOperatorName("<<"),
@@ -764,7 +765,7 @@
                              integerLiteral().bind("shift-const")))))),
                      hasEitherOperand(ignoringParenImpCasts(
                          integerLiteral().bind("and-const"))))
-          .bind("left-right-shift-confusion"),
+          .bind("left-right-shift-confusion")),
       this);
 
   // Match common expressions and apply more checks to find redundant
@@ -779,26 +780,28 @@
   const auto SymRight = matchSymbolicExpr("rhs");
 
   // Match expressions like: x <op> 0xFF == 0xF00.
-  Finder->addMatcher(binaryOperator(isComparisonOperator(),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    binaryOperator(isComparisonOperator(),
                                     hasEitherOperand(BinOpCstLeft),
                                     hasEitherOperand(CstRight))
-                         .bind("binop-const-compare-to-const"),
+                         .bind("binop-const-compare-to-const")),
                      this);
 
   // Match expressions like: x <op> 0xFF == x.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       binaryOperator(isComparisonOperator(),
                      anyOf(allOf(hasLHS(BinOpCstLeft), hasRHS(SymRight)),
                            allOf(hasLHS(SymRight), hasRHS(BinOpCstLeft))))
-          .bind("binop-const-compare-to-sym"),
+          .bind("binop-const-compare-to-sym")),
       this);
 
   // Match expressions like: x <op> 10 == x <op> 12.
-  Finder->addMatcher(binaryOperator(isComparisonOperator(),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    binaryOperator(isComparisonOperator(),
                                     hasLHS(BinOpCstLeft), hasRHS(BinOpCstRight),
                                     // Already reported as redundant.
                                     unless(operandsAreEquivalent()))
-                         .bind("binop-const-compare-to-binop-const"),
+                         .bind("binop-const-compare-to-binop-const")),
                      this);
 
   // Match relational expressions combined with logical operators and find
@@ -808,12 +811,12 @@
   // Match expressions like: x < 2 && x > 2.
   const auto ComparisonLeft = matchRelationalIntegerConstantExpr("lhs");
   const auto ComparisonRight = matchRelationalIntegerConstantExpr("rhs");
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       binaryOperator(anyOf(hasOperatorName("||"), hasOperatorName("&&")),
                      hasLHS(ComparisonLeft), hasRHS(ComparisonRight),
                      // Already reported as redundant.
                      unless(operandsAreEquivalent()))
-          .bind("comparisons-of-symbol-and-const"),
+          .bind("comparisons-of-symbol-and-const")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/llvm/PreferRegisterOverUnsignedCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/llvm/PreferRegisterOverUnsignedCheck.cpp
+++ clang-tools-extra/clang-tidy/llvm/PreferRegisterOverUnsignedCheck.cpp
@@ -20,14 +20,14 @@
   auto RegisterClassMatch = hasType(
       cxxRecordDecl(hasName("::llvm::Register")).bind("registerClassDecl"));
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       valueDecl(allOf(
           hasType(qualType(isUnsignedInteger()).bind("varType")),
           varDecl(hasInitializer(exprWithCleanups(has(implicitCastExpr(has(
                       cxxMemberCallExpr(allOf(on(RegisterClassMatch),
                                               has(memberExpr(hasDeclaration(
                                                   cxxConversionDecl())))))))))))
-              .bind("var"))),
+              .bind("var")))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp
+++ clang-tools-extra/clang-tidy/llvm/PreferIsaOrDynCastInConditionalsCheck.cpp
@@ -54,7 +54,7 @@
                                            cxxMemberCallExpr().bind("arg"))))))
           .bind("rhs");
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       stmt(anyOf(ifStmt(Any), whileStmt(Any), doStmt(Condition),
                  binaryOperator(
                      allOf(unless(isExpansionInFileMatching(
@@ -63,12 +63,15 @@
                            hasLHS(implicitCastExpr().bind("lhs")),
                            hasRHS(anyOf(implicitCastExpr(has(CallExpression)),
                                         CallExpression))))
-                     .bind("and"))),
+                     .bind("and")))),
       this);
 }
 
 void PreferIsaOrDynCastInConditionalsCheck::check(
     const MatchFinder::MatchResult &Result) {
+
+  TraversalKindScope RAII(*Result.Context, ast_type_traits::TK_AsIs);
+
   if (const auto *MatchedDecl = Result.Nodes.getNodeAs<CallExpr>("assign")) {
     SourceLocation StartLoc = MatchedDecl->getCallee()->getExprLoc();
     SourceLocation EndLoc =
Index: clang-tools-extra/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.cpp
+++ clang-tools-extra/clang-tidy/fuchsia/StaticallyConstructedObjectsCheck.cpp
@@ -33,7 +33,7 @@
   if (!getLangOpts().CPlusPlus11)
     return;
 
-  Finder->addMatcher(varDecl(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs, varDecl(
                          // Match global, statically stored objects...
                          isGlobalStatic(),
                          // ... that have C++ constructors...
@@ -42,7 +42,7 @@
                              hasDeclaration(cxxConstructorDecl(isConstexpr())),
                              // ... and is statically initialized.
                              isConstantInitializer())))))
-                         .bind("decl"),
+                         .bind("decl")),
                      this);
 }
 
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/SlicingCheck.cpp
@@ -62,8 +62,8 @@
       // constructor in DerivedDecl's constructors.
       unless(IsWithinDerivedCtor));
 
-  Finder->addMatcher(
-      expr(anyOf(SlicesObjectInAssignment, SlicesObjectInCtor)).bind("Call"),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+      expr(anyOf(SlicesObjectInAssignment, SlicesObjectInCtor)).bind("Call")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp
@@ -56,13 +56,13 @@
   // 1) just before array subscription
   // 2) inside a range-for over an array
   // 3) if it converts a string literal to a pointer
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(
           unless(hasParent(arraySubscriptExpr())),
           unless(hasParentIgnoringImpCasts(explicitCastExpr())),
           unless(isInsideOfRangeBeginEndStmt()),
           unless(hasSourceExpression(ignoringParens(stringLiteral()))))
-          .bind("cast"),
+          .bind("cast")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/OwningMemoryCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/OwningMemoryCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/OwningMemoryCheck.cpp
@@ -71,11 +71,11 @@
   const auto ConsideredOwner = eachOf(IsOwnerType, CreatesOwner);
 
   // Find delete expressions that delete non-owners.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxDeleteExpr(
           hasDescendant(
               declRefExpr(unless(ConsideredOwner)).bind("deleted_variable")))
-          .bind("delete_expr"),
+          .bind("delete_expr")),
       this);
 
   // Ignoring the implicit casts is vital because the legacy owners do not work
@@ -85,25 +85,26 @@
   // Furthermore, legacy owner functions are assumed to use raw pointers for
   // resources. This check assumes that all pointer arguments of a legacy
   // functions shall be 'gsl::owner<>'.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       callExpr(callee(LegacyOwnerConsumers),
                hasAnyArgument(expr(unless(ignoringImpCasts(ConsideredOwner)),
                                    hasType(pointerType()))))
-          .bind("legacy_consumer"),
+          .bind("legacy_consumer")),
       this);
 
   // Matching assignment to owners, with the rhs not being an owner nor creating
   // one.
-  Finder->addMatcher(binaryOperator(matchers::isAssignmentOperator(),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    binaryOperator(matchers::isAssignmentOperator(),
                                     hasLHS(IsOwnerType),
                                     hasRHS(unless(ConsideredOwner)))
-                         .bind("owner_assignment"),
+                         .bind("owner_assignment")),
                      this);
 
   // Matching initialization of owners with non-owners, nor creating owners.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       namedDecl(varDecl(hasInitializer(unless(ConsideredOwner)), IsOwnerType)
-                    .bind("owner_initialization")),
+                    .bind("owner_initialization"))),
       this);
 
   const auto HasConstructorInitializerForOwner =
@@ -118,59 +119,62 @@
 
   // Match class member initialization that expects owners, but does not get
   // them.
-  Finder->addMatcher(cxxRecordDecl(HasConstructorInitializerForOwner), this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    cxxRecordDecl(HasConstructorInitializerForOwner)), this);
 
   // Matching on assignment operations where the RHS is a newly created owner,
   // but the LHS is not an owner.
-  Finder->addMatcher(binaryOperator(matchers::isAssignmentOperator(),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    binaryOperator(matchers::isAssignmentOperator(),
                                     hasLHS(unless(IsOwnerType)),
                                     hasRHS(CreatesOwner))
-                         .bind("bad_owner_creation_assignment"),
+                         .bind("bad_owner_creation_assignment")),
                      this);
 
   // Matching on initialization operations where the initial value is a newly
   // created owner, but the LHS is not an owner.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       namedDecl(varDecl(eachOf(allOf(hasInitializer(CreatesOwner),
                                      unless(IsOwnerType)),
                                allOf(hasInitializer(ConsideredOwner),
                                      hasType(autoType().bind("deduced_type")))))
-                    .bind("bad_owner_creation_variable")),
+                    .bind("bad_owner_creation_variable"))),
       this);
 
   // Match on all function calls that expect owners as arguments, but didn't
   // get them.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       callExpr(forEachArgumentWithParam(
           expr(unless(ConsideredOwner)).bind("expected_owner_argument"),
-          parmVarDecl(IsOwnerType))),
+          parmVarDecl(IsOwnerType)))),
       this);
 
   // Matching for function calls where one argument is a created owner, but the
   // parameter type is not an owner.
-  Finder->addMatcher(callExpr(forEachArgumentWithParam(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    callExpr(forEachArgumentWithParam(
                          expr(CreatesOwner).bind("bad_owner_creation_argument"),
                          parmVarDecl(unless(IsOwnerType))
-                             .bind("bad_owner_creation_parameter"))),
+                             .bind("bad_owner_creation_parameter")))),
                      this);
 
   // Matching on functions, that return an owner/resource, but don't declare
   // their return type as owner.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       functionDecl(hasDescendant(returnStmt(hasReturnValue(ConsideredOwner))
                                      .bind("bad_owner_return")),
                    unless(returns(qualType(hasDeclaration(OwnerDecl)))))
-          .bind("function_decl"),
+          .bind("function_decl")),
       this);
 
   // Match on classes that have an owner as member, but don't declare a
   // destructor to properly release the owner.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxRecordDecl(
           has(fieldDecl(IsOwnerType).bind("undestructed_owner_member")),
           anyOf(unless(has(cxxDestructorDecl())),
                 has(cxxDestructorDecl(anyOf(isDefaulted(), isDeleted())))))
-          .bind("non_destructor_class"),
+          .bind("non_destructor_class")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp
@@ -39,17 +39,19 @@
   //   i = 0.5;
   //   void f(int); f(0.5);
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(hasImplicitDestinationType(builtinType()),
                        hasSourceExpression(hasType(builtinType())),
                        unless(hasSourceExpression(IsCeilFloorCallExpr)),
                        unless(hasParent(castExpr())),
                        unless(isInTemplateInstantiation()))
-          .bind("cast"),
+          .bind("cast")),
       this);
 
   // Binary operators:
   //   i += 0.5;
-  Finder->addMatcher(binaryOperator(isAssignmentOperator(),
+  Finder->addMatcher(
+    binaryOperator(isAssignmentOperator(),
                                     hasLHS(expr(hasType(builtinType()))),
                                     hasRHS(expr(hasType(builtinType()))),
                                     unless(hasRHS(IsCeilFloorCallExpr)),
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/InterfacesGlobalInitCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/InterfacesGlobalInitCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/InterfacesGlobalInitCheck.cpp
@@ -27,10 +27,10 @@
   const auto ReferencesUndefinedGlobalVar = declRefExpr(hasDeclaration(
       varDecl(GlobalVarDecl, unless(isDefinition())).bind("referencee")));
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       varDecl(GlobalVarDecl, isDefinition(),
               hasInitializer(expr(hasDescendant(ReferencesUndefinedGlobalVar))))
-          .bind("var"),
+          .bind("var")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/cert/ThrownExceptionTypeCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cert/ThrownExceptionTypeCheck.cpp
+++ clang-tools-extra/clang-tidy/cert/ThrownExceptionTypeCheck.cpp
@@ -21,11 +21,11 @@
   if (!getLangOpts().CPlusPlus)
     return;
 
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxThrowExpr(has(ignoringParenImpCasts(
           cxxConstructExpr(hasDeclaration(cxxConstructorDecl(
                                isCopyConstructor(), unless(isNoThrow()))))
-              .bind("expr")))),
+              .bind("expr"))))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/cert/StaticObjectExceptionCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cert/StaticObjectExceptionCheck.cpp
+++ clang-tools-extra/clang-tidy/cert/StaticObjectExceptionCheck.cpp
@@ -23,7 +23,7 @@
 
   // Match any static or thread_local variable declaration that has an
   // initializer that can throw.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       varDecl(anyOf(hasThreadStorageDuration(), hasStaticStorageDuration()),
               unless(anyOf(isConstexpr(), hasType(cxxRecordDecl(isLambda())),
                            hasAncestor(functionDecl()))),
@@ -33,7 +33,7 @@
                         functionDecl(unless(isNoThrow())).bind("func")))),
                     hasDescendant(callExpr(hasDeclaration(
                         functionDecl(unless(isNoThrow())).bind("func"))))))
-          .bind("var"),
+          .bind("var")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/cert/ProperlySeededRandomGeneratorCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cert/ProperlySeededRandomGeneratorCheck.cpp
+++ clang-tools-extra/clang-tidy/cert/ProperlySeededRandomGeneratorCheck.cpp
@@ -61,8 +61,8 @@
   // const int x = 1;
   // std::mt19937 engine(x);
   //              ^
-  Finder->addMatcher(
-      cxxConstructExpr(RandomGeneratorEngineTypeMatcher).bind("ctor"), this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+      cxxConstructExpr(RandomGeneratorEngineTypeMatcher).bind("ctor")), this);
 
   // srand();
   // ^
Index: clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.cpp
+++ clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.cpp
@@ -56,11 +56,11 @@
                         callee(IsSelfMutatingMemberFunction))
           .bind(MutatingCallName);
 
-  const auto MutatesSource = allOf(
+  const auto MutatesSource = traverse(ast_type_traits::TK_AsIs, allOf(
       hasParameter(
           0, parmVarDecl(hasType(lValueReferenceType())).bind(SourceDeclName)),
       anyOf(forEachDescendant(IsSourceMutatingAssignment),
-            forEachDescendant(IsSourceMutatingMemberCall)));
+            forEachDescendant(IsSourceMutatingMemberCall))));
 
   Finder->addMatcher(cxxConstructorDecl(isCopyConstructor(), MutatesSource),
                      this);
Index: clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp
@@ -253,7 +253,8 @@
                                       unless(inDecltypeOrTemplateArg()))
                               .bind("declref");
 
-    addDeclRefs(match(findAll(DeclRefMatcher), *S->getStmt(), *Context));
+    addDeclRefs(match(traverse(ast_type_traits::TK_AsIs,
+      findAll(DeclRefMatcher)), *S->getStmt(), *Context));
     addDeclRefs(match(
         findAll(cxxOperatorCallExpr(anyOf(hasOverloadedOperatorName("*"),
                                           hasOverloadedOperatorName("->"),
@@ -320,7 +321,7 @@
                // Passing variable to a function as a non-const lvalue reference
                // (unless that function is std::move()).
                callExpr(forEachArgumentWithParam(
-                            DeclRefMatcher,
+                            traverse(ast_type_traits::TK_AsIs, DeclRefMatcher),
                             unless(parmVarDecl(hasType(
                                 references(qualType(isConstQualified())))))),
                         unless(callee(functionDecl(hasName("::std::move")))))))
@@ -386,6 +387,7 @@
           .bind("call-move");
 
   Finder->addMatcher(
+      traverse(ast_type_traits::TK_AsIs,
       // To find the Stmt that we assume performs the actual move, we look for
       // the direct ancestor of the std::move() that isn't one of the node
       // types ignored by ignoringParenImpCasts().
@@ -398,11 +400,12 @@
            // different code locations for the same move.
            unless(initListExpr()),
            unless(expr(ignoringParenImpCasts(equalsBoundNode("call-move")))))
-          .bind("moving-call"),
+          .bind("moving-call")),
       this);
 }
 
 void UseAfterMoveCheck::check(const MatchFinder::MatchResult &Result) {
+
   const auto *ContainingLambda =
       Result.Nodes.getNodeAs<LambdaExpr>("containing-lambda");
   const auto *ContainingFunc =
Index: clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/UnusedRaiiCheck.cpp
@@ -36,13 +36,14 @@
       cxxBindTemporaryExpr(unless(has(ignoringParenImpCasts(callExpr()))))
           .bind("temp");
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       exprWithCleanups(unless(isInTemplateInstantiation()),
                        hasParent(compoundStmt().bind("compound")),
                        hasType(cxxRecordDecl(hasNonTrivialDestructor())),
                        anyOf(has(ignoringParenImpCasts(BindTemp)),
                              has(ignoringParenImpCasts(cxxFunctionalCastExpr(
                                  has(ignoringParenImpCasts(BindTemp)))))))
-          .bind("expr"),
+          .bind("expr")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp
@@ -50,10 +50,15 @@
   // Both copy-and-swap and copy-and-move method creates a copy first and
   // assign it to 'this' with swap or move.
   // In the non-template case, we can search for the copy constructor call.
-  const auto HasNonTemplateSelfCopy = cxxMethodDecl(
-      ofClass(cxxRecordDecl(unless(hasAncestor(classTemplateDecl())))),
-      hasDescendant(cxxConstructExpr(hasDeclaration(cxxConstructorDecl(
-          isCopyConstructor(), ofClass(equalsBoundNode("class")))))));
+  const auto HasNonTemplateSelfCopy = traverse(ast_type_traits::TK_AsIs,
+      cxxMethodDecl(
+        ofClass(cxxRecordDecl(unless(hasAncestor(classTemplateDecl())))),
+        hasDescendant(cxxConstructExpr(hasDeclaration(cxxConstructorDecl(
+          isCopyConstructor(),
+          ofClass(equalsBoundNode("class"))
+          ))))
+        )
+      );
 
   // In the template case, we need to handle two separate cases: 1) a local
   // variable is created with the copy, 2) copy is created only as a temporary
@@ -96,7 +101,7 @@
                                    HasReferenceParam, HasNoSelfCheck,
                                    unless(HasNonTemplateSelfCopy),
                                    unless(HasTemplateSelfCopy),
-                                   HasNoNestedSelfAssign, AdditionalMatcher)
+                                   HasNoNestedSelfAssign, AdditionalMatcher )
                          .bind("copyAssignmentOperator"),
                      this);
 }
Index: clang-tools-extra/clang-tidy/bugprone/UndelegatedConstructorCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/UndelegatedConstructorCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/UndelegatedConstructorCheck.cpp
@@ -60,6 +60,7 @@
     return;
 
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       compoundStmt(
           hasParent(
               cxxConstructorDecl(ofClass(cxxRecordDecl().bind("parent")))),
@@ -67,7 +68,7 @@
               cxxConstructExpr(hasDeclaration(cxxConstructorDecl(ofClass(
                                    cxxRecordDecl(baseOfBoundNode("parent"))))))
                   .bind("construct"))),
-          unless(isInTemplateInstantiation())),
+          unless(isInTemplateInstantiation()))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/bugprone/TooSmallLoopVariableCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/TooSmallLoopVariableCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/TooSmallLoopVariableCheck.cpp
@@ -59,9 +59,10 @@
 
   // We need to catch only those comparisons which contain any integer cast.
   StatementMatcher LoopVarConversionMatcher =
+    traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(hasImplicitDestinationType(isInteger()),
                        has(ignoringParenImpCasts(LoopVarMatcher)))
-          .bind(LoopVarCastName);
+          .bind(LoopVarCastName));
 
   // We are interested in only those cases when the loop bound is a variable
   // value (not const, enum, etc.).
Index: clang-tools-extra/clang-tidy/bugprone/SuspiciousStringCompareCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/SuspiciousStringCompareCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/SuspiciousStringCompareCheck.cpp
@@ -135,10 +135,10 @@
   }
 
   // Detect suspicious cast to an inconsistant type (i.e. not integer type).
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(unless(hasType(isInteger())),
                        hasSourceExpression(StringCompareCallExpr))
-          .bind("invalid-conversion"),
+          .bind("invalid-conversion")),
       this);
 
   // Detect suspicious operator with string compare function as operand.
Index: clang-tools-extra/clang-tidy/bugprone/SuspiciousMissingCommaCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/SuspiciousMissingCommaCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/SuspiciousMissingCommaCheck.cpp
@@ -89,7 +89,8 @@
       initListExpr(hasType(constantArrayType()),
                    has(ignoringParenImpCasts(expr(ConcatenatedStringLiteral))));
 
-  Finder->addMatcher(StringsInitializerList.bind("list"), this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    StringsInitializerList.bind("list")), this);
 }
 
 void SuspiciousMissingCommaCheck::check(
Index: clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
@@ -67,13 +67,13 @@
   const auto AssignmentOperatorExpr = expr(binaryOperator(
       hasOperatorName("="), hasLHS(hasType(IntegerType)), hasRHS(CastExpr)));
 
-  Finder->addMatcher(AssignmentOperatorExpr, this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs, AssignmentOperatorExpr), this);
 
   // Catch declarations with the suspicious type conversion.
   const auto Declaration =
       varDecl(isDefinition(), hasType(IntegerType), hasInitializer(CastExpr));
 
-  Finder->addMatcher(Declaration, this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs, Declaration), this);
 }
 
 void SignedCharMisuseCheck::check(const MatchFinder::MatchResult &Result) {
Index: clang-tools-extra/clang-tidy/bugprone/ParentVirtualCallCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/ParentVirtualCallCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/ParentVirtualCallCheck.cpp
@@ -83,6 +83,7 @@
 
 void ParentVirtualCallCheck::registerMatchers(MatchFinder *Finder) {
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       cxxMemberCallExpr(
           callee(memberExpr(hasDescendant(implicitCastExpr(
                                 hasImplicitDestinationType(pointsTo(
@@ -90,7 +91,7 @@
                                 hasSourceExpression(cxxThisExpr(hasType(
                                     type(anything()).bind("thisType")))))))
                      .bind("member")),
-          callee(cxxMethodDecl(isVirtual()))),
+          callee(cxxMethodDecl(isVirtual())))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/bugprone/MisplacedWideningCastCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/MisplacedWideningCastCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/MisplacedWideningCastCheck.cpp
@@ -41,7 +41,8 @@
   const auto ImplicitCast =
       implicitCastExpr(hasImplicitDestinationType(isInteger()),
                        has(ignoringParenImpCasts(Calc)));
-  const auto Cast = expr(anyOf(ExplicitCast, ImplicitCast)).bind("Cast");
+  const auto Cast = traverse(ast_type_traits::TK_AsIs,
+    expr(anyOf(ExplicitCast, ImplicitCast)).bind("Cast"));
 
   Finder->addMatcher(varDecl(hasInitializer(Cast)), this);
   Finder->addMatcher(returnStmt(hasReturnValue(Cast)), this);
Index: clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/MisplacedOperatorInStrlenInAllocCheck.cpp
@@ -57,16 +57,18 @@
               hasInitializer(ignoringParenImpCasts(
                   declRefExpr(hasDeclaration(Alloc1Func)))));
 
-  Finder->addMatcher(callExpr(callee(decl(anyOf(Alloc0Func, Alloc0FuncPtr))),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    callExpr(callee(decl(anyOf(Alloc0Func, Alloc0FuncPtr))),
                               hasArgument(0, BadArg))
-                         .bind("Alloc"),
+                         .bind("Alloc")),
                      this);
-  Finder->addMatcher(callExpr(callee(decl(anyOf(Alloc1Func, Alloc1FuncPtr))),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    callExpr(callee(decl(anyOf(Alloc1Func, Alloc1FuncPtr))),
                               hasArgument(1, BadArg))
-                         .bind("Alloc"),
+                         .bind("Alloc")),
                      this);
-  Finder->addMatcher(
-      cxxNewExpr(isArray(), hasArraySize(BadArg)).bind("Alloc"), this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+      cxxNewExpr(isArray(), hasArraySize(BadArg)).bind("Alloc")), this);
 }
 
 void MisplacedOperatorInStrlenInAllocCheck::check(
Index: clang-tools-extra/clang-tidy/bugprone/IntegerDivisionCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/IntegerDivisionCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/IntegerDivisionCheck.cpp
@@ -34,6 +34,7 @@
             callExpr(IntType), explicitCastExpr(IntType), UnaryOperators);
 
   Finder->addMatcher(
+      traverse(ast_type_traits::TK_AsIs,
       binaryOperator(
           hasOperatorName("/"), hasLHS(expr(IntType)), hasRHS(expr(IntType)),
           hasAncestor(
@@ -41,7 +42,7 @@
           unless(hasAncestor(
               expr(Exceptions,
                    hasAncestor(castExpr(equalsBoundNode("FloatCast")))))))
-          .bind("IntDiv"),
+          .bind("IntDiv")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/bugprone/IncorrectRoundingsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/IncorrectRoundingsCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/IncorrectRoundingsCheck.cpp
@@ -51,10 +51,11 @@
   // Find expressions of cast to int of the sum of a floating point expression
   // and 0.5.
   MatchFinder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(
           hasImplicitDestinationType(isInteger()),
           ignoringParenCasts(binaryOperator(hasOperatorName("+"), OneSideHalf)))
-          .bind("CastExpr"),
+          .bind("CastExpr")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/bugprone/InaccurateEraseCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/InaccurateEraseCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/InaccurateEraseCheck.cpp
@@ -36,14 +36,14 @@
 
   const auto DeclInStd = type(hasUnqualifiedDesugaredType(
       tagType(hasDeclaration(decl(isInStdNamespace())))));
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxMemberCallExpr(
           on(anyOf(hasType(DeclInStd), hasType(pointsTo(DeclInStd)))),
           callee(cxxMethodDecl(hasName("erase"))), argumentCountIs(1),
           hasArgument(0, has(ignoringImplicit(
                              anyOf(EndCall, has(ignoringImplicit(EndCall)))))),
           unless(isInTemplateInstantiation()))
-          .bind("erase"),
+          .bind("erase")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp
@@ -117,29 +117,33 @@
 
   // Find 'Handle foo = ReturnsAValue();'
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       varDecl(
           hasType(hasUnqualifiedDesugaredType(
               recordType(hasDeclaration(cxxRecordDecl(IsAHandle))))),
           unless(parmVarDecl()),
           hasInitializer(exprWithCleanups(has(ignoringParenImpCasts(handleFrom(
                                               IsAHandle, ConvertedHandle))))
-                             .bind("bad_stmt"))),
+                             .bind("bad_stmt")))),
       this);
   // Find 'foo = ReturnsAValue();  // foo is Handle'
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       cxxOperatorCallExpr(callee(cxxMethodDecl(ofClass(IsAHandle))),
                           hasOverloadedOperatorName("="),
                           hasArgument(1, ConvertedHandle))
-          .bind("bad_stmt"),
+          .bind("bad_stmt")),
       this);
 
   // Container insertions that will dangle.
-  Finder->addMatcher(makeContainerMatcher(IsAHandle).bind("bad_stmt"), this);
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    makeContainerMatcher(IsAHandle).bind("bad_stmt")), this);
 }
 
 void DanglingHandleCheck::registerMatchersForReturn(MatchFinder *Finder) {
   // Return a local.
   Finder->addMatcher(
+    traverse(ast_type_traits::TK_AsIs,
       returnStmt(
           // The AST contains two constructor calls:
           //   1. Value to Handle conversion.
@@ -158,14 +162,14 @@
                                            unless(IsAHandle)))))))))))))),
           // Temporary fix for false positives inside lambdas.
           unless(hasAncestor(lambdaExpr())))
-          .bind("bad_stmt"),
+          .bind("bad_stmt")),
       this);
 
   // Return a temporary.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       returnStmt(has(exprWithCleanups(has(ignoringParenImpCasts(handleFrom(
                      IsAHandle, handleFromTemporaryValue(IsAHandle)))))))
-          .bind("bad_stmt"),
+          .bind("bad_stmt")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/bugprone/BoolPointerImplicitConversionCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/BoolPointerImplicitConversionCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/BoolPointerImplicitConversionCheck.cpp
@@ -18,6 +18,7 @@
   // Look for ifs that have an implicit bool* to bool conversion in the
   // condition. Filter negations.
   Finder->addMatcher(
+      traverse(ast_type_traits::TK_AsIs,
       ifStmt(hasCondition(findAll(implicitCastExpr(
                  unless(hasParent(unaryOperator(hasOperatorName("!")))),
                  hasSourceExpression(
@@ -25,7 +26,7 @@
                           ignoringParenImpCasts(declRefExpr().bind("expr")))),
                  hasCastKind(CK_PointerToBoolean)))),
              unless(isInTemplateInstantiation()))
-          .bind("if"),
+          .bind("if")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
@@ -84,7 +84,8 @@
 
 void AssertSideEffectCheck::registerMatchers(MatchFinder *Finder) {
   auto DescendantWithSideEffect =
-      hasDescendant(expr(hasSideEffect(CheckFunctionCalls)));
+      traverse(ast_type_traits::TK_AsIs,
+        hasDescendant(expr(hasSideEffect(CheckFunctionCalls))));
   auto ConditionWithSideEffect = hasCondition(DescendantWithSideEffect);
   Finder->addMatcher(
       stmt(
Index: clang-tools-extra/clang-tidy/abseil/UpgradeDurationConversionsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/abseil/UpgradeDurationConversionsCheck.cpp
+++ clang-tools-extra/clang-tidy/abseil/UpgradeDurationConversionsCheck.cpp
@@ -102,6 +102,7 @@
   //   `absl::Hours(x)`
   // where `x` is not of a built-in type.
   Finder->addMatcher(
+      traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(
           anyOf(hasCastKind(CK_UserDefinedConversion),
                 has(implicitCastExpr(hasCastKind(CK_UserDefinedConversion)))),
@@ -109,7 +110,7 @@
               callee(functionDecl(DurationFactoryFunction(),
                                   unless(hasParent(functionTemplateDecl())))),
               hasArgument(0, expr().bind("arg")))))
-          .bind("OuterExpr"),
+          .bind("OuterExpr")),
       this);
 }
 
@@ -119,6 +120,8 @@
       "implicit conversion to 'int64_t' is deprecated in this context; use an "
       "explicit cast instead";
 
+  TraversalKindScope RAII(*Result.Context, ast_type_traits::TK_AsIs);
+
   const auto *ArgExpr = Result.Nodes.getNodeAs<Expr>("arg");
   SourceLocation Loc = ArgExpr->getBeginLoc();
 
Index: clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.cpp
+++ clang-tools-extra/clang-tidy/abseil/StrCatAppendCheck.cpp
@@ -45,8 +45,8 @@
   if (!getLangOpts().CPlusPlus)
   	return;
   const auto StrCat = functionDecl(hasName("::absl::StrCat"));
-  // The arguments of absl::StrCat are implicitly converted to AlphaNum. This 
-  // matches to the arguments because of that behavior. 
+  // The arguments of absl::StrCat are implicitly converted to AlphaNum. This
+  // matches to the arguments because of that behavior.
   const auto AlphaNum = IgnoringTemporaries(cxxConstructExpr(
       argumentCountIs(1), hasType(cxxRecordDecl(hasName("::absl::AlphaNum"))),
       hasArgument(0, ignoringImpCasts(declRefExpr(to(equalsBoundNode("LHS")),
@@ -59,7 +59,7 @@
   // Now look for calls to operator= with an object on the LHS and a call to
   // StrCat on the RHS. The first argument of the StrCat call should be the same
   // as the LHS. Ignore calls from template instantiations.
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       cxxOperatorCallExpr(
           unless(isInTemplateInstantiation()), hasOverloadedOperatorName("="),
           hasArgument(0, declRefExpr(to(decl().bind("LHS")))),
@@ -67,7 +67,7 @@
                              callExpr(callee(StrCat), hasArgument(0, AlphaNum),
                                       unless(HasAnotherReferenceToLhs))
                                  .bind("Call"))))
-          .bind("Op"),
+          .bind("Op")),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp
+++ clang-tools-extra/clang-tidy/abseil/RedundantStrcatCallsCheck.cpp
@@ -68,9 +68,9 @@
       has(callExpr(callee(functionDecl(*Strcat))).bind("StrCat")));
   if (const auto* SubStrcatCall = selectFirst<const CallExpr>(
           "StrCat",
-          match(stmt(anyOf(
+          match(stmt(traverse(ast_type_traits::TK_AsIs, anyOf(
                     cxxConstructExpr(IsAlphanum, hasArgument(0, IsStrcat)),
-                    IsStrcat)),
+                    IsStrcat))),
                 *Arg->IgnoreParenImpCasts(), *Result.Context))) {
     RemoveCallLeaveArgs(SubStrcatCall, CheckResult);
     return SubStrcatCall;
Index: clang-tools-extra/clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp
+++ clang-tools-extra/clang-tidy/abseil/FasterStrsplitDelimiterCheck.cpp
@@ -81,20 +81,21 @@
 
   // Find uses of absl::StrSplit(..., "x") and absl::StrSplit(...,
   // absl::ByAnyChar("x")) to transform them into absl::StrSplit(..., 'x').
-  Finder->addMatcher(callExpr(callee(functionDecl(hasName("::absl::StrSplit"))),
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
+    callExpr(callee(functionDecl(hasName("::absl::StrSplit"))),
                               hasArgument(1, anyOf(ByAnyCharArg, SingleChar)),
                               unless(isInTemplateInstantiation()))
-                         .bind("StrSplit"),
+                         .bind("StrSplit")),
                      this);
 
   // Find uses of absl::MaxSplits("x", N) and
   // absl::MaxSplits(absl::ByAnyChar("x"), N) to transform them into
   // absl::MaxSplits('x', N).
-  Finder->addMatcher(
+  Finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       callExpr(
           callee(functionDecl(hasName("::absl::MaxSplits"))),
           hasArgument(0, anyOf(ByAnyCharArg, ignoringParenCasts(SingleChar))),
-          unless(isInTemplateInstantiation())),
+          unless(isInTemplateInstantiation()))),
       this);
 }
 
Index: clang-tools-extra/clang-tidy/abseil/DurationDivisionCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/abseil/DurationDivisionCheck.cpp
+++ clang-tools-extra/clang-tidy/abseil/DurationDivisionCheck.cpp
@@ -22,7 +22,7 @@
 
   const auto DurationExpr =
       expr(hasType(cxxRecordDecl(hasName("::absl::Duration"))));
-  finder->addMatcher(
+  finder->addMatcher(traverse(ast_type_traits::TK_AsIs,
       implicitCastExpr(
           hasSourceExpression(ignoringParenCasts(
               cxxOperatorCallExpr(hasOverloadedOperatorName("/"),
@@ -32,7 +32,7 @@
           hasImplicitDestinationType(qualType(unless(isInteger()))),
           unless(hasParent(cxxStaticCastExpr())),
           unless(hasParent(cStyleCastExpr())),
-          unless(isInTemplateInstantiation())),
+          unless(isInTemplateInstantiation()))),
       this);
 }
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to