omtcyfz created this revision.
omtcyfz added reviewers: alexfh, aaron.ballman, ioeric.
omtcyfz added a subscriber: cfe-commits.
Herald added subscribers: mgorny, beanz, nemanjai.
C++ Core Guidelines Section "Expressions and statements" Suggestion 10 proposes
to split declarations with multiple names into multiple single declarations.
See the following example.
Example, bad.
```
std::vector<int> velocities(10, 0), numbers(other_numbers),
inputs(input.begin(), input.end());
```
Example, good.
```
std::vector<int> velocities(10, 0);
std::vector<int> numbers(other_numbers);
std::vector<int> inputs(input.begin(), input.end());
```
http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#a-nameres-name-oneaes10-declare-one-name-only-per-declaration
https://reviews.llvm.org/D25024
Files:
clang-tidy/cppcoreguidelines/CMakeLists.txt
clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp
clang-tidy/cppcoreguidelines/OneNamePerDeclarationCheck.cpp
clang-tidy/cppcoreguidelines/OneNamePerDeclarationCheck.h
docs/clang-tidy/checks/cppcoreguidelines-one-name-per-declaration.rst
docs/clang-tidy/checks/list.rst
test/clang-tidy/cppcoreguidelines-one-name-per-declaration.cpp
Index: test/clang-tidy/cppcoreguidelines-one-name-per-declaration.cpp
===================================================================
--- /dev/null
+++ test/clang-tidy/cppcoreguidelines-one-name-per-declaration.cpp
@@ -0,0 +1,16 @@
+// RUN: %check_clang_tidy %s cppcoreguidelines-one-name-per-declaration %t
+
+int main() {
+ {
+ int x = 42;
+ }
+ {
+ int x = 42, y = 43;
+ // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Do not declare multiple names per declaration [cppcoreguidelines-one-name-per-declaration]
+ }
+ {
+ int x = 42, y = 43, z = 44;
+ // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Do not declare multiple names per declaration
+ }
+ return 0;
+}
Index: docs/clang-tidy/checks/list.rst
===================================================================
--- docs/clang-tidy/checks/list.rst
+++ docs/clang-tidy/checks/list.rst
@@ -19,6 +19,7 @@
cert-flp30-c
cert-oop11-cpp (redirects to misc-move-constructor-init) <cert-oop11-cpp>
cppcoreguidelines-interfaces-global-init
+ cppcoreguidelines-one-name-per-declaration
cppcoreguidelines-pro-bounds-array-to-pointer-decay
cppcoreguidelines-pro-bounds-constant-array-index
cppcoreguidelines-pro-bounds-pointer-arithmetic
Index: docs/clang-tidy/checks/cppcoreguidelines-one-name-per-declaration.rst
===================================================================
--- /dev/null
+++ docs/clang-tidy/checks/cppcoreguidelines-one-name-per-declaration.rst
@@ -0,0 +1,29 @@
+.. title:: clang-tidy - cppcoreguidelines-one-name-per-declaration
+
+cppcoreguidelines-one-name-per-declaration
+==========================================
+
+Checks for declarations with multiple names. C++ Core Guidelines suggests to
+split such declarations into multiple declarations each containing one name.
+
+This would improve readability and prevents potential bugs caused by inattention
+and C/C++ syntax specifics.
+
+Example, bad.
+
+.. code-block:: c++
+
+ std::vector<int> velocities(10, 0), numbers(other_numbers),
+ inputs(input.begin(), input.end());
+
+Example, good.
+
+.. code-block:: c++
+
+ std::vector<int> velocities(10, 0);
+ std::vector<int> numbers(other_numbers);
+ std::vector<int> inputs(input.begin(), input.end());
+
+This rule is part of the "Expressions and statements" profile of the C++ Core
+Guidelines, see
+http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#a-nameres-name-oneaes10-declare-one-name-only-per-declaration
Index: clang-tidy/cppcoreguidelines/OneNamePerDeclarationCheck.h
===================================================================
--- /dev/null
+++ clang-tidy/cppcoreguidelines/OneNamePerDeclarationCheck.h
@@ -0,0 +1,35 @@
+//===--- OneNamePerDeclarationCheck.h - clang-tidy---------------*- C++ -*-===//
+//
+// 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_CPPCOREGUIDELINES_ONE_NAME_PER_DECLARATION_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_ONE_NAME_PER_DECLARATION_H
+
+#include "../ClangTidy.h"
+
+namespace clang {
+namespace tidy {
+namespace cppcoreguidelines {
+
+/// This check warns about multiple names in one declaration.
+///
+/// For the user-facing documentation see:
+/// http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-one-name-per-declaration.html
+class OneNamePerDeclarationCheck : public ClangTidyCheck {
+public:
+ OneNamePerDeclarationCheck(StringRef Name, ClangTidyContext *Context)
+ : ClangTidyCheck(Name, Context) {}
+ void registerMatchers(ast_matchers::MatchFinder *Finder) override;
+ void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+};
+
+} // namespace cppcoreguidelines
+} // namespace tidy
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_ONE_NAME_PER_DECLARATION_H
Index: clang-tidy/cppcoreguidelines/OneNamePerDeclarationCheck.cpp
===================================================================
--- /dev/null
+++ clang-tidy/cppcoreguidelines/OneNamePerDeclarationCheck.cpp
@@ -0,0 +1,51 @@
+//===--- OneNamePerDeclarationCheck.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 "OneNamePerDeclarationCheck.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+
+using namespace clang::ast_matchers;
+
+namespace clang {
+namespace tidy {
+namespace cppcoreguidelines {
+
+namespace {
+
+AST_MATCHER_P(DeclStmt, declCountIsGreaterThan, unsigned, N) {
+ return std::distance(Node.decl_begin(), Node.decl_end()) > (ptrdiff_t)N;
+}
+
+} // end anonymous namespace
+
+void OneNamePerDeclarationCheck::registerMatchers(MatchFinder *Finder) {
+ Finder->addMatcher(
+ declStmt(declCountIsGreaterThan(1)).bind("multipleNameDeclaration"),
+ this);
+}
+
+void OneNamePerDeclarationCheck::check(const MatchFinder::MatchResult &Result) {
+ // FIXME: Also provide diagnostics splitting the declarations. E.g.
+ //
+ // Before:
+ // int x = 42, y = 43, z = 44;
+ // After:
+ // int x = 42;
+ // int y = 43;
+ // int z = 44;
+ const auto *MultipleNameDeclaration =
+ Result.Nodes.getNodeAs<DeclStmt>("multipleNameDeclaration");
+ diag(MultipleNameDeclaration->getStartLoc(),
+ "Do not declare multiple names per declaration");
+}
+
+} // namespace cppcoreguidelines
+} // namespace tidy
+} // namespace clang
Index: clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp
===================================================================
--- clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp
+++ clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp
@@ -12,6 +12,7 @@
#include "../ClangTidyModuleRegistry.h"
#include "../misc/UnconventionalAssignOperatorCheck.h"
#include "InterfacesGlobalInitCheck.h"
+#include "OneNamePerDeclarationCheck.h"
#include "ProBoundsArrayToPointerDecayCheck.h"
#include "ProBoundsConstantArrayIndexCheck.h"
#include "ProBoundsPointerArithmeticCheck.h"
@@ -35,6 +36,8 @@
void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
CheckFactories.registerCheck<InterfacesGlobalInitCheck>(
"cppcoreguidelines-interfaces-global-init");
+ CheckFactories.registerCheck<OneNamePerDeclarationCheck>(
+ "cppcoreguidelines-one-name-per-declaration");
CheckFactories.registerCheck<ProBoundsArrayToPointerDecayCheck>(
"cppcoreguidelines-pro-bounds-array-to-pointer-decay");
CheckFactories.registerCheck<ProBoundsConstantArrayIndexCheck>(
Index: clang-tidy/cppcoreguidelines/CMakeLists.txt
===================================================================
--- clang-tidy/cppcoreguidelines/CMakeLists.txt
+++ clang-tidy/cppcoreguidelines/CMakeLists.txt
@@ -3,6 +3,7 @@
add_clang_library(clangTidyCppCoreGuidelinesModule
CppCoreGuidelinesTidyModule.cpp
InterfacesGlobalInitCheck.cpp
+ OneNamePerDeclarationCheck.cpp
ProBoundsArrayToPointerDecayCheck.cpp
ProBoundsConstantArrayIndexCheck.cpp
ProBoundsPointerArithmeticCheck.cpp
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits