release/22.x: Backport workarounds for certain addMatcher overloads ignoring traversal kind
diff --git a/clang-tools-extra/clang-tidy/modernize/TypeTraitsCheck.cpp b/clang-tools-extra/clang-tidy/modernize/TypeTraitsCheck.cpp
index 0d03006..eadd3f1 100644
--- a/clang-tools-extra/clang-tidy/modernize/TypeTraitsCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/TypeTraitsCheck.cpp
@@ -195,7 +195,9 @@
                            .bind(Bind),
                        this);
   }
-  Finder->addMatcher(typeLoc(isType()).bind(Bind), this);
+  Finder->addMatcher(
+      traverse(TK_IgnoreUnlessSpelledInSource, typeLoc(isType()).bind(Bind)),
+      this);
 }
 
 static bool isNamedDeclInStdTraitsSet(const NamedDecl *ND,
diff --git a/clang-tools-extra/clang-tidy/readability/RedundantTypenameCheck.cpp b/clang-tools-extra/clang-tidy/readability/RedundantTypenameCheck.cpp
index 01f9177..525725c 100644
--- a/clang-tools-extra/clang-tidy/readability/RedundantTypenameCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/RedundantTypenameCheck.cpp
@@ -19,7 +19,7 @@
 
 void RedundantTypenameCheck::registerMatchers(MatchFinder *Finder) {
   Finder->addMatcher(
-      typeLoc(unless(hasAncestor(decl(isInstantiated())))).bind("typeLoc"),
+      traverse(TK_IgnoreUnlessSpelledInSource, typeLoc().bind("typeLoc")),
       this);
 
   if (!getLangOpts().CPlusPlus20)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/type-traits.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/type-traits.cpp
index e5de9e3..2b2c8e9 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/type-traits.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/type-traits.cpp
@@ -150,3 +150,17 @@
 const ImplicitlyInstantiatedConstructor<int> ImplicitInstantiation(std::remove_reference<int>::type(123));
 // CHECK-MESSAGES: :[[@LINE-1]]:68: warning: use c++14 style type templates
 // CHECK-FIXES: const ImplicitlyInstantiatedConstructor<int> ImplicitInstantiation(std::remove_reference_t<int>(123));
+
+#if __cplusplus >= 202002L
+
+template <typename T>
+struct S {
+  typename std::remove_reference<T>::type a; // NOLINT
+};
+
+void f() {
+  auto [a] = S<int>{};
+  [&] { a; }; // This used to cause a false positive.
+}
+
+#endif // __cplusplus >= 202002L