<div dir="ltr">This broke sphinx: <a href="http://lab.llvm.org:8011/builders/clang-tools-sphinx-docs/builds/54402/steps/docs-clang-tools-html/logs/stdio">http://lab.llvm.org:8011/builders/clang-tools-sphinx-docs/builds/54402/steps/docs-clang-tools-html/logs/stdio</a><div><br>Please take a look!</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Feb 2, 2020 at 4:27 PM Nathan James via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Nathan James<br>
Date: 2020-02-02T21:27:25Z<br>
New Revision: 8a68c40a1bf256523993ee97b39f79001eaade91<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/8a68c40a1bf256523993ee97b39f79001eaade91" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/8a68c40a1bf256523993ee97b39f79001eaade91</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/8a68c40a1bf256523993ee97b39f79001eaade91.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/8a68c40a1bf256523993ee97b39f79001eaade91.diff</a><br>
<br>
LOG: [clang-tidy] Added option for disabling const qualifiers in readability-qualified-auto<br>
<br>
Summary: Adds an option called `AddConstToQualified` to readability-qualified-auto to toggle adding const to the auto typed pointers and references. By default its enabled but in the LLVM module its disabled.<br>
<br>
Reviewers: aaron.ballman, alexfh, JonasToth, hokein, sammccall<br>
<br>
Reviewed By: aaron.ballman<br>
<br>
Subscribers: Quuxplusone, merge_guards_bot, lebedev.ri, xazax.hun, cfe-commits<br>
<br>
Tags: #clang, #clang-tools-extra<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D73548" rel="noreferrer" target="_blank">https://reviews.llvm.org/D73548</a><br>
<br>
Added: <br>
    clang-tools-extra/test/clang-tidy/checkers/llvm-qualified-auto.cpp<br>
<br>
Modified: <br>
    clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp<br>
    clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp<br>
    clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.h<br>
    clang-tools-extra/docs/ReleaseNotes.rst<br>
    clang-tools-extra/docs/clang-tidy/checks/readability-qualified-auto.rst<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp b/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp<br>
index 5ae927c2cf5a..2aaf07639267 100644<br>
--- a/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp<br>
+++ b/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp<br>
@@ -36,6 +36,12 @@ class LLVMModule : public ClangTidyModule {<br>
         "llvm-qualified-auto");<br>
     CheckFactories.registerCheck<TwineLocalCheck>("llvm-twine-local");<br>
   }<br>
+<br>
+  ClangTidyOptions getModuleOptions() override {<br>
+    ClangTidyOptions Options;<br>
+    Options.CheckOptions["llvm-qualified-auto.AddConstToQualified"] = "0";<br>
+    return Options;<br>
+  }<br>
 };<br>
<br>
 // Register the LLVMTidyModule using this statically initialized variable.<br>
<br>
diff  --git a/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp b/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp<br>
index 1d0b85b9c4ce..79885dbe4b43 100644<br>
--- a/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp<br>
+++ b/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.cpp<br>
@@ -102,6 +102,10 @@ bool isAutoPointerConst(QualType QType) {<br>
<br>
 } // namespace<br>
<br>
+void QualifiedAutoCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {<br>
+  Options.store(Opts, "AddConstToQualified", AddConstToQualified);<br>
+}<br>
+<br>
 void QualifiedAutoCheck::registerMatchers(MatchFinder *Finder) {<br>
   if (!getLangOpts().CPlusPlus11)<br>
     return; // Auto deduction not used in 'C or C++03 and earlier', so don't<br>
@@ -142,6 +146,8 @@ void QualifiedAutoCheck::registerMatchers(MatchFinder *Finder) {<br>
                           hasAnyTemplateArgument(IsBoundToType))))),<br>
           "auto"),<br>
       this);<br>
+  if (!AddConstToQualified)<br>
+    return;<br>
   Finder->addMatcher(ExplicitSingleVarDecl(<br>
                          hasType(pointerType(pointee(autoType()))), "auto_ptr"),<br>
                      this);<br>
@@ -177,11 +183,9 @@ void QualifiedAutoCheck::check(const MatchFinder::MatchResult &Result) {<br>
     bool IsLocalVolatile = Var->getType().isLocalVolatileQualified();<br>
     bool IsLocalRestrict = Var->getType().isLocalRestrictQualified();<br>
<br>
-    if (CheckQualifier(IsLocalConst, Qualifier::Const))<br>
-      return;<br>
-    if (CheckQualifier(IsLocalVolatile, Qualifier::Volatile))<br>
-      return;<br>
-    if (CheckQualifier(IsLocalRestrict, Qualifier::Restrict))<br>
+    if (CheckQualifier(IsLocalConst, Qualifier::Const) ||<br>
+        CheckQualifier(IsLocalVolatile, Qualifier::Volatile) ||<br>
+        CheckQualifier(IsLocalRestrict, Qualifier::Restrict))<br>
       return;<br>
<br>
     // Check for bridging the gap between the asterisk and name.<br>
@@ -214,8 +218,7 @@ void QualifiedAutoCheck::check(const MatchFinder::MatchResult &Result) {<br>
         << (IsLocalRestrict ? "__restrict " : "") << Var->getName() << ReplStr;<br>
<br>
     for (SourceRange &Range : RemoveQualifiersRange) {<br>
-      Diag << FixItHint::CreateRemoval(<br>
-          CharSourceRange::getCharRange(Range.getBegin(), Range.getEnd()));<br>
+      Diag << FixItHint::CreateRemoval(CharSourceRange::getCharRange(Range));<br>
     }<br>
<br>
     Diag << FixItHint::CreateReplacement(FixItRange, ReplStr);<br>
@@ -247,22 +250,17 @@ void QualifiedAutoCheck::check(const MatchFinder::MatchResult &Result) {<br>
         return;<br>
     }<br>
<br>
-    CharSourceRange FixItRange;<br>
     if (llvm::Optional<SourceRange> TypeSpec =<br>
             getTypeSpecifierLocation(Var, Result)) {<br>
-      FixItRange = CharSourceRange::getCharRange(*TypeSpec);<br>
-      if (FixItRange.isInvalid())<br>
+      if (TypeSpec->isInvalid() || TypeSpec->getBegin().isMacroID() ||<br>
+          TypeSpec->getEnd().isMacroID())<br>
         return;<br>
-    } else<br>
-      return;<br>
-<br>
-    DiagnosticBuilder Diag =<br>
-        diag(FixItRange.getBegin(),<br>
-             "'auto *%0%1%2' can be declared as 'const auto *%0%1%2'")<br>
-        << (Var->getType().isLocalConstQualified() ? "const " : "")<br>
-        << (Var->getType().isLocalVolatileQualified() ? "volatile " : "")<br>
-        << Var->getName();<br>
-    Diag << FixItHint::CreateReplacement(FixItRange, "const auto *");<br>
+      SourceLocation InsertPos = TypeSpec->getBegin();<br>
+      diag(InsertPos, "'auto *%0%1%2' can be declared as 'const auto *%0%1%2'")<br>
+          << (Var->getType().isLocalConstQualified() ? "const " : "")<br>
+          << (Var->getType().isLocalVolatileQualified() ? "volatile " : "")<br>
+          << Var->getName() << FixItHint::CreateInsertion(InsertPos, "const ");<br>
+    }<br>
     return;<br>
   }<br>
   if (const auto *Var = Result.Nodes.getNodeAs<VarDecl>("auto_ref")) {<br>
@@ -272,20 +270,15 @@ void QualifiedAutoCheck::check(const MatchFinder::MatchResult &Result) {<br>
       // Const isnt wrapped in the auto type, so must be declared explicitly.<br>
       return;<br>
<br>
-    CharSourceRange FixItRange;<br>
     if (llvm::Optional<SourceRange> TypeSpec =<br>
             getTypeSpecifierLocation(Var, Result)) {<br>
-      FixItRange = CharSourceRange::getCharRange(*TypeSpec);<br>
-      if (FixItRange.isInvalid())<br>
+      if (TypeSpec->isInvalid() || TypeSpec->getBegin().isMacroID() ||<br>
+          TypeSpec->getEnd().isMacroID())<br>
         return;<br>
-    } else<br>
-      return;<br>
-<br>
-    DiagnosticBuilder Diag =<br>
-        diag(FixItRange.getBegin(),<br>
-             "'auto &%0' can be declared as 'const auto &%0'")<br>
-        << Var->getName();<br>
-    Diag << FixItHint::CreateReplacement(FixItRange, "const auto &");<br>
+      SourceLocation InsertPos = TypeSpec->getBegin();<br>
+      diag(InsertPos, "'auto &%0' can be declared as 'const auto &%0'")<br>
+          << Var->getName() << FixItHint::CreateInsertion(InsertPos, "const ");<br>
+    }<br>
     return;<br>
   }<br>
 }<br>
<br>
diff  --git a/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.h b/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.h<br>
index 799342cce2eb..448b8e9353e4 100644<br>
--- a/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.h<br>
+++ b/clang-tools-extra/clang-tidy/readability/QualifiedAutoCheck.h<br>
@@ -24,9 +24,14 @@ namespace readability {<br>
 class QualifiedAutoCheck : public ClangTidyCheck {<br>
 public:<br>
   QualifiedAutoCheck(StringRef Name, ClangTidyContext *Context)<br>
-      : ClangTidyCheck(Name, Context) {}<br>
+      : ClangTidyCheck(Name, Context),<br>
+        AddConstToQualified(Options.get("AddConstToQualified", true)) {}<br>
+  void storeOptions(ClangTidyOptions::OptionMap &Opts) override;<br>
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;<br>
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;<br>
+<br>
+private:<br>
+  const bool AddConstToQualified;<br>
 };<br>
<br>
 } // namespace readability<br>
<br>
diff  --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst<br>
index f9dbcd0220d1..4e0f79dfd45c 100644<br>
--- a/clang-tools-extra/docs/ReleaseNotes.rst<br>
+++ b/clang-tools-extra/docs/ReleaseNotes.rst<br>
@@ -104,6 +104,11 @@ New check aliases<br>
 Changes in existing checks<br>
 ^^^^^^^^^^^^^^^^^^^^^^^^^^<br>
<br>
+- Improved :doc:`readability-qualified-auto<br>
+  <clang-tidy/checks/readability-qualified-about>` check now supports a <br>
+  `AddConstToQualified` to enable adding ``const`` qualifiers to variables<br>
+  typed with ``auto *`` and ``auto &``.<br>
+<br>
 - Improved :doc:`readability-redundant-string-init<br>
   <clang-tidy/checks/readability-redundant-string-init>` check now supports a<br>
   `StringNames` option enabling its application to custom string classes. The <br>
<br>
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<br>
index 5f28c04ad818..351b333b6dce 100644<br>
--- a/clang-tools-extra/docs/clang-tidy/checks/readability-qualified-auto.rst<br>
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-qualified-auto.rst<br>
@@ -3,23 +3,16 @@<br>
 readability-qualified-auto<br>
 ==========================<br>
<br>
-Adds pointer and ``const`` qualifications to ``auto``-typed variables that are deduced<br>
-to pointers and ``const`` pointers.<br>
+Adds pointer qualifications to ``auto``-typed variables that are deduced to <br>
+pointers.<br>
<br>
-`LLVM Coding Standards <<a href="https://llvm.org/docs/CodingStandards.html" rel="noreferrer" target="_blank">https://llvm.org/docs/CodingStandards.html</a>>`_ advises to<br>
-make it obvious if a ``auto`` typed variable is a pointer, constant pointer or <br>
-constant reference. This check will transform ``auto`` to ``auto *`` when the <br>
-type is deduced to be a pointer, as well as adding ``const`` when applicable to<br>
-``auto`` pointers or references<br>
+`LLVM Coding Standards <<a href="https://llvm.org/docs/CodingStandards.html#beware-unnecessary-copies-with-auto" rel="noreferrer" target="_blank">https://llvm.org/docs/CodingStandards.html#beware-unnecessary-copies-with-auto</a>>`_<br>
+advises to make it obvious if a ``auto`` typed variable is a pointer. This <br>
+check will transform ``auto`` to ``auto *`` when the type is deduced to be a<br>
+pointer.<br>
<br>
 .. code-block:: c++<br>
<br>
-  for (auto &Data : MutatableContainer) {<br>
-    change(Data);<br>
-  }<br>
-  for (auto &Data : ConstantContainer) {<br>
-    observe(Data);<br>
-  }<br>
   for (auto Data : MutatablePtrContainer) {<br>
     change(*Data);<br>
   }<br>
@@ -31,12 +24,6 @@ Would be transformed into:<br>
<br>
 .. code-block:: c++<br>
<br>
-  for (auto &Data : MutatableContainer) {<br>
-    change(Data);<br>
-  }<br>
-  for (const auto &Data : ConstantContainer) {<br>
-    observe(Data);<br>
-  }<br>
   for (auto *Data : MutatablePtrContainer) {<br>
     change(*Data);<br>
   }<br>
@@ -44,21 +31,54 @@ Would be transformed into:<br>
     observe(*Data);<br>
   }<br>
<br>
-Note const volatile qualified types will retain their const and volatile qualifiers.<br>
+Note ``const`` ``volatile`` qualified types will retain their ``const`` and <br>
+``volatile`` qualifiers. Pointers to pointers will not be fully qualified.<br>
<br>
 .. code-block:: c++<br>
<br>
-  const auto Foo = cast<int *>(Baz1);<br>
-  const auto Bar = cast<const int *>(Baz2);<br>
-  volatile auto FooBar = cast<int*>(Baz3);<br>
+   const auto Foo = cast<int *>(Baz1);<br>
+   const auto Bar = cast<const int *>(Baz2);<br>
+   volatile auto FooBar = cast<int *>(Baz3);<br>
+   auto BarFoo = cast<int **>(Baz4);<br>
<br>
 Would be transformed into:<br>
<br>
 .. code-block:: c++<br>
<br>
-  auto *const Foo = cast<int *>(Baz1);<br>
-  const auto *const Bar = cast<const int *>(Baz2);<br>
-  auto *volatile FooBar = cast<int*>(Baz3);<br>
+   auto *const Foo = cast<int *>(Baz1);<br>
+   const auto *const Bar = cast<const int *>(Baz2);<br>
+   auto *volatile FooBar = cast<int *>(Baz3);<br>
+   auto *BarFoo = cast<int **>(Baz4);<br>
+<br>
+Options<br>
+-------<br>
+<br>
+.. option:: AddConstToQualified<br>
+   <br>
+   When set to `1` the check will add const qualifiers variables defined as<br>
+   ``auto *`` or ``auto &`` when applicable.<br>
+   Default value is '1'.<br>
+<br>
+.. code-block:: c++<br>
+<br>
+   auto Foo1 = cast<const int *>(Bar1);<br>
+   auto *Foo2 = cast<const int *>(Bar2);<br>
+   auto &Foo3 = cast<const int &>(Bar3);<br>
+<br>
+   If AddConstToQualified is set to `0`,  it will be transformed into:<br>
+<br>
+.. code-block:: c++<br>
+<br>
+   const auto *Foo1 = cast<const int *>(Bar1);<br>
+   auto *Foo2 = cast<const int *>(Bar2);<br>
+   auto &Foo3 = cast<const int &>(Bar3);<br>
+<br>
+   Otherwise it will be transformed into:<br>
+<br>
+.. code-block:: c++<br>
+<br>
+   const auto *Foo1 = cast<const int *>(Bar1);<br>
+   const auto *Foo2 = cast<const int *>(Bar2);<br>
+   const auto &Foo3 = cast<const int &>(Bar3);<br>
<br>
-This check helps to enforce this `LLVM Coding Standards recommendation<br>
-<<a href="https://llvm.org/docs/CodingStandards.html#beware-unnecessary-copies-with-auto" rel="noreferrer" target="_blank">https://llvm.org/docs/CodingStandards.html#beware-unnecessary-copies-with-auto</a>>`_.<br>
+   Note in the LLVM alias, the default value is `0`.<br>
<br>
diff  --git a/clang-tools-extra/test/clang-tidy/checkers/llvm-qualified-auto.cpp b/clang-tools-extra/test/clang-tidy/checkers/llvm-qualified-auto.cpp<br>
new file mode 100644<br>
index 000000000000..97473ae41ec6<br>
--- /dev/null<br>
+++ b/clang-tools-extra/test/clang-tidy/checkers/llvm-qualified-auto.cpp<br>
@@ -0,0 +1,21 @@<br>
+// RUN: %check_clang_tidy %s llvm-qualified-auto %t<br>
+<br>
+// This check just ensures by default the llvm alias doesn't add const<br>
+// qualifiers to decls, so no need to copy the entire test file from<br>
+// readability-qualified-auto.<br>
+<br>
+int *getIntPtr();<br>
+const int *getCIntPtr();<br>
+<br>
+void foo() {<br>
+  auto NakedPtr = getIntPtr();<br>
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto NakedPtr' can be declared as 'auto *NakedPtr'<br>
+  // CHECK-FIXES: {{^}}  auto *NakedPtr = getIntPtr();<br>
+  auto NakedConstPtr = getCIntPtr();<br>
+  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto NakedConstPtr' can be declared as 'const auto *NakedConstPtr'<br>
+  // CHECK-FIXES: {{^}}  const auto *NakedConstPtr = getCIntPtr();<br>
+  auto *Ptr = getIntPtr();<br>
+  auto *ConstPtr = getCIntPtr();<br>
+  auto &NakedRef = *getIntPtr();<br>
+  auto &NakedConstRef = *getCIntPtr();<br>
+}<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>