njames93 added a comment.

For the record `X < Y < Z ` does have a mathematical meaning, Y is constrained 
between X and Z.
However in the context of `C` the expression isnt parsed like that.
If someone writes this they likely wanted `(X < Y) && (Y < Z)`
For this specific check as you pointed out we wouldn't want to make that 
assumption though there is a case for adding notes to silence the warning by 
wrapping one of the comparisons in parenthesis.

It appears that this check fire multiple times for the case of `W < X < Y < Z`
Once for `(W < X < Y) < Z` and another time for `(W < X) < Y`
This again likely wont be visible as the warning currently is emitted at the 
start of the expression



================
Comment at: clang-tools-extra/clang-tidy/misc/ComplexConditionsCheck.cpp:28-33
+  const auto *If = Result.Nodes.getNodeAs<IfStmt>("complex_binop");
+  const auto *Statement = Result.Nodes.getNodeAs<Stmt>("complex_binop");
+  if (If) {
+    diag(If->getBeginLoc(),
+         "comparisons like `X<=Y<=Z` have no mathematical meaning");
+  }
----------------
The `If` looks suspicious, as you match on a `BinaryOperator`, the `If` will 
always be nullptr and should likely be removed.
Likewise `Statement` will match but should likely be changed to BinOp as that's 
what it is.


================
Comment at: clang-tools-extra/clang-tidy/misc/ComplexConditionsCheck.cpp:34
+  }
+  if (Statement) {
+    diag(Statement->getBeginLoc(),
----------------
Elide braces


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D84898/new/

https://reviews.llvm.org/D84898

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to