[clang-tools-extra] r264856 - [clang-tidy] readability check for const params in declarations

Alexander Kornienko via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 30 05:40:41 PDT 2016


Thanks for letting me know! Should be fixed in r264862.

On Wed, Mar 30, 2016 at 2:19 PM, Nico Weber <thakis at chromium.org> wrote:

> This doesn't build on Windows:
>
>
> http://lab.llvm.org:8011/builders/clang-x64-ninja-win7/builds/11018/steps/build%20stage%201/logs/stdio
>
> d:\buildslave\clang-x64-ninja-win7\llvm\tools\clang\tools\extra\clang-tidy\readability\../ClangTidyModule.h(61)
> : error C2660:
> 'clang::tidy::readability::AvoidConstParamsInDecls::AvoidConstParamsInDecls'
> : function does not take 2 arguments
>
> D:\buildslave\clang-x64-ninja-win7\llvm\tools\clang\tools\extra\clang-tidy\readability\ReadabilityTidyModule.cpp(37)
> : see reference to function template instantiation 'void
> clang::tidy::ClangTidyCheckFactories::registerCheck<clang::tidy::readability::AvoidConstParamsInDecls>(llvm::StringRef)'
> being compiled
>
> Can you take a look?
>
>
> On Wed, Mar 30, 2016 at 4:31 AM, Alexander Kornienko via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: alexfh
>> Date: Wed Mar 30 06:31:33 2016
>> New Revision: 264856
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=264856&view=rev
>> Log:
>> [clang-tidy] readability check for const params in declarations
>>
>> Summary: Adds a clang-tidy warning for top-level consts in function
>> declarations.
>>
>> Reviewers: hokein, sbenza, alexfh
>>
>> Subscribers: cfe-commits
>>
>> Patch by Matt Kulukundis!
>>
>> Differential Revision: http://reviews.llvm.org/D18408
>>
>> Added:
>>
>> clang-tools-extra/trunk/clang-tidy/readability/AvoidConstParamsInDecls.cpp
>>
>> clang-tools-extra/trunk/clang-tidy/readability/AvoidConstParamsInDecls.h
>>
>> clang-tools-extra/trunk/docs/clang-tidy/checks/readability-avoid-const-params-in-decls.rst
>>
>> clang-tools-extra/trunk/test/clang-tidy/readability-avoid-const-params-in-decls.cpp
>> Modified:
>>     clang-tools-extra/trunk/clang-tidy/readability/CMakeLists.txt
>>
>> clang-tools-extra/trunk/clang-tidy/readability/ReadabilityTidyModule.cpp
>>     clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst
>>
>> Added:
>> clang-tools-extra/trunk/clang-tidy/readability/AvoidConstParamsInDecls.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/AvoidConstParamsInDecls.cpp?rev=264856&view=auto
>>
>> ==============================================================================
>> ---
>> clang-tools-extra/trunk/clang-tidy/readability/AvoidConstParamsInDecls.cpp
>> (added)
>> +++
>> clang-tools-extra/trunk/clang-tidy/readability/AvoidConstParamsInDecls.cpp
>> Wed Mar 30 06:31:33 2016
>> @@ -0,0 +1,71 @@
>> +//===--- AvoidConstParamsInDecls.cpp -
>> clang-tidy--------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "AvoidConstParamsInDecls.h"
>> +#include "clang/ASTMatchers/ASTMatchFinder.h"
>> +#include "clang/ASTMatchers/ASTMatchers.h"
>> +#include "clang/Lex/Lexer.h"
>> +
>> +using namespace clang::ast_matchers;
>> +
>> +namespace clang {
>> +namespace tidy {
>> +namespace readability {
>> +namespace {
>> +
>> +SourceRange getTypeRange(const ParmVarDecl &Param) {
>> +  if (Param.getIdentifier() != nullptr)
>> +    return SourceRange(Param.getLocStart(),
>> +                       Param.getLocEnd().getLocWithOffset(-1));
>> +  return Param.getSourceRange();
>> +}
>> +
>> +} // namespace
>> +
>> +
>> +void AvoidConstParamsInDecls::registerMatchers(MatchFinder *Finder) {
>> +  const auto ConstParamDecl =
>> +      parmVarDecl(hasType(qualType(isConstQualified()))).bind("param");
>> +  Finder->addMatcher(functionDecl(unless(isDefinition()),
>> +                                  has(typeLoc(forEach(ConstParamDecl))))
>> +                         .bind("func"),
>> +                     this);
>> +}
>> +
>> +void AvoidConstParamsInDecls::check(const MatchFinder::MatchResult
>> &Result) {
>> +  const auto *Func = Result.Nodes.getNodeAs<FunctionDecl>("func");
>> +  const auto *Param = Result.Nodes.getNodeAs<ParmVarDecl>("param");
>> +
>> +  QualType Type = Param->getType();
>> +  if (!Type.isLocalConstQualified())
>> +    return;
>> +
>> +  Type.removeLocalConst();
>> +
>> +  auto Diag = diag(Param->getLocStart(),
>> +                   "parameter %0 is const-qualified in the function "
>> +                   "declaration; const-qualification of parameters only
>> has an "
>> +                   "effect in function definitions");
>> +  if (Param->getName().empty()) {
>> +    for (unsigned int i = 0; i < Func->getNumParams(); ++i) {
>> +      if (Param == Func->getParamDecl(i)) {
>> +        Diag << (i + 1);
>> +        break;
>> +      }
>> +    }
>> +  } else {
>> +    Diag << Param;
>> +  }
>> +  Diag << FixItHint::CreateReplacement(getTypeRange(*Param),
>> +                                       Type.getAsString());
>> +}
>> +
>> +} // namespace readability
>> +} // namespace tidy
>> +} // namespace clang
>>
>> Added:
>> clang-tools-extra/trunk/clang-tidy/readability/AvoidConstParamsInDecls.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/AvoidConstParamsInDecls.h?rev=264856&view=auto
>>
>> ==============================================================================
>> ---
>> clang-tools-extra/trunk/clang-tidy/readability/AvoidConstParamsInDecls.h
>> (added)
>> +++
>> clang-tools-extra/trunk/clang-tidy/readability/AvoidConstParamsInDecls.h
>> Wed Mar 30 06:31:33 2016
>> @@ -0,0 +1,33 @@
>> +//===--- AvoidConstParamsInDecls.h -
>> clang-tidy----------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef
>> LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOID_CONST_PARAMS_IN_DECLS_H
>> +#define
>> LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOID_CONST_PARAMS_IN_DECLS_H
>> +
>> +#include "../ClangTidy.h"
>> +
>> +namespace clang {
>> +namespace tidy {
>> +namespace readability {
>> +
>> +// Detect function declarations that have const value parameters and
>> discourage
>> +// them.
>> +class AvoidConstParamsInDecls : public ClangTidyCheck {
>> +public:
>> +  using ClangTidyCheck::ClangTidyCheck;
>> +
>> +  void registerMatchers(ast_matchers::MatchFinder *Finder) override;
>> +  void check(const ast_matchers::MatchFinder::MatchResult &Result)
>> override;
>> +};
>> +
>> +} // namespace readability
>> +} // namespace tidy
>> +} // namespace clang
>> +
>> +#endif //
>> LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOID_CONST_PARAMS_IN_DECLS_H
>>
>> Modified: clang-tools-extra/trunk/clang-tidy/readability/CMakeLists.txt
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/CMakeLists.txt?rev=264856&r1=264855&r2=264856&view=diff
>>
>> ==============================================================================
>> --- clang-tools-extra/trunk/clang-tidy/readability/CMakeLists.txt
>> (original)
>> +++ clang-tools-extra/trunk/clang-tidy/readability/CMakeLists.txt Wed Mar
>> 30 06:31:33 2016
>> @@ -1,6 +1,7 @@
>>  set(LLVM_LINK_COMPONENTS support)
>>
>>  add_clang_library(clangTidyReadabilityModule
>> +  AvoidConstParamsInDecls.cpp
>>    BracesAroundStatementsCheck.cpp
>>    ContainerSizeEmptyCheck.cpp
>>    ElseAfterReturnCheck.cpp
>>
>> Modified:
>> clang-tools-extra/trunk/clang-tidy/readability/ReadabilityTidyModule.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/ReadabilityTidyModule.cpp?rev=264856&r1=264855&r2=264856&view=diff
>>
>> ==============================================================================
>> ---
>> clang-tools-extra/trunk/clang-tidy/readability/ReadabilityTidyModule.cpp
>> (original)
>> +++
>> clang-tools-extra/trunk/clang-tidy/readability/ReadabilityTidyModule.cpp
>> Wed Mar 30 06:31:33 2016
>> @@ -10,6 +10,7 @@
>>  #include "../ClangTidy.h"
>>  #include "../ClangTidyModule.h"
>>  #include "../ClangTidyModuleRegistry.h"
>> +#include "AvoidConstParamsInDecls.h"
>>  #include "BracesAroundStatementsCheck.h"
>>  #include "ContainerSizeEmptyCheck.h"
>>  #include "ElseAfterReturnCheck.h"
>> @@ -32,6 +33,8 @@ namespace readability {
>>  class ReadabilityModule : public ClangTidyModule {
>>  public:
>>    void addCheckFactories(ClangTidyCheckFactories &CheckFactories)
>> override {
>> +    CheckFactories.registerCheck<AvoidConstParamsInDecls>(
>> +        "readability-avoid-const-params-in-decls");
>>      CheckFactories.registerCheck<BracesAroundStatementsCheck>(
>>          "readability-braces-around-statements");
>>      CheckFactories.registerCheck<ContainerSizeEmptyCheck>(
>>
>> Modified: clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst?rev=264856&r1=264855&r2=264856&view=diff
>>
>> ==============================================================================
>> --- clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst (original)
>> +++ clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Wed Mar 30
>> 06:31:33 2016
>> @@ -90,8 +90,9 @@ Clang-Tidy Checks
>>     performance-faster-string-find
>>     performance-for-range-copy
>>     performance-implicit-cast-in-loop
>> -   performance-unnecessary-value-param
>>     performance-unnecessary-copy-initialization
>> +   performance-unnecessary-value-param
>> +   readability-avoid-const-params-in-decls
>>     readability-braces-around-statements
>>     readability-container-size-empty
>>     readability-else-after-return
>>
>> Added:
>> clang-tools-extra/trunk/docs/clang-tidy/checks/readability-avoid-const-params-in-decls.rst
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/readability-avoid-const-params-in-decls.rst?rev=264856&view=auto
>>
>> ==============================================================================
>> ---
>> clang-tools-extra/trunk/docs/clang-tidy/checks/readability-avoid-const-params-in-decls.rst
>> (added)
>> +++
>> clang-tools-extra/trunk/docs/clang-tidy/checks/readability-avoid-const-params-in-decls.rst
>> Wed Mar 30 06:31:33 2016
>> @@ -0,0 +1,17 @@
>> +.. title:: clang-tidy - readability-avoid-const-params-in-decls
>> +
>> +readability-avoid-const-params-in-decls
>> +=======================================
>> +
>> +Checks whether a function declaration has parameters that are top level
>> const.
>> +
>> +`const` values in declarations do not affect the signature of a
>> function, so
>> +they should not be put there.  For example:
>> +
>> +Examples:
>> +
>> +.. code:: c++
>> +
>> +  void f(const string);   // Bad: const is top level.
>> +  void f(const string&);  // Good: const is not top level.
>> +
>>
>> Added:
>> clang-tools-extra/trunk/test/clang-tidy/readability-avoid-const-params-in-decls.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/readability-avoid-const-params-in-decls.cpp?rev=264856&view=auto
>>
>> ==============================================================================
>> ---
>> clang-tools-extra/trunk/test/clang-tidy/readability-avoid-const-params-in-decls.cpp
>> (added)
>> +++
>> clang-tools-extra/trunk/test/clang-tidy/readability-avoid-const-params-in-decls.cpp
>> Wed Mar 30 06:31:33 2016
>> @@ -0,0 +1,78 @@
>> +// RUN: %check_clang_tidy %s readability-avoid-const-params-in-decls %t
>> +
>> +using alias_type = bool;
>> +using alias_const_type = const bool;
>> +
>> +
>> +void F1(const int i);
>> +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'i' is
>> const-qualified in the function declaration; const-qualification of
>> parameters only has an effect in function definitions
>> [readability-avoid-const-params-in-decls]
>> +// CHECK-FIXES: void F1(int i);
>> +
>> +void F2(const int *const i);
>> +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'i' is
>> const-qualified
>> +// CHECK-FIXES: void F2(const int * i);
>> +
>> +void F3(int const i);
>> +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'i' is
>> const-qualified
>> +// CHECK-FIXES: void F3(int i);
>> +
>> +void F4(alias_type const i);
>> +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'i' is
>> const-qualified
>> +// CHECK-FIXES: void F4(alias_type i);
>> +
>> +void F5(const int);
>> +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 1 is
>> const-qualified
>> +// CHECK-FIXES: void F5(int);
>> +
>> +void F6(const int *const);
>> +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 1 is
>> const-qualified
>> +// BUG(b/27584482): void F6(const int *);  should be produced
>> +
>> +void F7(int, const int);
>> +// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: parameter 2 is
>> const-qualified
>> +// CHECK-FIXES: void F7(int, int);
>> +
>> +void F8(const int, const int);
>> +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 1 is
>> const-qualified
>> +// CHECK-MESSAGES: :[[@LINE-2]]:20: warning: parameter 2 is
>> const-qualified
>> +// CHECK-FIXES: void F8(int, int);
>> +
>> +void F9(const int long_name);
>> +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'long_name'
>> +// CHECK-FIXES: void F9(int long_name);
>> +
>> +void F10(const int *const *const long_name);
>> +// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: parameter 'long_name'
>> +// CHECK-FIXES: void F10(const int *const * long_name);
>> +
>> +
>> +struct Foo {
>> +  Foo(const int i);
>> +  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: parameter 'i'
>> +  // CHECK-FIXES: Foo(int i);
>> +
>> +  void operator()(const int i);
>> +  // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: parameter 'i'
>> +  // CHECK-FIXES: void operator()(int i);
>> +};
>> +
>> +// Do not match on definitions
>> +void NF1(const int i) {}
>> +void NF2(const int *const i) {}
>> +void NF3(int const i) {}
>> +void NF4(alias_type const i) {}
>> +void NF5(const int) {}
>> +void NF6(const int *const) {}
>> +void NF7(int, const int) {}
>> +void NF8(const int, const int) {}
>> +
>> +// Do not match on other stuff
>> +void NF(const alias_type& i);
>> +void NF(const int &i);
>> +void NF(const int *i);
>> +void NF(alias_const_type i);
>> +void NF(const alias_type&);
>> +void NF(const int&);
>> +void NF(const int*);
>> +void NF(const int* const*);
>> +void NF(alias_const_type);
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160330/e975b0d1/attachment-0001.html>


More information about the cfe-commits mailing list