[clang-tools-extra] r327606 - [clang-tidy] rename_check.py {misc, bugprone}-macro-parentheses

Alexander Kornienko via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 15 01:25:39 PDT 2018


Author: alexfh
Date: Thu Mar 15 01:25:39 2018
New Revision: 327606

URL: http://llvm.org/viewvc/llvm-project?rev=327606&view=rev
Log:
[clang-tidy] rename_check.py {misc,bugprone}-macro-parentheses

Added:
    clang-tools-extra/trunk/clang-tidy/bugprone/MacroParenthesesCheck.cpp
      - copied, changed from r327590, clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.cpp
    clang-tools-extra/trunk/clang-tidy/bugprone/MacroParenthesesCheck.h
      - copied, changed from r327590, clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.h
    clang-tools-extra/trunk/docs/clang-tidy/checks/bugprone-macro-parentheses.rst
      - copied, changed from r327590, clang-tools-extra/trunk/docs/clang-tidy/checks/misc-macro-parentheses.rst
    clang-tools-extra/trunk/test/clang-tidy/bugprone-macro-parentheses-cmdline.cpp
      - copied, changed from r327590, clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses-cmdline.cpp
    clang-tools-extra/trunk/test/clang-tidy/bugprone-macro-parentheses.cpp
      - copied, changed from r327590, clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses.cpp
Removed:
    clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.cpp
    clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.h
    clang-tools-extra/trunk/docs/clang-tidy/checks/misc-macro-parentheses.rst
    clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses-cmdline.cpp
    clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses.cpp
Modified:
    clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp
    clang-tools-extra/trunk/clang-tidy/bugprone/CMakeLists.txt
    clang-tools-extra/trunk/clang-tidy/misc/CMakeLists.txt
    clang-tools-extra/trunk/clang-tidy/misc/MiscTidyModule.cpp
    clang-tools-extra/trunk/docs/ReleaseNotes.rst
    clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst

Modified: clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp?rev=327606&r1=327605&r2=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp Thu Mar 15 01:25:39 2018
@@ -22,6 +22,7 @@
 #include "IncorrectRoundingsCheck.h"
 #include "IntegerDivisionCheck.h"
 #include "LambdaFunctionNameCheck.h"
+#include "MacroParenthesesCheck.h"
 #include "MacroRepeatedSideEffectsCheck.h"
 #include "MisplacedOperatorInStrlenInAllocCheck.h"
 #include "MisplacedWideningCastCheck.h"
@@ -73,6 +74,8 @@ public:
         "bugprone-integer-division");
     CheckFactories.registerCheck<LambdaFunctionNameCheck>(
         "bugprone-lambda-function-name");
+    CheckFactories.registerCheck<MacroParenthesesCheck>(
+        "bugprone-macro-parentheses");
     CheckFactories.registerCheck<MacroRepeatedSideEffectsCheck>(
         "bugprone-macro-repeated-side-effects");
     CheckFactories.registerCheck<MisplacedOperatorInStrlenInAllocCheck>(

Modified: clang-tools-extra/trunk/clang-tidy/bugprone/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/CMakeLists.txt?rev=327606&r1=327605&r2=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/bugprone/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/clang-tidy/bugprone/CMakeLists.txt Thu Mar 15 01:25:39 2018
@@ -14,6 +14,7 @@ add_clang_library(clangTidyBugproneModul
   IncorrectRoundingsCheck.cpp
   IntegerDivisionCheck.cpp
   LambdaFunctionNameCheck.cpp
+  MacroParenthesesCheck.cpp
   MacroRepeatedSideEffectsCheck.cpp
   MisplacedOperatorInStrlenInAllocCheck.cpp
   MisplacedWideningCastCheck.cpp

Copied: clang-tools-extra/trunk/clang-tidy/bugprone/MacroParenthesesCheck.cpp (from r327590, clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.cpp)
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/MacroParenthesesCheck.cpp?p2=clang-tools-extra/trunk/clang-tidy/bugprone/MacroParenthesesCheck.cpp&p1=clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.cpp&r1=327590&r2=327606&rev=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/bugprone/MacroParenthesesCheck.cpp Thu Mar 15 01:25:39 2018
@@ -14,7 +14,7 @@
 
 namespace clang {
 namespace tidy {
-namespace misc {
+namespace bugprone {
 
 namespace {
 class MacroParenthesesPPCallbacks : public PPCallbacks {
@@ -255,6 +255,6 @@ void MacroParenthesesCheck::registerPPCa
           &Compiler.getPreprocessor(), this));
 }
 
-} // namespace misc
+} // namespace bugprone
 } // namespace tidy
 } // namespace clang

Copied: clang-tools-extra/trunk/clang-tidy/bugprone/MacroParenthesesCheck.h (from r327590, clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.h)
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/MacroParenthesesCheck.h?p2=clang-tools-extra/trunk/clang-tidy/bugprone/MacroParenthesesCheck.h&p1=clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.h&r1=327590&r2=327606&rev=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.h (original)
+++ clang-tools-extra/trunk/clang-tidy/bugprone/MacroParenthesesCheck.h Thu Mar 15 01:25:39 2018
@@ -7,14 +7,14 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_MACRO_PARENTHESES_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_MACRO_PARENTHESES_H
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_MACROPARENTHESESCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_MACROPARENTHESESCHECK_H
 
 #include "../ClangTidy.h"
 
 namespace clang {
 namespace tidy {
-namespace misc {
+namespace bugprone {
 
 /// Finds macros that can have unexpected behaviour due to missing parentheses.
 ///
@@ -36,8 +36,8 @@ public:
   void registerPPCallbacks(CompilerInstance &Compiler) override;
 };
 
-} // namespace misc
+} // namespace bugprone
 } // namespace tidy
 } // namespace clang
 
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_MACRO_PARENTHESES_H
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_MACROPARENTHESESCHECK_H

Modified: clang-tools-extra/trunk/clang-tidy/misc/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/CMakeLists.txt?rev=327606&r1=327605&r2=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/misc/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/clang-tidy/misc/CMakeLists.txt Thu Mar 15 01:25:39 2018
@@ -4,7 +4,6 @@ add_clang_library(clangTidyMiscModule
   MisplacedConstCheck.cpp
   UnconventionalAssignOperatorCheck.cpp
   DefinitionsInHeadersCheck.cpp
-  MacroParenthesesCheck.cpp
   MiscTidyModule.cpp
   NewDeleteOverloadsCheck.cpp
   NonCopyableObjects.cpp

Removed: clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.cpp?rev=327605&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.cpp (removed)
@@ -1,260 +0,0 @@
-//===--- MacroParenthesesCheck.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 "MacroParenthesesCheck.h"
-#include "clang/Frontend/CompilerInstance.h"
-#include "clang/Lex/PPCallbacks.h"
-#include "clang/Lex/Preprocessor.h"
-
-namespace clang {
-namespace tidy {
-namespace misc {
-
-namespace {
-class MacroParenthesesPPCallbacks : public PPCallbacks {
-public:
-  MacroParenthesesPPCallbacks(Preprocessor *PP, MacroParenthesesCheck *Check)
-      : PP(PP), Check(Check) {}
-
-  void MacroDefined(const Token &MacroNameTok,
-                    const MacroDirective *MD) override {
-    replacementList(MacroNameTok, MD->getMacroInfo());
-    argument(MacroNameTok, MD->getMacroInfo());
-  }
-
-private:
-  /// Replacement list with calculations should be enclosed in parentheses.
-  void replacementList(const Token &MacroNameTok, const MacroInfo *MI);
-
-  /// Arguments should be enclosed in parentheses.
-  void argument(const Token &MacroNameTok, const MacroInfo *MI);
-
-  Preprocessor *PP;
-  MacroParenthesesCheck *Check;
-};
-} // namespace
-
-/// Is argument surrounded properly with parentheses/braces/squares/commas?
-static bool isSurroundedLeft(const Token &T) {
-  return T.isOneOf(tok::l_paren, tok::l_brace, tok::l_square, tok::comma,
-                   tok::semi);
-}
-
-/// Is argument surrounded properly with parentheses/braces/squares/commas?
-static bool isSurroundedRight(const Token &T) {
-  return T.isOneOf(tok::r_paren, tok::r_brace, tok::r_square, tok::comma,
-                   tok::semi);
-}
-
-/// Is given TokenKind a keyword?
-static bool isKeyword(const Token &T) {
-  // FIXME: better matching of keywords to avoid false positives.
-  return T.isOneOf(tok::kw_case, tok::kw_const, tok::kw_struct);
-}
-
-/// Warning is written when one of these operators are not within parentheses.
-static bool isWarnOp(const Token &T) {
-  // FIXME: This is an initial list of operators. It can be tweaked later to
-  // get more positives or perhaps avoid some false positive.
-  return T.isOneOf(tok::plus, tok::minus, tok::star, tok::slash, tok::percent,
-                   tok::amp, tok::pipe, tok::caret);
-}
-
-/// Is given Token a keyword that is used in variable declarations?
-static bool isVarDeclKeyword(const Token &T) {
-  return T.isOneOf(tok::kw_bool, tok::kw_char, tok::kw_short, tok::kw_int,
-                   tok::kw_long, tok::kw_float, tok::kw_double, tok::kw_const,
-                   tok::kw_enum, tok::kw_inline, tok::kw_static, tok::kw_struct,
-                   tok::kw_signed, tok::kw_unsigned);
-}
-
-/// Is there a possible variable declaration at Tok?
-static bool possibleVarDecl(const MacroInfo *MI, const Token *Tok) {
-  if (Tok == MI->tokens_end())
-    return false;
-
-  // If we see int/short/struct/etc., just assume this is a variable
-  // declaration.
-  if (isVarDeclKeyword(*Tok))
-    return true;
-
-  // Variable declarations start with identifier or coloncolon.
-  if (!Tok->isOneOf(tok::identifier, tok::raw_identifier, tok::coloncolon))
-    return false;
-
-  // Skip possible types, etc
-  while (Tok != MI->tokens_end() &&
-         Tok->isOneOf(tok::identifier, tok::raw_identifier, tok::coloncolon,
-                      tok::star, tok::amp, tok::ampamp, tok::less,
-                      tok::greater))
-    Tok++;
-
-  // Return true for possible variable declarations.
-  return Tok == MI->tokens_end() ||
-         Tok->isOneOf(tok::equal, tok::semi, tok::l_square, tok::l_paren) ||
-         isVarDeclKeyword(*Tok);
-}
-
-void MacroParenthesesPPCallbacks::replacementList(const Token &MacroNameTok,
-                                                  const MacroInfo *MI) {
-  // Make sure macro replacement isn't a variable declaration.
-  if (possibleVarDecl(MI, MI->tokens_begin()))
-    return;
-
-  // Count how deep we are in parentheses/braces/squares.
-  int Count = 0;
-
-  // SourceLocation for error
-  SourceLocation Loc;
-
-  for (auto TI = MI->tokens_begin(), TE = MI->tokens_end(); TI != TE; ++TI) {
-    const Token &Tok = *TI;
-    // Replacement list contains keywords, don't warn about it.
-    if (isKeyword(Tok))
-      return;
-    // When replacement list contains comma/semi don't warn about it.
-    if (Count == 0 && Tok.isOneOf(tok::comma, tok::semi))
-      return;
-    if (Tok.isOneOf(tok::l_paren, tok::l_brace, tok::l_square)) {
-      ++Count;
-    } else if (Tok.isOneOf(tok::r_paren, tok::r_brace, tok::r_square)) {
-      --Count;
-      // If there are unbalanced parentheses don't write any warning
-      if (Count < 0)
-        return;
-    } else if (Count == 0 && isWarnOp(Tok)) {
-      // Heuristic for macros that are clearly not intended to be enclosed in
-      // parentheses, macro starts with operator. For example:
-      // #define X     *10
-      if (TI == MI->tokens_begin() && (TI + 1) != TE &&
-          !Tok.isOneOf(tok::plus, tok::minus))
-        return;
-      // Don't warn about this macro if the last token is a star. For example:
-      // #define X    void *
-      if ((TE - 1)->is(tok::star))
-        return;
-
-      Loc = Tok.getLocation();
-    }
-  }
-  if (Loc.isValid()) {
-    const Token &Last = *(MI->tokens_end() - 1);
-    Check->diag(Loc, "macro replacement list should be enclosed in parentheses")
-        << FixItHint::CreateInsertion(MI->tokens_begin()->getLocation(), "(")
-        << FixItHint::CreateInsertion(Last.getLocation().getLocWithOffset(
-                                          PP->getSpelling(Last).length()),
-                                      ")");
-  }
-}
-
-void MacroParenthesesPPCallbacks::argument(const Token &MacroNameTok,
-                                           const MacroInfo *MI) {
-
-  // Skip variable declaration.
-  bool VarDecl = possibleVarDecl(MI, MI->tokens_begin());
-
-  for (auto TI = MI->tokens_begin(), TE = MI->tokens_end(); TI != TE; ++TI) {
-    // First token.
-    if (TI == MI->tokens_begin())
-      continue;
-
-    // Last token.
-    if ((TI + 1) == MI->tokens_end())
-      continue;
-
-    const Token &Prev = *(TI - 1);
-    const Token &Next = *(TI + 1);
-
-    const Token &Tok = *TI;
-
-    // There should not be extra parentheses in possible variable declaration.
-    if (VarDecl) {
-      if (Tok.isOneOf(tok::equal, tok::semi, tok::l_square, tok::l_paren))
-        VarDecl = false;
-      continue;
-    }
-
-    // Only interested in identifiers.
-    if (!Tok.isOneOf(tok::identifier, tok::raw_identifier))
-      continue;
-
-    // Only interested in macro arguments.
-    if (MI->getParameterNum(Tok.getIdentifierInfo()) < 0)
-      continue;
-
-    // Argument is surrounded with parentheses/squares/braces/commas.
-    if (isSurroundedLeft(Prev) && isSurroundedRight(Next))
-      continue;
-
-    // Don't warn after hash/hashhash or before hashhash.
-    if (Prev.isOneOf(tok::hash, tok::hashhash) || Next.is(tok::hashhash))
-      continue;
-
-    // Argument is a struct member.
-    if (Prev.isOneOf(tok::period, tok::arrow, tok::coloncolon, tok::arrowstar,
-                     tok::periodstar))
-      continue;
-
-    // Argument is a namespace or class.
-    if (Next.is(tok::coloncolon))
-      continue;
-
-    // String concatenation.
-    if (isStringLiteral(Prev.getKind()) || isStringLiteral(Next.getKind()))
-      continue;
-
-    // Type/Var.
-    if (isAnyIdentifier(Prev.getKind()) || isKeyword(Prev) ||
-        isAnyIdentifier(Next.getKind()) || isKeyword(Next))
-      continue;
-
-    // Initialization.
-    if (Next.is(tok::l_paren))
-      continue;
-
-    // Cast.
-    if (Prev.is(tok::l_paren) && Next.is(tok::star) &&
-        TI + 2 != MI->tokens_end() && (TI + 2)->is(tok::r_paren))
-      continue;
-
-    // Assignment/return, i.e. '=x;' or 'return x;'.
-    if (Prev.isOneOf(tok::equal, tok::kw_return) && Next.is(tok::semi))
-      continue;
-
-    // C++ template parameters.
-    if (PP->getLangOpts().CPlusPlus && Prev.isOneOf(tok::comma, tok::less) &&
-        Next.isOneOf(tok::comma, tok::greater))
-      continue;
-
-    // Namespaces.
-    if (Prev.is(tok::kw_namespace))
-      continue;
-
-    // Variadic templates
-    if (MI->isVariadic())
-      continue;
-
-    Check->diag(Tok.getLocation(), "macro argument should be enclosed in "
-                                   "parentheses")
-        << FixItHint::CreateInsertion(Tok.getLocation(), "(")
-        << FixItHint::CreateInsertion(Tok.getLocation().getLocWithOffset(
-                                          PP->getSpelling(Tok).length()),
-                                      ")");
-  }
-}
-
-void MacroParenthesesCheck::registerPPCallbacks(CompilerInstance &Compiler) {
-  Compiler.getPreprocessor().addPPCallbacks(
-      llvm::make_unique<MacroParenthesesPPCallbacks>(
-          &Compiler.getPreprocessor(), this));
-}
-
-} // namespace misc
-} // namespace tidy
-} // namespace clang

Removed: clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.h?rev=327605&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.h (original)
+++ clang-tools-extra/trunk/clang-tidy/misc/MacroParenthesesCheck.h (removed)
@@ -1,43 +0,0 @@
-//===--- MacroParenthesesCheck.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_MISC_MACRO_PARENTHESES_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_MACRO_PARENTHESES_H
-
-#include "../ClangTidy.h"
-
-namespace clang {
-namespace tidy {
-namespace misc {
-
-/// Finds macros that can have unexpected behaviour due to missing parentheses.
-///
-/// Macros are expanded by the preprocessor as-is. As a result, there can be
-/// unexpected behaviour; operators may be evaluated in unexpected order and
-/// unary operators may become binary operators, etc.
-///
-/// When the replacement list has an expression, it is recommended to surround
-/// it with parentheses. This ensures that the macro result is evaluated
-/// completely before it is used.
-///
-/// It is also recommended to surround macro arguments in the replacement list
-/// with parentheses. This ensures that the argument value is calculated
-/// properly.
-class MacroParenthesesCheck : public ClangTidyCheck {
-public:
-  MacroParenthesesCheck(StringRef Name, ClangTidyContext *Context)
-      : ClangTidyCheck(Name, Context) {}
-  void registerPPCallbacks(CompilerInstance &Compiler) override;
-};
-
-} // namespace misc
-} // namespace tidy
-} // namespace clang
-
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_MACRO_PARENTHESES_H

Modified: clang-tools-extra/trunk/clang-tidy/misc/MiscTidyModule.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/MiscTidyModule.cpp?rev=327606&r1=327605&r2=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/misc/MiscTidyModule.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/misc/MiscTidyModule.cpp Thu Mar 15 01:25:39 2018
@@ -11,7 +11,6 @@
 #include "../ClangTidyModule.h"
 #include "../ClangTidyModuleRegistry.h"
 #include "DefinitionsInHeadersCheck.h"
-#include "MacroParenthesesCheck.h"
 #include "MisplacedConstCheck.h"
 #include "NewDeleteOverloadsCheck.h"
 #include "NonCopyableObjects.h"
@@ -39,8 +38,6 @@ public:
         "misc-unconventional-assign-operator");
     CheckFactories.registerCheck<DefinitionsInHeadersCheck>(
         "misc-definitions-in-headers");
-    CheckFactories.registerCheck<MacroParenthesesCheck>(
-        "misc-macro-parentheses");
     CheckFactories.registerCheck<NewDeleteOverloadsCheck>(
         "misc-new-delete-overloads");
     CheckFactories.registerCheck<NonCopyableObjectsCheck>(

Modified: clang-tools-extra/trunk/docs/ReleaseNotes.rst
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/ReleaseNotes.rst?rev=327606&r1=327605&r2=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/docs/ReleaseNotes.rst (original)
+++ clang-tools-extra/trunk/docs/ReleaseNotes.rst Thu Mar 15 01:25:39 2018
@@ -94,12 +94,12 @@ Improvements to clang-tidy
   Warns if global, non-trivial objects with static storage are constructed,
   unless the object is statically initialized with a ``constexpr`` constructor
   or has no explicit constructor.
-  
+
 - New `fuchsia-trailing-return
   <http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-trailing-return.html>`_ check
 
-  Functions that have trailing returns are disallowed, except for those 
-  using ``decltype`` specifiers and lambda with otherwise unutterable 
+  Functions that have trailing returns are disallowed, except for those
+  using ``decltype`` specifiers and lambda with otherwise unutterable
   return types.
 
 - New `modernize-use-uncaught-exceptions
@@ -128,6 +128,9 @@ Improvements to clang-tidy
 - The 'misc-lambda-function-name' check was renamed to `bugprone-lambda-function-name
   <http://clang.llvm.org/extra/clang-tidy/checks/bugprone-lambda-function-name.html>`_
 
+- The 'misc-macro-parentheses' check was renamed to `bugprone-macro-parentheses
+  <http://clang.llvm.org/extra/clang-tidy/checks/bugprone-macro-parentheses.html>`_
+
 - The 'misc-macro-repeated-side-effects' check was renamed to `bugprone-macro-repeated-side-effects
   <http://clang.llvm.org/extra/clang-tidy/checks/bugprone-macro-repeated-side-effects.html>`_
 

Copied: clang-tools-extra/trunk/docs/clang-tidy/checks/bugprone-macro-parentheses.rst (from r327590, clang-tools-extra/trunk/docs/clang-tidy/checks/misc-macro-parentheses.rst)
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/bugprone-macro-parentheses.rst?p2=clang-tools-extra/trunk/docs/clang-tidy/checks/bugprone-macro-parentheses.rst&p1=clang-tools-extra/trunk/docs/clang-tidy/checks/misc-macro-parentheses.rst&r1=327590&r2=327606&rev=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/docs/clang-tidy/checks/misc-macro-parentheses.rst (original)
+++ clang-tools-extra/trunk/docs/clang-tidy/checks/bugprone-macro-parentheses.rst Thu Mar 15 01:25:39 2018
@@ -1,7 +1,7 @@
-.. title:: clang-tidy - misc-macro-parentheses
+.. title:: clang-tidy - bugprone-macro-parentheses
 
-misc-macro-parentheses
-======================
+bugprone-macro-parentheses
+==========================
 
 
 Finds macros that can have unexpected behaviour due to missing parentheses.

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=327606&r1=327605&r2=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst (original)
+++ clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Thu Mar 15 01:25:39 2018
@@ -30,6 +30,7 @@ Clang-Tidy Checks
    bugprone-incorrect-roundings
    bugprone-integer-division
    bugprone-lambda-function-name
+   bugprone-macro-parentheses
    bugprone-macro-repeated-side-effects
    bugprone-misplaced-operator-in-strlen-in-alloc
    bugprone-misplaced-widening-cast
@@ -140,7 +141,6 @@ Clang-Tidy Checks
    llvm-namespace-comment
    llvm-twine-local
    misc-definitions-in-headers
-   misc-macro-parentheses
    misc-misplaced-const
    misc-new-delete-overloads
    misc-non-copyable-objects

Removed: clang-tools-extra/trunk/docs/clang-tidy/checks/misc-macro-parentheses.rst
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/misc-macro-parentheses.rst?rev=327605&view=auto
==============================================================================
--- clang-tools-extra/trunk/docs/clang-tidy/checks/misc-macro-parentheses.rst (original)
+++ clang-tools-extra/trunk/docs/clang-tidy/checks/misc-macro-parentheses.rst (removed)
@@ -1,19 +0,0 @@
-.. title:: clang-tidy - misc-macro-parentheses
-
-misc-macro-parentheses
-======================
-
-
-Finds macros that can have unexpected behaviour due to missing parentheses.
-
-Macros are expanded by the preprocessor as-is. As a result, there can be
-unexpected behaviour; operators may be evaluated in unexpected order and
-unary operators may become binary operators, etc.
-
-When the replacement list has an expression, it is recommended to surround
-it with parentheses. This ensures that the macro result is evaluated
-completely before it is used.
-
-It is also recommended to surround macro arguments in the replacement list
-with parentheses. This ensures that the argument value is calculated
-properly.

Copied: clang-tools-extra/trunk/test/clang-tidy/bugprone-macro-parentheses-cmdline.cpp (from r327590, clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses-cmdline.cpp)
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/bugprone-macro-parentheses-cmdline.cpp?p2=clang-tools-extra/trunk/test/clang-tidy/bugprone-macro-parentheses-cmdline.cpp&p1=clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses-cmdline.cpp&r1=327590&r2=327606&rev=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses-cmdline.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/bugprone-macro-parentheses-cmdline.cpp Thu Mar 15 01:25:39 2018
@@ -1,4 +1,4 @@
-// RUN: %check_clang_tidy %s misc-macro-parentheses %t -- -- -DVAL=0+0
+// RUN: %check_clang_tidy %s bugprone-macro-parentheses %t -- -- -DVAL=0+0
 
 // The previous command-line is producing warnings and fixes with the source
 // locations from a virtual buffer. VAL is replaced by '0+0'.

Copied: clang-tools-extra/trunk/test/clang-tidy/bugprone-macro-parentheses.cpp (from r327590, clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses.cpp)
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/bugprone-macro-parentheses.cpp?p2=clang-tools-extra/trunk/test/clang-tidy/bugprone-macro-parentheses.cpp&p1=clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses.cpp&r1=327590&r2=327606&rev=327606&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/bugprone-macro-parentheses.cpp Thu Mar 15 01:25:39 2018
@@ -1,15 +1,15 @@
-// RUN: %check_clang_tidy %s misc-macro-parentheses %t
+// RUN: %check_clang_tidy %s bugprone-macro-parentheses %t
 
 #define BAD1              -1
-// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: macro replacement list should be enclosed in parentheses [misc-macro-parentheses]
+// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: macro replacement list should be enclosed in parentheses [bugprone-macro-parentheses]
 #define BAD2              1+2
-// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: macro replacement list should be enclosed in parentheses [misc-macro-parentheses]
+// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: macro replacement list should be enclosed in parentheses [bugprone-macro-parentheses]
 #define BAD3(A)           (A+1)
-// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: macro argument should be enclosed in parentheses [misc-macro-parentheses]
+// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: macro argument should be enclosed in parentheses [bugprone-macro-parentheses]
 #define BAD4(x)           ((unsigned char)(x & 0xff))
-// CHECK-MESSAGES: :[[@LINE-1]]:44: warning: macro argument should be enclosed in parentheses [misc-macro-parentheses]
+// CHECK-MESSAGES: :[[@LINE-1]]:44: warning: macro argument should be enclosed in parentheses [bugprone-macro-parentheses]
 #define BAD5(X)           A*B=(C*)X+2
-// CHECK-MESSAGES: :[[@LINE-1]]:35: warning: macro argument should be enclosed in parentheses [misc-macro-parentheses]
+// CHECK-MESSAGES: :[[@LINE-1]]:35: warning: macro argument should be enclosed in parentheses [bugprone-macro-parentheses]
 
 #define GOOD1             1
 #define GOOD2             (1+2)

Removed: clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses-cmdline.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses-cmdline.cpp?rev=327605&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses-cmdline.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses-cmdline.cpp (removed)
@@ -1,10 +0,0 @@
-// RUN: %check_clang_tidy %s misc-macro-parentheses %t -- -- -DVAL=0+0
-
-// The previous command-line is producing warnings and fixes with the source
-// locations from a virtual buffer. VAL is replaced by '0+0'.
-// Fixes could not be applied and should not be reported.
-int foo() { return VAL; }
-
-#define V 0+0
-int bar() { return V; }
-// CHECK-FIXES: #define V (0+0)

Removed: clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses.cpp?rev=327605&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/misc-macro-parentheses.cpp (removed)
@@ -1,49 +0,0 @@
-// RUN: %check_clang_tidy %s misc-macro-parentheses %t
-
-#define BAD1              -1
-// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: macro replacement list should be enclosed in parentheses [misc-macro-parentheses]
-#define BAD2              1+2
-// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: macro replacement list should be enclosed in parentheses [misc-macro-parentheses]
-#define BAD3(A)           (A+1)
-// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: macro argument should be enclosed in parentheses [misc-macro-parentheses]
-#define BAD4(x)           ((unsigned char)(x & 0xff))
-// CHECK-MESSAGES: :[[@LINE-1]]:44: warning: macro argument should be enclosed in parentheses [misc-macro-parentheses]
-#define BAD5(X)           A*B=(C*)X+2
-// CHECK-MESSAGES: :[[@LINE-1]]:35: warning: macro argument should be enclosed in parentheses [misc-macro-parentheses]
-
-#define GOOD1             1
-#define GOOD2             (1+2)
-#define GOOD3(A)          #A
-#define GOOD4(A,B)        A ## B
-#define GOOD5(T)          ((T*)0)
-#define GOOD6(B)          "A" B "C"
-#define GOOD7(b)          A b
-#define GOOD8(a)          a B
-#define GOOD9(type)       (type(123))
-#define GOOD10(car, ...)  car
-#define GOOD11            a[b+c]
-#define GOOD12(x)         a[x]
-#define GOOD13(x)         a.x
-#define GOOD14(x)         a->x
-#define GOOD15(x)         ({ int a = x; a+4; })
-#define GOOD16(x)         a_ ## x, b_ ## x = c_ ## x - 1,
-#define GOOD17            case 123: x=4+5; break;
-#define GOOD18(x)         ;x;
-#define GOOD19            ;-2;
-#define GOOD20            void*
-#define GOOD21(a)         case Fred::a:
-#define GOOD22(a)         if (verbose) return a;
-#define GOOD23(type)      (type::Field)
-#define GOOD24(t)         std::set<t> s
-#define GOOD25(t)         std::set<t,t,t> s
-#define GOOD26(x)         (a->*x)
-#define GOOD27(x)         (a.*x)
-#define GOOD28(x)         namespace x {int b;}
-#define GOOD29(...)       std::cout << __VA_ARGS__;
-#define GOOD30(args...)   std::cout << args;
-#define GOOD31(X)         A*X=2
-#define GOOD32(X)         std::vector<X>
-
-// These are allowed for now..
-#define MAYBE1            *12.34
-#define MAYBE2            <<3




More information about the cfe-commits mailing list