I'm not particularly opposed to duplicating -Wold-style-cast in clang-tidy using ASTMatches because if nothing else, it's interesting to compare and contrast the two methods.

But please do add a brief comment explaining how this new check relates to the existing warning option in clang and whether the output locations are expected to match precisely, or if they differ, why that is.

Thanks


On 30/06/2014 01:19, Alexander Kornienko wrote:
Author: alexfh
Date: Sun Jun 29 17:19:53 2014
New Revision: 212002

URL: http://llvm.org/viewvc/llvm-project?rev=212002&view=rev
Log:
Another attempt to add a clang-tidy check for flagging C-style casts.

Summary:
The first version failed the SubstNonTypeTempateParmExpr-related test
on some buildbots. This one uses the new substNonTypeTempateParmExpr matcher to
filter out implicit C-style casts.

This patch depends on D4327.

Reviewers: djasper

Reviewed By: djasper

Subscribers: aemerson, cfe-commits

Differential Revision: http://reviews.llvm.org/D4328

Added:
     clang-tools-extra/trunk/clang-tidy/google/AvoidCStyleCastsCheck.cpp
     clang-tools-extra/trunk/clang-tidy/google/AvoidCStyleCastsCheck.h
     clang-tools-extra/trunk/test/clang-tidy/avoid-c-style-casts.cpp
Modified:
     clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt
     clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp

Added: clang-tools-extra/trunk/clang-tidy/google/AvoidCStyleCastsCheck.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/AvoidCStyleCastsCheck.cpp?rev=212002&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/google/AvoidCStyleCastsCheck.cpp (added)
+++ clang-tools-extra/trunk/clang-tidy/google/AvoidCStyleCastsCheck.cpp Sun Jun 
29 17:19:53 2014
@@ -0,0 +1,52 @@
+//===--- AvoidCStyleCastsCheck.cpp - clang-tidy -----------------*- C++ 
-*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "AvoidCStyleCastsCheck.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/ASTMatchers/ASTMatchers.h"
+
+using namespace clang::ast_matchers;
+
+namespace clang {
+namespace tidy {
+namespace readability {
+
+void
+AvoidCStyleCastsCheck::registerMatchers(ast_matchers::MatchFinder *Finder) {
+  Finder->addMatcher(
+      cStyleCastExpr(
+          // Filter out (EnumType)IntegerLiteral construct, which is generated
+          // for non-type template arguments of enum types.
+          // FIXME: Remove this once this is fixed in the AST.
+          unless(hasParent(substNonTypeTemplateParmExpr()))).bind("cast"),
+      this);
+}
+
+void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) {
+  const auto *CastExpr = Result.Nodes.getNodeAs<CStyleCastExpr>("cast");
+
+  // Ignore casts in macros for now.
+  if (CastExpr->getLocStart().isMacroID())
+    return;
+
+  // Casting to void is an idiomatic way to mute "unused variable" and similar
+  // warnings.
+  if (CastExpr->getTypeAsWritten()->isVoidType())
+    return;
+
+  diag(CastExpr->getLocStart(), "C-style casts are discouraged. Use "
+                                "static_cast/const_cast/reinterpret_cast "
+                                "instead.");
+  // FIXME: Suggest appropriate C++ cast. See [expr.cast] for cast notation
+  // semantics.
+}
+
+} // namespace readability
+} // namespace tidy
+} // namespace clang

Added: clang-tools-extra/trunk/clang-tidy/google/AvoidCStyleCastsCheck.h
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/AvoidCStyleCastsCheck.h?rev=212002&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/google/AvoidCStyleCastsCheck.h (added)
+++ clang-tools-extra/trunk/clang-tidy/google/AvoidCStyleCastsCheck.h Sun Jun 
29 17:19:53 2014
@@ -0,0 +1,33 @@
+//===--- AvoidCStyleCastsCheck.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_GOOGLE_AVOID_C_STYLE_CASTS_CHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_AVOID_C_STYLE_CASTS_CHECK_H
+
+#include "../ClangTidy.h"
+
+namespace clang {
+namespace tidy {
+namespace readability {
+
+/// \brief Finds usages of C-style casts.
+///
+/// 
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Casting#Casting
+/// Corresponding cpplint.py check name: 'readability/casting'.
+class AvoidCStyleCastsCheck : public ClangTidyCheck {
+public:
+  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_GOOGLE_AVOID_C_STYLE_CASTS_CHECK_H

Modified: clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt?rev=212002&r1=212001&r2=212002&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/clang-tidy/google/CMakeLists.txt Sun Jun 29 
17:19:53 2014
@@ -1,6 +1,7 @@
  set(LLVM_LINK_COMPONENTS support)
add_clang_library(clangTidyGoogleModule
+  AvoidCStyleCastsCheck.cpp
    ExplicitConstructorCheck.cpp
    GoogleTidyModule.cpp
Modified: clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp?rev=212002&r1=212001&r2=212002&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/google/GoogleTidyModule.cpp Sun Jun 29 
17:19:53 2014
@@ -10,6 +10,7 @@
  #include "../ClangTidy.h"
  #include "../ClangTidyModule.h"
  #include "../ClangTidyModuleRegistry.h"
+#include "AvoidCStyleCastsCheck.h"
  #include "ExplicitConstructorCheck.h"
using namespace clang::ast_matchers;
@@ -23,6 +24,9 @@ public:
      CheckFactories.addCheckFactory(
          "google-explicit-constructor",
          new ClangTidyCheckFactory<ExplicitConstructorCheck>());
+    CheckFactories.addCheckFactory(
+        "google-readability-casting",
+        new ClangTidyCheckFactory<readability::AvoidCStyleCastsCheck>());
    }
  };
Added: clang-tools-extra/trunk/test/clang-tidy/avoid-c-style-casts.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/avoid-c-style-casts.cpp?rev=212002&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/avoid-c-style-casts.cpp (added)
+++ clang-tools-extra/trunk/test/clang-tidy/avoid-c-style-casts.cpp Sun Jun 29 
17:19:53 2014
@@ -0,0 +1,24 @@
+// RUN: clang-tidy -checks=-*,google-readability-casting %s -- | FileCheck %s
+
+// CHECK-NOT: warning:
+
+bool g() { return false; }
+
+void f(int a, double b) {
+  int b1 = (int)b;
+  // CHECK: :[[@LINE-1]]:12: warning: C-style casts are discouraged. Use 
static_cast{{.*}}
+
+  // CHECK-NOT: warning:
+  int b2 = int(b);
+  int b3 = static_cast<double>(b);
+  int b4 = b;
+  double aa = a;
+  (void)b2;
+  return (void)g();
+}
+
+// CHECK-NOT: warning:
+enum E { E1 = 1 };
+template <E e>
+struct A { static const E ee = e; };
+struct B : public A<E1> {};


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

--
http://www.nuanti.com
the browser experts

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to