[llvm] [clang] [clang-tools-extra] [clang-tidy] Remove cert-dcl21-cpp check (PR #80181)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 31 11:16:58 PST 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang

@llvm/pr-subscribers-clang-tidy

Author: Carlos Galvez (carlosgalvezp)

<details>
<summary>Changes</summary>

Deprecated since clang-tidy 17. The rule DCL21-CPP has been removed from the CERT guidelines, so it does not make sense to keep the check.

Fixes #<!-- -->42788

---
Full diff: https://github.com/llvm/llvm-project/pull/80181.diff


11 Files Affected:

- (modified) clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp (-3) 
- (modified) clang-tools-extra/clang-tidy/cert/CMakeLists.txt (-1) 
- (removed) clang-tools-extra/clang-tidy/cert/PostfixOperatorCheck.cpp (-80) 
- (removed) clang-tools-extra/clang-tidy/cert/PostfixOperatorCheck.h (-34) 
- (modified) clang-tools-extra/clangd/TidyFastChecks.inc (-1) 
- (modified) clang-tools-extra/docs/ReleaseNotes.rst (+3) 
- (removed) clang-tools-extra/docs/clang-tidy/checks/cert/dcl21-cpp.rst (-28) 
- (modified) clang-tools-extra/docs/clang-tidy/checks/list.rst (-1) 
- (removed) clang-tools-extra/test/clang-tidy/checkers/cert/dcl21-cpp.cpp (-134) 
- (modified) clang/docs/tools/clang-formatted-files.txt (-2) 
- (modified) llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn (-1) 


``````````diff
diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
index d334ab8c437d3..b06a903f92b3e 100644
--- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
@@ -33,7 +33,6 @@
 #include "LimitedRandomnessCheck.h"
 #include "MutatingCopyCheck.h"
 #include "NonTrivialTypesLibcMemoryCallsCheck.h"
-#include "PostfixOperatorCheck.h"
 #include "ProperlySeededRandomGeneratorCheck.h"
 #include "SetLongJmpCheck.h"
 #include "StaticObjectExceptionCheck.h"
@@ -239,8 +238,6 @@ class CERTModule : public ClangTidyModule {
     CheckFactories.registerCheck<bugprone::SpuriouslyWakeUpFunctionsCheck>(
         "cert-con54-cpp");
     // DCL
-    CheckFactories.registerCheck<PostfixOperatorCheck>(
-        "cert-dcl21-cpp");
     CheckFactories.registerCheck<VariadicFunctionDefCheck>("cert-dcl50-cpp");
     CheckFactories.registerCheck<bugprone::ReservedIdentifierCheck>(
         "cert-dcl51-cpp");
diff --git a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt
index 889180f62fde9..882735c9d1e0d 100644
--- a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt
@@ -12,7 +12,6 @@ add_clang_library(clangTidyCERTModule
   LimitedRandomnessCheck.cpp
   MutatingCopyCheck.cpp
   NonTrivialTypesLibcMemoryCallsCheck.cpp
-  PostfixOperatorCheck.cpp
   ProperlySeededRandomGeneratorCheck.cpp
   SetLongJmpCheck.cpp
   StaticObjectExceptionCheck.cpp
diff --git a/clang-tools-extra/clang-tidy/cert/PostfixOperatorCheck.cpp b/clang-tools-extra/clang-tidy/cert/PostfixOperatorCheck.cpp
deleted file mode 100644
index 8ff63ade7315d..0000000000000
--- a/clang-tools-extra/clang-tidy/cert/PostfixOperatorCheck.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-//===--- PostfixOperatorCheck.cpp - clang-tidy-----------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "PostfixOperatorCheck.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/ASTMatchers/ASTMatchFinder.h"
-#include "clang/Lex/Lexer.h"
-
-using namespace clang::ast_matchers;
-
-namespace clang::tidy::cert {
-
-void PostfixOperatorCheck::registerMatchers(MatchFinder *Finder) {
-  Finder->addMatcher(functionDecl(hasAnyOverloadedOperatorName("++", "--"),
-                                  unless(isInstantiated()))
-                         .bind("decl"),
-                     this);
-}
-
-void PostfixOperatorCheck::check(const MatchFinder::MatchResult &Result) {
-  const auto *FuncDecl = Result.Nodes.getNodeAs<FunctionDecl>("decl");
-
-  bool HasThis = false;
-  if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(FuncDecl))
-    HasThis = MethodDecl->isInstance();
-
-  // Check if the operator is a postfix one.
-  if (FuncDecl->getNumParams() != (HasThis ? 1 : 2))
-    return;
-
-  SourceRange ReturnRange = FuncDecl->getReturnTypeSourceRange();
-  SourceLocation Location = ReturnRange.getBegin();
-  if (!Location.isValid())
-    return;
-
-  QualType ReturnType = FuncDecl->getReturnType();
-
-  // Warn when the operators return a reference.
-  if (const auto *RefType = ReturnType->getAs<ReferenceType>()) {
-    auto Diag = diag(Location, "overloaded %0 returns a reference instead of a "
-                               "constant object type")
-                << FuncDecl;
-
-    if (Location.isMacroID() || ReturnType->getAs<TypedefType>() ||
-        RefType->getPointeeTypeAsWritten()->getAs<TypedefType>())
-      return;
-
-    QualType ReplaceType =
-        ReturnType.getNonReferenceType().getLocalUnqualifiedType();
-    // The getReturnTypeSourceRange omits the qualifiers. We do not want to
-    // duplicate the const.
-    if (!ReturnType->getPointeeType().isConstQualified())
-      ReplaceType.addConst();
-
-    Diag << FixItHint::CreateReplacement(
-        ReturnRange,
-        ReplaceType.getAsString(Result.Context->getPrintingPolicy()) + " ");
-
-    return;
-  }
-
-  if (ReturnType.isConstQualified() || ReturnType->isBuiltinType() ||
-      ReturnType->isPointerType())
-    return;
-
-  auto Diag =
-      diag(Location, "overloaded %0 returns a non-constant object instead of a "
-                     "constant object type")
-      << FuncDecl;
-
-  if (!Location.isMacroID() && !ReturnType->getAs<TypedefType>())
-    Diag << FixItHint::CreateInsertion(Location, "const ");
-}
-
-} // namespace clang::tidy::cert
diff --git a/clang-tools-extra/clang-tidy/cert/PostfixOperatorCheck.h b/clang-tools-extra/clang-tidy/cert/PostfixOperatorCheck.h
deleted file mode 100644
index 782b9a99ba413..0000000000000
--- a/clang-tools-extra/clang-tidy/cert/PostfixOperatorCheck.h
+++ /dev/null
@@ -1,34 +0,0 @@
-//===--- PostfixOperatorCheck.h - clang-tidy---------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_POSTFIX_OPERATOR_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_POSTFIX_OPERATOR_H
-
-#include "../ClangTidyCheck.h"
-
-namespace clang::tidy::cert {
-
-/// Checks if the overloaded postfix ++ and -- operator return a constant
-/// object.
-///
-/// For the user-facing documentation see:
-/// https://clang.llvm.org/extra/clang-tidy/checks/cert/dcl21-cpp.html
-class PostfixOperatorCheck : public ClangTidyCheck {
-public:
-  PostfixOperatorCheck(StringRef Name, ClangTidyContext *Context)
-      : ClangTidyCheck(Name, Context) {}
-  bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
-    return LangOpts.CPlusPlus;
-  }
-  void registerMatchers(ast_matchers::MatchFinder *Finder) override;
-  void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
-};
-
-} // namespace clang::tidy::cert
-
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_POSTFIX_OPERATOR_H
diff --git a/clang-tools-extra/clangd/TidyFastChecks.inc b/clang-tools-extra/clangd/TidyFastChecks.inc
index 9596ba4d725b6..9050ce16127ff 100644
--- a/clang-tools-extra/clangd/TidyFastChecks.inc
+++ b/clang-tools-extra/clangd/TidyFastChecks.inc
@@ -116,7 +116,6 @@ FAST(cert-con36-c, 2.0)
 FAST(cert-con54-cpp, 3.0)
 FAST(cert-dcl03-c, 2.0)
 FAST(cert-dcl16-c, -1.0)
-FAST(cert-dcl21-cpp, 0.0)
 FAST(cert-dcl37-c, 3.0)
 FAST(cert-dcl50-cpp, -1.0)
 FAST(cert-dcl51-cpp, 1.0)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index fd2cba4e4f463..ad99fe9d08f9c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -109,6 +109,9 @@ Changes in existing checks
 Removed checks
 ^^^^^^^^^^^^^^
 
+- Removed `cert-dcl21-cpp`, which was deprecated since :program:`clang-tidy` 17,
+  since the rule DCL21-CPP has been removed from the CERT guidelines.
+
 Improvements to include-fixer
 -----------------------------
 
diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/dcl21-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/dcl21-cpp.rst
deleted file mode 100644
index 9845c2776e11d..0000000000000
--- a/clang-tools-extra/docs/clang-tidy/checks/cert/dcl21-cpp.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-.. title:: clang-tidy - cert-dcl21-cpp
-
-cert-dcl21-cpp
-==============
-
-.. note::
-  This check is deprecated since it's no longer part of the CERT standard.
-  It will be removed in :program:`clang-tidy` version 19.
-
-This check flags postfix ``operator++`` and ``operator--`` declarations
-if the return type is not a const object. This also warns if the return type
-is a reference type.
-
-The object returned by a postfix increment or decrement operator is supposed
-to be a snapshot of the object's value prior to modification. With such an
-implementation, any modifications made to the resulting object from calling
-operator++(int) would be modifying a temporary object. Thus, such an
-implementation of a postfix increment or decrement operator should instead
-return a const object, prohibiting accidental mutation of a temporary object.
-Similarly, it is unexpected for the postfix operator to return a reference to
-its previous state, and any subsequent modifications would be operating on a
-stale object.
-
-This check corresponds to the CERT C++ Coding Standard recommendation
-DCL21-CPP. Overloaded postfix increment and decrement operators should return a
-const object. However, all of the CERT recommendations have been removed from
-public view, and so their justification for the behavior of this check requires
-an account on their wiki to view.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst
index f773e80b562e4..f40192ed9dea2 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -155,7 +155,6 @@ Clang-Tidy Checks
    :doc:`bugprone-unused-return-value <bugprone/unused-return-value>`,
    :doc:`bugprone-use-after-move <bugprone/use-after-move>`,
    :doc:`bugprone-virtual-near-miss <bugprone/virtual-near-miss>`, "Yes"
-   :doc:`cert-dcl21-cpp <cert/dcl21-cpp>`, "Yes"
    :doc:`cert-dcl50-cpp <cert/dcl50-cpp>`,
    :doc:`cert-dcl58-cpp <cert/dcl58-cpp>`,
    :doc:`cert-env33-c <cert/env33-c>`,
diff --git a/clang-tools-extra/test/clang-tidy/checkers/cert/dcl21-cpp.cpp b/clang-tools-extra/test/clang-tidy/checkers/cert/dcl21-cpp.cpp
deleted file mode 100644
index c975f70fbb02c..0000000000000
--- a/clang-tools-extra/test/clang-tidy/checkers/cert/dcl21-cpp.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-// RUN: %check_clang_tidy %s cert-dcl21-cpp %t
-
-class A {};
-
-A operator++(A &, int);
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator++' returns a non-constant object instead of a constant object type [cert-dcl21-cpp]
-// CHECK-FIXES: {{^}}const A operator++(A &, int);
-
-A operator--(A &, int);
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator--' returns a no
-// CHECK-FIXES: {{^}}const A operator--(A &, int);
-
-class B {};
-
-B &operator++(B &);
-const B operator++(B &, int);
-
-B &operator--(B &);
-const B operator--(B &, int);
-
-
-class D {
-D &operator++();
-const D operator++(int);
-
-D &operator--();
-const D operator--(int);
-};
-
-class C {
-C operator++(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator++' returns a no
-// CHECK-FIXES: {{^}}const C operator++(int);
-
-C operator--(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator--' returns a no
-// CHECK-FIXES: {{^}}const C operator--(int);
-};
-
-class E {};
-
-E &operator++(E &, int);
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator++' returns a reference instead of a constant object type [cert-dcl21-cpp]
-// CHECK-FIXES: {{^}}const E operator++(E &, int);
-
-E &operator--(E &, int);
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator--' returns a re
-// CHECK-FIXES: {{^}}const E operator--(E &, int);
-
-class G {
-G &operator++(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator++' returns a re
-// CHECK-FIXES: {{^}}const G operator++(int);
-
-G &operator--(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator--' returns a re
-// CHECK-FIXES: {{^}}const G operator--(int);
-};
-
-class F {};
-
-const F &operator++(F &, int);
-// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator++' returns a re
-// CHECK-FIXES: {{^}}const F operator++(F &, int);
-
-const F &operator--(F &, int);
-// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator--' returns a re
-// CHECK-FIXES: {{^}}const F operator--(F &, int);
-
-class H {
-const H &operator++(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator++' returns a re
-// CHECK-FIXES: {{^}}const H operator++(int);
-
-const H &operator--(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator--' returns a re
-// CHECK-FIXES: {{^}}const H operator--(int);
-};
-
-
-#define FROM_MACRO P&
-class P {
-const FROM_MACRO operator++(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator++' returns a re
-// CHECK-FIXES: {{^}}const FROM_MACRO operator++(int);
-};
-
-
-template<typename T>
-class Q {
-const Q &operator++(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator++' returns a re
-// CHECK-FIXES: {{^}}const Q<T> operator++(int);
-
-const Q &operator--(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: overloaded 'operator--' returns a re
-// CHECK-FIXES: {{^}}const Q<T> operator--(int);
-};
-
-void foobar() {
-  Q<int> a;
-  Q<float> b;
-  (void)a;
-  (void)b;
-}
-
-struct S {};
-typedef S& SRef;
-
-SRef operator++(SRef, int);
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: overloaded 'operator++' returns a re
-// CHECK-FIXES: {{^}}SRef operator++(SRef, int);
-
-struct T {
-  typedef T& TRef;
-  
-  TRef operator++(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: overloaded 'operator++' returns a re
-// CHECK-FIXES: {{^}}  TRef operator++(int);
-};
-
-struct U {
-  typedef const U& ConstURef;
-  
-  ConstURef& operator++(int);
-// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: overloaded 'operator++' returns a re
-// CHECK-FIXES: {{^}}  ConstURef& operator++(int);
-};
-
-struct V {
-  V *operator++(int);
-  V *const operator--(int);
-};
-
diff --git a/clang/docs/tools/clang-formatted-files.txt b/clang/docs/tools/clang-formatted-files.txt
index 18512b1a7bf6b..40ab76fa26a9e 100644
--- a/clang/docs/tools/clang-formatted-files.txt
+++ b/clang/docs/tools/clang-formatted-files.txt
@@ -985,8 +985,6 @@ clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.cpp
 clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.h
 clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.cpp
 clang-tools-extra/clang-tidy/cert/NonTrivialTypesLibcMemoryCallsCheck.h
-clang-tools-extra/clang-tidy/cert/PostfixOperatorCheck.cpp
-clang-tools-extra/clang-tidy/cert/PostfixOperatorCheck.h
 clang-tools-extra/clang-tidy/cert/ProperlySeededRandomGeneratorCheck.cpp
 clang-tools-extra/clang-tidy/cert/ProperlySeededRandomGeneratorCheck.h
 clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.cpp
diff --git a/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn b/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn
index 86190d4262b1c..788f8499fe072 100644
--- a/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn
+++ b/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn
@@ -23,7 +23,6 @@ static_library("cert") {
     "LimitedRandomnessCheck.cpp",
     "MutatingCopyCheck.cpp",
     "NonTrivialTypesLibcMemoryCallsCheck.cpp",
-    "PostfixOperatorCheck.cpp",
     "ProperlySeededRandomGeneratorCheck.cpp",
     "SetLongJmpCheck.cpp",
     "StaticObjectExceptionCheck.cpp",

``````````

</details>


https://github.com/llvm/llvm-project/pull/80181


More information about the llvm-commits mailing list