[libcxx-commits] [flang] [clang] [clang-tools-extra] [llvm] [compiler-rt] [mlir] [lld] [libcxx] [lldb] [clang-tidy]Add new check readability-avoid-nested-conditional-operator (PR #78022)

Congcong Cai via libcxx-commits libcxx-commits at lists.llvm.org
Sun Jan 14 17:41:58 PST 2024


https://github.com/HerrCai0907 updated https://github.com/llvm/llvm-project/pull/78022

>From 0988bb25a35e5d50b44bf53d459098777280c3e5 Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Sat, 13 Jan 2024 16:00:16 +0800
Subject: [PATCH 1/2] [clang-tidy]Add new check
 readability-avoid-nested-conditional-operator Finds nested conditional
 operator. Nested conditional operators lead code hard to understand, so they
 should be splited as several statement and stored in temporary varibale.

---
 .../AvoidNestedConditionalOperatorCheck.cpp   | 56 +++++++++++++++++++
 .../AvoidNestedConditionalOperatorCheck.h     | 33 +++++++++++
 .../clang-tidy/readability/CMakeLists.txt     |  1 +
 .../readability/ReadabilityTidyModule.cpp     |  3 +
 clang-tools-extra/docs/ReleaseNotes.rst       |  5 ++
 .../docs/clang-tidy/checks/list.rst           |  1 +
 .../avoid-nested-conditional-operator.rst     | 20 +++++++
 .../avoid-nested-conditional-operator.cpp     | 23 ++++++++
 8 files changed, 142 insertions(+)
 create mode 100644 clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.cpp
 create mode 100644 clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.h
 create mode 100644 clang-tools-extra/docs/clang-tidy/checks/readability/avoid-nested-conditional-operator.rst
 create mode 100644 clang-tools-extra/test/clang-tidy/checkers/readability/avoid-nested-conditional-operator.cpp

diff --git a/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.cpp b/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.cpp
new file mode 100644
index 00000000000000..a0278c3ae32fa7
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.cpp
@@ -0,0 +1,56 @@
+//===--- AvoidNestedConditionalOperatorCheck.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 "AvoidNestedConditionalOperatorCheck.h"
+#include "clang/AST/Expr.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/ASTMatchers/ASTMatchers.h"
+#include "clang/Basic/DiagnosticIDs.h"
+
+using namespace clang::ast_matchers;
+
+namespace clang::tidy::readability {
+
+namespace {
+constexpr const char *Description = "don't use nested conditional operator";
+constexpr const char *OutSideConditionalOperatorNote =
+    "outside conditional operator here";
+} // namespace
+
+void AvoidNestedConditionalOperatorCheck::registerMatchers(
+    MatchFinder *Finder) {
+  Finder->addMatcher(
+      conditionalOperator(
+          anyOf(
+              hasCondition(ignoringParenCasts(
+                  conditionalOperator().bind("nested-conditional-operator"))),
+              hasTrueExpression(ignoringParenCasts(
+                  conditionalOperator().bind("nested-conditional-operator"))),
+              hasFalseExpression(ignoringParenCasts(
+                  conditionalOperator().bind("nested-conditional-operator")))))
+          .bind("conditional-operator"),
+      this);
+}
+
+void AvoidNestedConditionalOperatorCheck::check(
+    const MatchFinder::MatchResult &Result) {
+  const auto *CO =
+      Result.Nodes.getNodeAs<ConditionalOperator>("conditional-operator");
+  const auto *NCO = Result.Nodes.getNodeAs<ConditionalOperator>(
+      "nested-conditional-operator");
+  assert(CO);
+  assert(NCO);
+
+  if (CO->getBeginLoc().isMacroID() || NCO->getBeginLoc().isMacroID())
+    return;
+
+  diag(NCO->getBeginLoc(), Description);
+  diag(CO->getBeginLoc(), OutSideConditionalOperatorNote, DiagnosticIDs::Note);
+}
+
+} // namespace clang::tidy::readability
diff --git a/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.h b/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.h
new file mode 100644
index 00000000000000..2f82ea86cd849d
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.h
@@ -0,0 +1,33 @@
+//===--- AvoidNestedConditionalOperatorCheck.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_READABILITY_AVOIDNestedConditionalOperatorCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOIDNestedConditionalOperatorCHECK_H
+
+#include "../ClangTidyCheck.h"
+
+namespace clang::tidy::readability {
+
+/// Finds nested conditional operator.
+///
+/// For the user-facing documentation see:
+/// http://clang.llvm.org/extra/clang-tidy/checks/readability/avoid-nested-conditional-operator.html
+class AvoidNestedConditionalOperatorCheck : public ClangTidyCheck {
+public:
+  AvoidNestedConditionalOperatorCheck(StringRef Name, ClangTidyContext *Context)
+      : ClangTidyCheck(Name, Context) {}
+  void registerMatchers(ast_matchers::MatchFinder *Finder) override;
+  void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+  std::optional<TraversalKind> getCheckTraversalKind() const override {
+    return TK_IgnoreUnlessSpelledInSource;
+  }
+};
+
+} // namespace clang::tidy::readability
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOIDNestedConditionalOperatorCHECK_H
diff --git a/clang-tools-extra/clang-tidy/readability/CMakeLists.txt b/clang-tools-extra/clang-tidy/readability/CMakeLists.txt
index 408c822b861c5f..fa571d5dd7650d 100644
--- a/clang-tools-extra/clang-tidy/readability/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/readability/CMakeLists.txt
@@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS
 
 add_clang_library(clangTidyReadabilityModule
   AvoidConstParamsInDecls.cpp
+  AvoidNestedConditionalOperatorCheck.cpp
   AvoidReturnWithVoidValueCheck.cpp
   AvoidUnconditionalPreprocessorIfCheck.cpp
   BracesAroundStatementsCheck.cpp
diff --git a/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp b/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
index 0b0aad7c0dcb36..f769752c5de5fa 100644
--- a/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
@@ -10,6 +10,7 @@
 #include "../ClangTidyModule.h"
 #include "../ClangTidyModuleRegistry.h"
 #include "AvoidConstParamsInDecls.h"
+#include "AvoidNestedConditionalOperatorCheck.h"
 #include "AvoidReturnWithVoidValueCheck.h"
 #include "AvoidUnconditionalPreprocessorIfCheck.h"
 #include "BracesAroundStatementsCheck.h"
@@ -64,6 +65,8 @@ class ReadabilityModule : public ClangTidyModule {
   void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
     CheckFactories.registerCheck<AvoidConstParamsInDecls>(
         "readability-avoid-const-params-in-decls");
+    CheckFactories.registerCheck<AvoidNestedConditionalOperatorCheck>(
+        "readability-avoid-nested-conditional-operator");
     CheckFactories.registerCheck<AvoidReturnWithVoidValueCheck>(
         "readability-avoid-return-with-void-value");
     CheckFactories.registerCheck<AvoidUnconditionalPreprocessorIfCheck>(
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 3437b6cf9b59e9..7ed4bcf1ff92ac 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -224,6 +224,11 @@ New checks
   Recommends the smallest possible underlying type for an ``enum`` or ``enum``
   class based on the range of its enumerators.
 
+- New :doc:`readability-avoid-nested-conditional-operator
+  <clang-tidy/checks/readability/avoid-nested-conditional-operator>` check.
+
+  Finds nested conditional operator.
+
 - New :doc:`readability-reference-to-constructed-temporary
   <clang-tidy/checks/readability/reference-to-constructed-temporary>` check.
 
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst
index 2f86121ad87299..fd65bdc1e43f8d 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -337,6 +337,7 @@ Clang-Tidy Checks
    :doc:`portability-simd-intrinsics <portability/simd-intrinsics>`,
    :doc:`portability-std-allocator-const <portability/std-allocator-const>`,
    :doc:`readability-avoid-const-params-in-decls <readability/avoid-const-params-in-decls>`, "Yes"
+   :doc:`readability-avoid-nested-conditional-operator <readability/avoid-nested-conditional-operator>`, "Yes"
    :doc:`readability-avoid-return-with-void-value <readability/avoid-return-with-void-value>`,
    :doc:`readability-avoid-unconditional-preprocessor-if <readability/avoid-unconditional-preprocessor-if>`,
    :doc:`readability-braces-around-statements <readability/braces-around-statements>`, "Yes"
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability/avoid-nested-conditional-operator.rst b/clang-tools-extra/docs/clang-tidy/checks/readability/avoid-nested-conditional-operator.rst
new file mode 100644
index 00000000000000..db4ce7de87a9e7
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability/avoid-nested-conditional-operator.rst
@@ -0,0 +1,20 @@
+.. title:: clang-tidy - readability-avoid-nested-conditional-operator
+
+readability-avoid-nested-conditional-operator
+=================================================
+
+Finds nested conditional operator.
+
+Nested conditional operators lead code hard to understand, so they should be
+splited as several statement and stored in temporary varibale.
+
+Examples:
+
+.. code-block:: c++
+
+  int NestInConditional = (condition1 ? true1 : false1) ? true2 : false2;
+  int NestInTrue = condition1 ? (condition2 ? true1 : false1) : false2;
+  int NestInFalse = condition1 ? true1 : condition2 ? true2 : false1;
+
+This check implements part of `AUTOSAR C++14 Rule A5-16-1
+<https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-constref>`_.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/avoid-nested-conditional-operator.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/avoid-nested-conditional-operator.cpp
new file mode 100644
index 00000000000000..fd2d592544ddd0
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/avoid-nested-conditional-operator.cpp
@@ -0,0 +1,23 @@
+// RUN: %check_clang_tidy %s readability-avoid-nested-conditional-operator %t
+
+int NestInConditional = (true ? true : false) ? 1 : 2;
+// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: don't use nested conditional operator
+// CHECK-MESSAGES: :[[@LINE-2]]:25: note: outside conditional operator here
+
+int NestInTrue = true ? (true ? 1 : 2) : 2;
+// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: don't use nested conditional operator
+// CHECK-MESSAGES: :[[@LINE-2]]:18: note: outside conditional operator here
+
+int NestInFalse = true ? 1 : true ? 1 : 2;
+// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: don't use nested conditional operator
+// CHECK-MESSAGES: :[[@LINE-2]]:19: note: outside conditional operator here
+int NestInFalse2 = true ? 1 : (true ? 1 : 2);
+// CHECK-MESSAGES: :[[@LINE-1]]:32: warning: don't use nested conditional operator
+// CHECK-MESSAGES: :[[@LINE-2]]:20: note: outside conditional operator here
+
+int NestWithParensis = true ? 1 : ((((true ? 1 : 2))));
+// CHECK-MESSAGES: :[[@LINE-1]]:39: warning: don't use nested conditional operator
+// CHECK-MESSAGES: :[[@LINE-2]]:24: note: outside conditional operator here
+
+#define CONDITIONAL_EXPR (true ? 1 : 2)
+int NestWithMacro = true ? CONDITIONAL_EXPR : 2;

>From f9736f2aa55860fe33c2155264289e6ba405e89a Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Mon, 15 Jan 2024 09:38:21 +0800
Subject: [PATCH 2/2] fix comments

---
 .../AvoidNestedConditionalOperatorCheck.cpp   | 14 +++++--------
 .../AvoidNestedConditionalOperatorCheck.h     | 10 ++++-----
 .../docs/clang-tidy/checks/list.rst           |  2 +-
 .../avoid-nested-conditional-operator.rst     | 11 +++++-----
 .../avoid-nested-conditional-operator.cpp     | 21 ++++++++++---------
 5 files changed, 28 insertions(+), 30 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.cpp b/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.cpp
index a0278c3ae32fa7..2ea03c9070526f 100644
--- a/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.cpp
@@ -7,7 +7,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "AvoidNestedConditionalOperatorCheck.h"
-#include "clang/AST/Expr.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/ASTMatchers/ASTMatchers.h"
 #include "clang/Basic/DiagnosticIDs.h"
@@ -16,12 +15,6 @@ using namespace clang::ast_matchers;
 
 namespace clang::tidy::readability {
 
-namespace {
-constexpr const char *Description = "don't use nested conditional operator";
-constexpr const char *OutSideConditionalOperatorNote =
-    "outside conditional operator here";
-} // namespace
-
 void AvoidNestedConditionalOperatorCheck::registerMatchers(
     MatchFinder *Finder) {
   Finder->addMatcher(
@@ -49,8 +42,11 @@ void AvoidNestedConditionalOperatorCheck::check(
   if (CO->getBeginLoc().isMacroID() || NCO->getBeginLoc().isMacroID())
     return;
 
-  diag(NCO->getBeginLoc(), Description);
-  diag(CO->getBeginLoc(), OutSideConditionalOperatorNote, DiagnosticIDs::Note);
+  diag(NCO->getBeginLoc(),
+       "conditional operator is used as sub-expression of parent conditional "
+       "operator, refrain from using nested conditional operators");
+  diag(CO->getBeginLoc(), "parent conditional operator here",
+       DiagnosticIDs::Note);
 }
 
 } // namespace clang::tidy::readability
diff --git a/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.h b/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.h
index 2f82ea86cd849d..9010156de6ce2d 100644
--- a/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/AvoidNestedConditionalOperatorCheck.h
@@ -1,4 +1,4 @@
-//===--- AvoidNestedConditionalOperatorCheck.h - clang-tidy --*- C++ -*-===//
+//===--- AvoidNestedConditionalOperatorCheck.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.
@@ -6,14 +6,14 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOIDNestedConditionalOperatorCHECK_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOIDNestedConditionalOperatorCHECK_H
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOID_NESTED_CONDITIONAL_OPERATOR_CHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOID_NESTED_CONDITIONAL_OPERATOR_CHECK_H
 
 #include "../ClangTidyCheck.h"
 
 namespace clang::tidy::readability {
 
-/// Finds nested conditional operator.
+/// Identifies instances of nested conditional operators in the code.
 ///
 /// For the user-facing documentation see:
 /// http://clang.llvm.org/extra/clang-tidy/checks/readability/avoid-nested-conditional-operator.html
@@ -30,4 +30,4 @@ class AvoidNestedConditionalOperatorCheck : public ClangTidyCheck {
 
 } // namespace clang::tidy::readability
 
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOIDNestedConditionalOperatorCHECK_H
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_AVOID_NESTED_CONDITIONAL_OPERATOR_CHECK_H
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst
index fd65bdc1e43f8d..5f21449cfc3df4 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -337,7 +337,7 @@ Clang-Tidy Checks
    :doc:`portability-simd-intrinsics <portability/simd-intrinsics>`,
    :doc:`portability-std-allocator-const <portability/std-allocator-const>`,
    :doc:`readability-avoid-const-params-in-decls <readability/avoid-const-params-in-decls>`, "Yes"
-   :doc:`readability-avoid-nested-conditional-operator <readability/avoid-nested-conditional-operator>`, "Yes"
+   :doc:`readability-avoid-nested-conditional-operator <readability/avoid-nested-conditional-operator>`,
    :doc:`readability-avoid-return-with-void-value <readability/avoid-return-with-void-value>`,
    :doc:`readability-avoid-unconditional-preprocessor-if <readability/avoid-unconditional-preprocessor-if>`,
    :doc:`readability-braces-around-statements <readability/braces-around-statements>`, "Yes"
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability/avoid-nested-conditional-operator.rst b/clang-tools-extra/docs/clang-tidy/checks/readability/avoid-nested-conditional-operator.rst
index db4ce7de87a9e7..44b74283292ce0 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/readability/avoid-nested-conditional-operator.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability/avoid-nested-conditional-operator.rst
@@ -1,12 +1,13 @@
 .. title:: clang-tidy - readability-avoid-nested-conditional-operator
 
 readability-avoid-nested-conditional-operator
-=================================================
+=============================================
 
-Finds nested conditional operator.
+Identifies instances of nested conditional operators in the code.
 
-Nested conditional operators lead code hard to understand, so they should be
-splited as several statement and stored in temporary varibale.
+Nested conditional operators, also known as ternary operators, can contribute
+to reduced code readability and comprehension. So they should be split as
+several statements and stored the intermediate results in temporary variable.
 
 Examples:
 
@@ -17,4 +18,4 @@ Examples:
   int NestInFalse = condition1 ? true1 : condition2 ? true2 : false1;
 
 This check implements part of `AUTOSAR C++14 Rule A5-16-1
-<https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-constref>`_.
+<https://www.autosar.org/fileadmin/standards/R22-11/AP/AUTOSAR_RS_CPP14Guidelines.pdf>`_.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/avoid-nested-conditional-operator.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/avoid-nested-conditional-operator.cpp
index fd2d592544ddd0..847df08199e349 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/avoid-nested-conditional-operator.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/avoid-nested-conditional-operator.cpp
@@ -1,23 +1,24 @@
 // RUN: %check_clang_tidy %s readability-avoid-nested-conditional-operator %t
 
 int NestInConditional = (true ? true : false) ? 1 : 2;
-// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: don't use nested conditional operator
-// CHECK-MESSAGES: :[[@LINE-2]]:25: note: outside conditional operator here
+// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: conditional operator is used as sub-expression of parent conditional operator, refrain from using nested conditional operators
+// CHECK-MESSAGES: :[[@LINE-2]]:25: note: parent conditional operator here
 
 int NestInTrue = true ? (true ? 1 : 2) : 2;
-// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: don't use nested conditional operator
-// CHECK-MESSAGES: :[[@LINE-2]]:18: note: outside conditional operator here
+// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: conditional operator is used as sub-expression of parent conditional operator, refrain from using nested conditional operators
+// CHECK-MESSAGES: :[[@LINE-2]]:18: note: parent conditional operator here
 
 int NestInFalse = true ? 1 : true ? 1 : 2;
-// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: don't use nested conditional operator
-// CHECK-MESSAGES: :[[@LINE-2]]:19: note: outside conditional operator here
+// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: conditional operator is used as sub-expression of parent conditional operator, refrain from using nested conditional operators
+// CHECK-MESSAGES: :[[@LINE-2]]:19: note: parent conditional operator here
 int NestInFalse2 = true ? 1 : (true ? 1 : 2);
-// CHECK-MESSAGES: :[[@LINE-1]]:32: warning: don't use nested conditional operator
-// CHECK-MESSAGES: :[[@LINE-2]]:20: note: outside conditional operator here
+// CHECK-MESSAGES: :[[@LINE-1]]:32: warning: conditional operator is used as sub-expression of parent conditional operator, refrain from using nested conditional operators
+// CHECK-MESSAGES: :[[@LINE-2]]:20: note: parent conditional operator here
 
 int NestWithParensis = true ? 1 : ((((true ? 1 : 2))));
-// CHECK-MESSAGES: :[[@LINE-1]]:39: warning: don't use nested conditional operator
-// CHECK-MESSAGES: :[[@LINE-2]]:24: note: outside conditional operator here
+// CHECK-MESSAGES: :[[@LINE-1]]:39: warning: conditional operator is used as sub-expression of parent conditional operator, refrain from using nested conditional operators
+// CHECK-MESSAGES: :[[@LINE-2]]:24: note: parent conditional operator here
 
 #define CONDITIONAL_EXPR (true ? 1 : 2)
+// not diag for macro since it will not reduce readability
 int NestWithMacro = true ? CONDITIONAL_EXPR : 2;



More information about the libcxx-commits mailing list