vabridgers added a comment.

Thanks for the comments. I posted an update for the simpler issues, working on 
refactoring the test cases and creating a fixit. Thanks for the good and 
actionable review comments!



================
Comment at: clang/docs/DiagnosticsReference.rst:2853
 
+-Wcompare-no-parentheses
+--------------------------------
----------------
Quuxplusone wrote:
> s/-no-/-op-/
fixed, thank you!


================
Comment at: clang/docs/DiagnosticsReference.rst:9885
 
-Also controls `-Wbitwise-conditional-parentheses`_, 
`-Wbitwise-op-parentheses`_, `-Wdangling-else`_, `-Wlogical-not-parentheses`_, 
`-Wlogical-op-parentheses`_, `-Woverloaded-shift-op-parentheses`_, 
`-Wparentheses-equality`_, `-Wshift-op-parentheses`_.
+Also controls `-Wbitwise-conditional-parentheses`_, 
`-Wbitwise-op-parentheses`_, `-Wcompare-no-parentheses`, `-Wdangling-else`_, 
`-Wlogical-not-parentheses`_, `-Wlogical-op-parentheses`_, 
`-Woverloaded-shift-op-parentheses`_, `-Wparentheses-equality`_, 
`-Wshift-op-parentheses`_.
 
----------------
Quuxplusone wrote:
> s/-no-/-op-/
> And what's going on with all these trailing underscores? If they're 
> important, you're missing one.
missed that, thank you!


================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:6135
+  "comparisons like 'x<=y<=z' are interpreted as '(x<=y ? 1 : 0) <= z'">,
+  InGroup<CompareOpParentheses>, DefaultIgnore;
+
----------------
Quuxplusone wrote:
> Why is this `x<=y<=z` instead of the simpler `x<y<z` or even `x<=y<z` (the 
> "half-open range" common case)?
> IMHO you should mention the name "chained comparisons" here, since I think 
> that's what people coming from such languages will understand.
Thanks Arthur. I modeled the warning message after gcc's warning message. We 
found internally that while gcc detected this, clang did not. See 
https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options ...
<q>
-Wparentheses
Warn if parentheses are omitted in certain contexts, such as when there is an 
assignment in a context where a truth value is expected, or when operators are 
nested whose precedence people often get confused about.

Also warn if a comparison like x<=y<=z appears; this is equivalent to (x<=y ? 1 
: 0) <= z, which is a different interpretation from that of ordinary 
mathematical notation.
...
</q>
While this is the gcc documentation, we can craft whatever message we see fit 
at this point in time :)  I'll add "chained" comparison for this next update, 
we can tailor the message as we see fit. Thanks!



================
Comment at: clang/lib/Sema/SemaExpr.cpp:14010
+      << Bop->getSourceRange() << OpLoc;
+  SuggestParentheses(Self, Bop->getOperatorLoc(),
+                     Self.PDiag(diag::note_precedence_silence)
----------------
lebedev.ri wrote:
> Should we also suggest the fix to rewrite into what user likely intended?
> `(x op1 y) && (y op2 z)`
I'll work on this, post in a next update. Thank you!


================
Comment at: clang/test/Sema/warn-compare-op-parentheses.c:1
+// RUN: %clang_cc1 -fsyntax-only -Wcompare-op-parentheses -verify %s
+
----------------
Quuxplusone wrote:
> These are some great test cases, but I think they would benefit from being 
> exhaustive.
> 
> ```
> int tests(int p1, int p2, int p3) {
>     bool b;
>     b = (p1 < p2 < p3);  // expected-warning{{comparisons like 'x<y<z' are 
> interpreted}} expected-note{{place parentheses}}
>     b = (p1 < p2 <= p3);  // expected-warning{{comparisons like 'x<y<z' are 
> interpreted}} expected-note{{place parentheses}}
>     b = (p1 < p2 > p3);  // expected-warning{{comparisons like 'x<y<z' are 
> interpreted}} expected-note{{place parentheses}}
>     b = (p1 < p2 >= p3);  // expected-warning{{comparisons like 'x<y<z' are 
> interpreted}} expected-note{{place parentheses}}
>     b = (p1 <= p2 < p3);  // expected-warning{{comparisons like 'x<y<z' are 
> interpreted}} expected-note{{place parentheses}}
>     b = (p1 <= p2 <= p3);  // expected-warning{{comparisons like 'x<y<z' are 
> interpreted}} expected-note{{place parentheses}}
> ```
> 
> etc. etc.
> I don't see any downside to being systematic here.
I'll address in a future update. Thank you!


================
Comment at: clang/test/Sema/warn-compare-op-parentheses.c:129
+  return 0;
+}
----------------
Quuxplusone wrote:
> I would like to see explicit (and preferably exhaustive or at least 
> systematic) test cases for the "no warning intended" case:
> 
>     if ((p1 < p2) < p3)
>     if (p1 < (p2 < p3))
>     if (0 <= (p1 < p2))  // this should already trigger a 
> constant-comparison-result warning, yes?
> 
> I would like to see explicit (and preferably exhaustive or at least 
> systematic) test cases for mixed relational and equality comparisons:
> 
>     if (p1 == p2 < p3)  // maybe intentional, but definitely deserving of a 
> warning
>     if (p1 == p2 == p3)  // definitely buggy and deserving of a warning
>     if (p1 != p2 != p3)  // definitely buggy and deserving of a warning
>     if (p1 < p2 == p3 < p4)  // maybe intentional, but definitely deserving 
> of a warning
>     if (p1 == p2 < p3 == p4)  // definitely buggy and deserving of a warning
Great suggestions, I'll address in a future update. Thank you!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85097

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

Reply via email to