[clang-tools-extra] 4d259de - [clang-tidy] Add `IgnoreAliasing` option to `readability-qualified-auto check` (#147060)

via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 28 08:20:06 PDT 2025


Author: Juan Besa
Date: 2025-07-28T18:20:02+03:00
New Revision: 4d259de2ae88fb022acc722dedd60260a870eb8b

URL: https://github.com/llvm/llvm-project/commit/4d259de2ae88fb022acc722dedd60260a870eb8b
DIFF: https://github.com/llvm/llvm-project/commit/4d259de2ae88fb022acc722dedd60260a870eb8b.diff

LOG: [clang-tidy] Add `IgnoreAliasing` option to `readability-qualified-auto check` (#147060)

`readability-qualified-auto` check currently looks at the unsugared
type, skipping any typedefs, to determine if the variable is a
pointer-type. This may not be the desired behaviour, in particular when
the type depends on compilation flags.
For example

```
 #if CONDITION
      using Handler = int *;
  #else
      using Handler = uint64_t;
  #endif
```

A more common example is some implementations of `std::array` use
pointers as iterators.

This introduces the IgnoreAliasing option so that
`readability-qualified-auto` does not look beyond typedefs.

---------

Co-authored-by: juanbesa <juanbesa at devvm33299.lla0.facebook.com>
Co-authored-by: Kazu Hirata <kazu at google.com>
Co-authored-by: EugeneZelenko <eugene.zelenko at gmail.com>
Co-authored-by: Baranov Victor <bar.victor.2002 at gmail.com>

Added: 
    

Modified: 
    clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp
    clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.h
    clang-tools-extra/docs/ReleaseNotes.rst
    clang-tools-extra/docs/clang-tidy/checks/readability/qualified-auto.rst
    clang-tools-extra/test/clang-tidy/checkers/readability/qualified-auto.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp b/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp
index 91a08b9d8de69..561f067d471d1 100644
--- a/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp
@@ -106,12 +106,14 @@ QualifiedAutoCheck::QualifiedAutoCheck(StringRef Name,
     : ClangTidyCheck(Name, Context),
       AddConstToQualified(Options.get("AddConstToQualified", true)),
       AllowedTypes(
-          utils::options::parseStringList(Options.get("AllowedTypes", ""))) {}
+          utils::options::parseStringList(Options.get("AllowedTypes", ""))),
+      IgnoreAliasing(Options.get("IgnoreAliasing", true)) {}
 
 void QualifiedAutoCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
   Options.store(Opts, "AddConstToQualified", AddConstToQualified);
   Options.store(Opts, "AllowedTypes",
                 utils::options::serializeStringList(AllowedTypes));
+  Options.store(Opts, "IgnoreAliasing", IgnoreAliasing);
 }
 
 void QualifiedAutoCheck::registerMatchers(MatchFinder *Finder) {
@@ -134,16 +136,30 @@ void QualifiedAutoCheck::registerMatchers(MatchFinder *Finder) {
 
   auto IsBoundToType = refersToType(equalsBoundNode("type"));
   auto UnlessFunctionType = unless(hasUnqualifiedDesugaredType(functionType()));
-  auto IsAutoDeducedToPointer = [](const std::vector<StringRef> &AllowedTypes,
-                                   const auto &...InnerMatchers) {
-    return autoType(hasDeducedType(
-        hasUnqualifiedDesugaredType(pointerType(pointee(InnerMatchers...))),
-        unless(hasUnqualifiedType(
-            matchers::matchesAnyListedTypeName(AllowedTypes, false))),
-        unless(pointerType(pointee(hasUnqualifiedType(
-            matchers::matchesAnyListedTypeName(AllowedTypes, false)))))));
+
+  auto IsPointerType = [this](const auto &...InnerMatchers) {
+    if (this->IgnoreAliasing) {
+      return qualType(
+          hasUnqualifiedDesugaredType(pointerType(pointee(InnerMatchers...))));
+    } else {
+      return qualType(
+          anyOf(qualType(pointerType(pointee(InnerMatchers...))),
+                qualType(substTemplateTypeParmType(hasReplacementType(
+                    pointerType(pointee(InnerMatchers...)))))));
+    }
   };
 
+  auto IsAutoDeducedToPointer =
+      [IsPointerType](const std::vector<StringRef> &AllowedTypes,
+                      const auto &...InnerMatchers) {
+        return autoType(hasDeducedType(
+            IsPointerType(InnerMatchers...),
+            unless(hasUnqualifiedType(
+                matchers::matchesAnyListedTypeName(AllowedTypes, false))),
+            unless(pointerType(pointee(hasUnqualifiedType(
+                matchers::matchesAnyListedTypeName(AllowedTypes, false)))))));
+      };
+
   Finder->addMatcher(
       ExplicitSingleVarDecl(
           hasType(IsAutoDeducedToPointer(AllowedTypes, UnlessFunctionType)),

diff  --git a/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.h b/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.h
index 187a4cd6ee614..b5b713f3db6cf 100644
--- a/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.h
@@ -32,6 +32,7 @@ class QualifiedAutoCheck : public ClangTidyCheck {
 private:
   const bool AddConstToQualified;
   const std::vector<StringRef> AllowedTypes;
+  const bool IgnoreAliasing;
 };
 
 } // namespace clang::tidy::readability

diff  --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index dc782782ef342..2de2818172850 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -154,6 +154,10 @@ Changes in existing checks
   <clang-tidy/checks/portability/template-virtual-member-function>` check to
   avoid false positives on pure virtual member functions.
 
+- Improved :doc:`readability-qualified-auto
+  <clang-tidy/checks/readability/qualified-auto>` check by adding the option
+  `IgnoreAliasing`, that allows not looking at underlying types of type aliases.
+
 Removed checks
 ^^^^^^^^^^^^^^
 

diff  --git a/clang-tools-extra/docs/clang-tidy/checks/readability/qualified-auto.rst b/clang-tools-extra/docs/clang-tidy/checks/readability/qualified-auto.rst
index efa085719643c..34390e23b071c 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/readability/qualified-auto.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability/qualified-auto.rst
@@ -96,3 +96,45 @@ Note in the LLVM alias, the default value is `false`.
   matched against only the type name (i.e. ``Type``). E.g. to suppress reports
   for ``std::array`` iterators use `std::array<.*>::(const_)?iterator` string.
   The default is an empty string.
+
+.. option:: IgnoreAliasing
+
+  If set to `true` the check will use the underlying type to determine the type
+  that ``auto`` is deduced to. If set to `false` the check will not look beyond
+  the first type alias.
+  Default value is `true`.
+
+  .. code-block:: c++
+
+    using IntPtr = int*;
+    IntPtr foo();
+
+    auto bar = foo();
+
+  If :option:`IgnoreAliasing` is set to `true`, it will be transformed into:
+
+  .. code-block:: c++
+
+    auto *bar = foo();
+
+  Otherwise no changes will occur.
+
+Limitations
+-----------
+
+When :option:`IgnoreAliasing` is set to `false`, there are cases where
+Clang has not preserved the type alias and the underlying type will be used so
+false positives may occur.
+
+For example:
+
+.. code-block:: c++
+
+  using IntPtr = int *;
+
+  void loopPtr(const std::vector<IntPtr> &VectorIntPtr) {
+
+    // May fail for IgnoreAliasing==false as AST does not have the 'IntPtr'
+    for (auto Data : VectorIntPtr) {
+    }
+  }

diff  --git a/clang-tools-extra/test/clang-tidy/checkers/readability/qualified-auto.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/qualified-auto.cpp
index 77afdcafef9dd..83b7b1dfc4676 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/qualified-auto.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/qualified-auto.cpp
@@ -2,6 +2,11 @@
 // RUN: -config='{CheckOptions: { \
 // RUN:   readability-qualified-auto.AllowedTypes: "[iI]terator$;my::ns::Ignored1;std::array<.*>::Ignored2;MyIgnoredPtr" \
 // RUN: }}'
+// RUN: %check_clang_tidy %s readability-qualified-auto %t \
+// RUN: -config='{CheckOptions: { \
+// RUN:   readability-qualified-auto.AllowedTypes: "[iI]terator$;my::ns::Ignored1;std::array<.*>::Ignored2;MyIgnoredPtr", \
+// RUN:   readability-qualified-auto.IgnoreAliasing: false \
+// RUN: }}' -check-suffix=ALIAS -- 
 
 namespace typedefs {
 typedef int *MyPtr;
@@ -10,22 +15,36 @@ typedef const int *CMyPtr;
 typedef const int &CMyRef;
 
 MyPtr getPtr();
+MyPtr* getPtrPtr();
 MyRef getRef();
 CMyPtr getCPtr();
+CMyPtr* getCPtrPtr();
 CMyRef getCRef();
 
 void foo() {
   auto TdNakedPtr = getPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedPtr' can be declared as 'auto *TdNakedPtr'
   // CHECK-FIXES: {{^}}  auto *TdNakedPtr = getPtr();
+  auto TdNakedPtrPtr = getPtrPtr();
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedPtrPtr' can be declared as 'auto *TdNakedPtrPtr'
+  // CHECK-FIXES: {{^}}  auto *TdNakedPtrPtr = getPtrPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto TdNakedPtrPtr' can be declared as 'auto *TdNakedPtrPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  auto *TdNakedPtrPtr = getPtrPtr();
   auto &TdNakedRef = getRef();
   auto TdNakedRefDeref = getRef();
   auto TdNakedCPtr = getCPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedCPtr' can be declared as 'const auto *TdNakedCPtr'
   // CHECK-FIXES: {{^}}  const auto *TdNakedCPtr = getCPtr();
+  auto TdNakedCPtrPtr = getCPtrPtr();
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedCPtrPtr' can be declared as 'auto *TdNakedCPtrPtr'
+  // CHECK-FIXES: {{^}}  auto *TdNakedCPtrPtr = getCPtrPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto TdNakedCPtrPtr' can be declared as 'auto *TdNakedCPtrPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  auto *TdNakedCPtrPtr = getCPtrPtr();
   auto &TdNakedCRef = getCRef();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto &TdNakedCRef' can be declared as 'const auto &TdNakedCRef'
   // CHECK-FIXES: {{^}}  const auto &TdNakedCRef = getCRef();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto &TdNakedCRef' can be declared as 'const auto &TdNakedCRef'
+  // CHECK-FIXES-ALIAS: {{^}}  const auto &TdNakedCRef = getCRef();
   auto TdNakedCRefDeref = getCRef();
 }
 
@@ -38,6 +57,7 @@ using CMyPtr = const int *;
 using CMyRef = const int &;
 
 MyPtr getPtr();
+MyPtr* getPtrPtr();
 MyRef getRef();
 CMyPtr getCPtr();
 CMyRef getCRef();
@@ -46,6 +66,11 @@ void foo() {
   auto UNakedPtr = getPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto UNakedPtr' can be declared as 'auto *UNakedPtr'
   // CHECK-FIXES: {{^}}  auto *UNakedPtr = getPtr();
+  auto UNakedPtrPtr = getPtrPtr();
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto UNakedPtrPtr' can be declared as 'auto *UNakedPtrPtr'
+  // CHECK-FIXES: {{^}}  auto *UNakedPtrPtr = getPtrPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto UNakedPtrPtr' can be declared as 'auto *UNakedPtrPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  auto *UNakedPtrPtr = getPtrPtr();
   auto &UNakedRef = getRef();
   auto UNakedRefDeref = getRef();
   auto UNakedCPtr = getCPtr();
@@ -54,6 +79,8 @@ void foo() {
   auto &UNakedCRef = getCRef();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto &UNakedCRef' can be declared as 'const auto &UNakedCRef'
   // CHECK-FIXES: {{^}}  const auto &UNakedCRef = getCRef();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto &UNakedCRef' can be declared as 'const auto &UNakedCRef'
+  // CHECK-FIXES-ALIAS: {{^}}  const auto &UNakedCRef = getCRef();
   auto UNakedCRefDeref = getCRef();
 }
 
@@ -77,45 +104,67 @@ void foo() {
   auto NakedPtr = getIntPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto NakedPtr' can be declared as 'auto *NakedPtr'
   // CHECK-FIXES: {{^}}  auto *NakedPtr = getIntPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto NakedPtr' can be declared as 'auto *NakedPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  auto *NakedPtr = getIntPtr();
   auto NakedCPtr = getCIntPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto NakedCPtr' can be declared as 'const auto *NakedCPtr'
   // CHECK-FIXES: {{^}}  const auto *NakedCPtr = getCIntPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto NakedCPtr' can be declared as 'const auto *NakedCPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  const auto *NakedCPtr = getCIntPtr();
 
   const auto ConstPtr = getIntPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'const auto ConstPtr' can be declared as 'auto *const ConstPtr'
   // CHECK-FIXES: {{^}}  auto *const ConstPtr = getIntPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'const auto ConstPtr' can be declared as 'auto *const ConstPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  auto *const ConstPtr = getIntPtr();
   const auto ConstCPtr = getCIntPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'const auto ConstCPtr' can be declared as 'const auto *const ConstCPtr'
   // CHECK-FIXES: {{^}}  const auto *const ConstCPtr = getCIntPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'const auto ConstCPtr' can be declared as 'const auto *const ConstCPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  const auto *const ConstCPtr = getCIntPtr();
 
   volatile auto VolatilePtr = getIntPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'volatile auto VolatilePtr' can be declared as 'auto *volatile VolatilePtr'
   // CHECK-FIXES: {{^}}  auto *volatile VolatilePtr = getIntPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'volatile auto VolatilePtr' can be declared as 'auto *volatile VolatilePtr'
+  // CHECK-FIXES-ALIAS: {{^}}  auto *volatile VolatilePtr = getIntPtr();
   volatile auto VolatileCPtr = getCIntPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'volatile auto VolatileCPtr' can be declared as 'const auto *volatile VolatileCPtr'
   // CHECK-FIXES: {{^}}  const auto *volatile VolatileCPtr = getCIntPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'volatile auto VolatileCPtr' can be declared as 'const auto *volatile VolatileCPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  const auto *volatile VolatileCPtr = getCIntPtr();
 
   auto *QualPtr = getIntPtr();
   auto *QualCPtr = getCIntPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto *QualCPtr' can be declared as 'const auto *QualCPtr'
   // CHECK-FIXES: {{^}}  const auto *QualCPtr = getCIntPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto *QualCPtr' can be declared as 'const auto *QualCPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  const auto *QualCPtr = getCIntPtr();
   auto *const ConstantQualCPtr = getCIntPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto *const ConstantQualCPtr' can be declared as 'const auto *const ConstantQualCPtr'
   // CHECK-FIXES: {{^}}  const auto *const ConstantQualCPtr = getCIntPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto *const ConstantQualCPtr' can be declared as 'const auto *const ConstantQualCPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  const auto *const ConstantQualCPtr = getCIntPtr();
   auto *volatile VolatileQualCPtr = getCIntPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto *volatile VolatileQualCPtr' can be declared as 'const auto *volatile VolatileQualCPtr'
   // CHECK-FIXES: {{^}}  const auto *volatile VolatileQualCPtr = getCIntPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto *volatile VolatileQualCPtr' can be declared as 'const auto *volatile VolatileQualCPtr'
+  // CHECK-FIXES-ALIAS: {{^}}  const auto *volatile VolatileQualCPtr = getCIntPtr();
   const auto *ConstQualCPtr = getCIntPtr();
 
   auto &Ref = *getIntPtr();
   auto &CRef = *getCIntPtr();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto &CRef' can be declared as 'const auto &CRef'
   // CHECK-FIXES: {{^}}  const auto &CRef = *getCIntPtr();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto &CRef' can be declared as 'const auto &CRef'
+  // CHECK-FIXES-ALIAS: {{^}}  const auto &CRef = *getCIntPtr();
   const auto &ConstCRef = *getCIntPtr();
 
   if (auto X = getCIntPtr()) {
     // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'auto X' can be declared as 'const auto *X'
     // CHECK-FIXES: {{^}}  if (const auto *X = getCIntPtr()) {
+    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:7: warning: 'auto X' can be declared as 'const auto *X'
+    // CHECK-FIXES-ALIAS: {{^}}  if (const auto *X = getCIntPtr()) {
   }
 }
 
@@ -153,6 +202,8 @@ void loopRef(std::vector<int> &Mutate, const std::vector<int> &Constant) {
   for (auto &Data : Constant) {
     // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto &Data' can be declared as 'const auto &Data'
     // CHECK-FIXES: {{^}}  for (const auto &Data : Constant) {
+    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto &Data' can be declared as 'const auto &Data'
+    // CHECK-FIXES-ALIAS: {{^}}  for (const auto &Data : Constant) {
     observe(Data);
   }
 }
@@ -161,11 +212,15 @@ void loopPtr(const std::vector<int *> &Mutate, const std::vector<const int *> &C
   for (auto Data : Mutate) {
     // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'auto *Data'
     // CHECK-FIXES: {{^}}  for (auto *Data : Mutate) {
+    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'auto *Data'
+    // CHECK-FIXES-ALIAS: {{^}}  for (auto *Data : Mutate) {
     change(*Data);
   }
   for (auto Data : Constant) {
     // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'const auto *Data'
     // CHECK-FIXES: {{^}}  for (const auto *Data : Constant) {
+    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'const auto *Data'
+    // CHECK-FIXES-ALIAS: {{^}}  for (const auto *Data : Constant) {
     observe(*Data);
   }
 }
@@ -175,12 +230,16 @@ void tempLoopPtr(std::vector<T *> &MutateTemplate, std::vector<const T *> &Const
   for (auto Data : MutateTemplate) {
     // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'auto *Data'
     // CHECK-FIXES: {{^}}  for (auto *Data : MutateTemplate) {
+    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'auto *Data'
+    // CHECK-FIXES-ALIAS: {{^}}  for (auto *Data : MutateTemplate) {
     change(*Data);
   }
   //FixMe
   for (auto Data : ConstantTemplate) {
     // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'const auto *Data'
     // CHECK-FIXES: {{^}}  for (const auto *Data : ConstantTemplate) {
+    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'const auto *Data'
+    // CHECK-FIXES-ALIAS: {{^}}  for (const auto *Data : ConstantTemplate) {
     observe(*Data);
   }
 }
@@ -192,12 +251,16 @@ class TemplateLoopPtr {
     for (auto Data : MClassTemplate) {
       // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: 'auto Data' can be declared as 'auto *Data'
       // CHECK-FIXES: {{^}}    for (auto *Data : MClassTemplate) {
+      // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:10: warning: 'auto Data' can be declared as 'auto *Data'
+      // CHECK-FIXES-ALIAS: {{^}}    for (auto *Data : MClassTemplate) {
       change(*Data);
     }
     //FixMe
     for (auto Data : CClassTemplate) {
       // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: 'auto Data' can be declared as 'const auto *Data'
       // CHECK-FIXES: {{^}}    for (const auto *Data : CClassTemplate) {
+      // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:10: warning: 'auto Data' can be declared as 'const auto *Data'
+      // CHECK-FIXES-ALIAS: {{^}}    for (const auto *Data : CClassTemplate) {
       observe(*Data);
     }
   }
@@ -223,21 +286,31 @@ void baz() {
   auto MyFunctionPtr = getPtrFunction();
   // CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto MyFunctionPtr' can be declared as 'auto *MyFunctionPtr'
   // CHECK-FIXES-NOT: {{^}}  auto *MyFunctionPtr = getPtrFunction();
+  // CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-1]]:3: warning: 'auto MyFunctionPtr' can be declared as 'auto *MyFunctionPtr'
+  // CHECK-FIXES-NOT-ALIAS: {{^}}  auto *MyFunctionPtr = getPtrFunction();
   auto MyFunctionVal = getValFunction();
   // CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto MyFunctionVal' can be declared as 'auto *MyFunctionVal'
   // CHECK-FIXES-NOT: {{^}}  auto *MyFunctionVal = getValFunction();
+  // CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto MyFunctionVal' can be declared as 'auto *MyFunctionVal'
+  // CHECK-FIXES-NOT-ALIAS: {{^}}  auto *MyFunctionVal = getValFunction();
 
   auto LambdaTest = [] { return 0; };
   // CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto LambdaTest' can be declared as 'auto *LambdaTest'
   // CHECK-FIXES-NOT: {{^}}  auto *LambdaTest = [] { return 0; };
+  // CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto LambdaTest' can be declared as 'auto *LambdaTest'
+  // CHECK-FIXES-NOT-ALIAS: {{^}}  auto *LambdaTest = [] { return 0; };
 
   auto LambdaTest2 = +[] { return 0; };
   // CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto LambdaTest2' can be declared as 'auto *LambdaTest2'
   // CHECK-FIXES-NOT: {{^}}  auto *LambdaTest2 = +[] { return 0; };
+  // CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto LambdaTest2' can be declared as 'auto *LambdaTest2'
+  // CHECK-FIXES-NOT-ALIAS: {{^}}  auto *LambdaTest2 = +[] { return 0; };
 
   auto MyFunctionRef = *getPtrFunction();
   // CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto MyFunctionRef' can be declared as 'auto *MyFunctionRef'
   // CHECK-FIXES-NOT: {{^}}  auto *MyFunctionRef = *getPtrFunction();
+  // CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto MyFunctionRef' can be declared as 'auto *MyFunctionRef'
+  // CHECK-FIXES-NOT-ALIAS: {{^}}  auto *MyFunctionRef = *getPtrFunction();
 
   auto &MyFunctionRef2 = *getPtrFunction();
 }
@@ -339,10 +412,14 @@ void ignored_types() {
   auto arr_not_ignored2 = new std::array<int, 4>::NotIgnored2();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto arr_not_ignored2' can be declared as 'auto *arr_not_ignored2'
   // CHECK-FIXES: auto *arr_not_ignored2 = new std::array<int, 4>::NotIgnored2();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto arr_not_ignored2' can be declared as 'auto *arr_not_ignored2'
+  // CHECK-FIXES-ALIAS: auto *arr_not_ignored2 = new std::array<int, 4>::NotIgnored2();
 
   auto not_ignored2 = new std::Ignored2();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not_ignored2' can be declared as 'auto *not_ignored2'
   // CHECK-FIXES: auto *not_ignored2 = new std::Ignored2();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not_ignored2' can be declared as 'auto *not_ignored2'
+  // CHECK-FIXES-ALIAS: auto *not_ignored2 = new std::Ignored2();
 
   auto ignored1 = new my::ns::Ignored1();
   // CHECK-MESSAGES-NOT: warning: 'auto ignored1' can be declared as 'auto *ignored1'
@@ -351,14 +428,20 @@ void ignored_types() {
   auto not_ignored1 = new my::ns::NotIgnored1();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not_ignored1' can be declared as 'auto *not_ignored1'
   // CHECK-FIXES: auto *not_ignored1 = new my::ns::NotIgnored1();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not_ignored1' can be declared as 'auto *not_ignored1'
+  // CHECK-FIXES-ALIAS: auto *not_ignored1 = new my::ns::NotIgnored1();
 
   auto not2_ignored1 = new my::ns::NotIgnored2();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not2_ignored1' can be declared as 'auto *not2_ignored1'
   // CHECK-FIXES: auto *not2_ignored1 = new my::ns::NotIgnored2();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not2_ignored1' can be declared as 'auto *not2_ignored1'
+  // CHECK-FIXES-ALIAS: auto *not2_ignored1 = new my::ns::NotIgnored2();
 
   auto not3_ignored1 = new my::Ignored1();
   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not3_ignored1' can be declared as 'auto *not3_ignored1'
   // CHECK-FIXES: auto *not3_ignored1 = new my::Ignored1();
+  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not3_ignored1' can be declared as 'auto *not3_ignored1'
+  // CHECK-FIXES-ALIAS: auto *not3_ignored1 = new my::Ignored1();
 }
 
 template <typename T>


        


More information about the cfe-commits mailing list