Quuxplusone added inline comments.

================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:6139
+def note_compare_seperate_sides : Note<
+  "seperate the expression into two clauses to give it the intended 
mathematical meaning">;
+
----------------
Both in the string and in the identifier, s/seperate/separate/.
I would also s/sides/clauses/ or s/sides/expression/ just to avoid giving too 
many different names to the same entity.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:14034
+      << FixItHint::CreateInsertion(LHSExpr->getEndLoc(), ") && ")
+      << FixItHint::CreateInsertion(LHSBO->getRHS()->getBeginLoc(), "(y ")
+      << FixItHint::CreateInsertion(RHSExpr->getEndLoc(), ")");
----------------
vabridgers wrote:
> njames93 wrote:
> > You don't want to insert `y` but the source code for `y`
> Gotcha, I'll address.
Please make sure to add at least one regression test to catch this (i.e. some 
test that tests the wording of the fixit and uses a name for the middle term 
that is not `y`). I don't know how to test a fixit, but there must be a way.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:14211
+
+  // Warn on ambiguous compares, loosely x<=y<=z
+  if (BinaryOperator::isRelationalOp(Opc))
----------------
FWIW, I would s/loosely/such as/.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:14010
+      << Bop->getSourceRange() << OpLoc;
+  SuggestParentheses(Self, Bop->getOperatorLoc(),
+                     Self.PDiag(diag::note_precedence_silence)
----------------
vabridgers wrote:
> vabridgers wrote:
> > njames93 wrote:
> > > Quuxplusone wrote:
> > > > vabridgers wrote:
> > > > > vabridgers wrote:
> > > > > > 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!
> > > > > Hi @lebedev.ri , the warning emits a note that says "place 
> > > > > parentheses around the '<op>' expression to silence this warning" 
> > > > > (see the test cases below). Is this sufficient, or are you looking 
> > > > > for something else?
> > > > https://godbolt.org/z/d1dG1o
> > > > For the very similar situation `(x & 1 == 0)`, Clang suggests //two 
> > > > different fixits//, and I believe Roman was suggesting that you should 
> > > > do the same kind of thing here.
> > > > ```
> > > > <source>:3:16: warning: & has lower precedence than ==; == will be 
> > > > evaluated first [-Wparentheses]
> > > >     int y = (x & 1 == 0);
> > > >                ^~~~~~~~
> > > > <source>:3:16: note: place parentheses around the '==' expression to 
> > > > silence this warning
> > > >     int y = (x & 1 == 0);
> > > >                ^
> > > >                  (     )
> > > > <source>:3:16: note: place parentheses around the & expression to 
> > > > evaluate it first
> > > >     int y = (x & 1 == 0);
> > > >                ^
> > > >              (    )
> > > > ```
> > > > For our situation here it would be something like
> > > > ```
> > > > <source>:3:16: warning: chained comparisons like 'x<=y<=z' are 
> > > > interpreted as '(x<=y ? 1 : 0) <= z' [-Wcompare-op-parentheses]
> > > >     int w = (x < y < z);
> > > >                ^~~~~~~~
> > > > <source>:3:16: note: place parentheses around the first '<' expression 
> > > > to silence this warning
> > > >     int w = (x < y < z);
> > > >              ^
> > > >              (    )
> > > > <source>:3:16: note: separate the expression into two clauses to give 
> > > > it the mathematical meaning
> > > >     int y = (x < y < z);
> > > >                ^
> > > >              (    ) && (y    )
> > > > ```
> > > > Watch out that you don't suggest a wrong fixit for `(0 <= sideeffect() 
> > > > < 10)`, though. I seem to recall another warning that recently had a 
> > > > lot of trouble phrasing its fixit in a way that wouldn't invoke UB or 
> > > > change the behavior of the code in corner cases, but I forget the 
> > > > details.
> > > Surely you'd just need to check `y` for side effects before creating the 
> > > fix-it.
> > Still working on these, thanks
> still working on these, thanks
My understanding is that option (2) `(x <= (y <= z))` is never suggested. It's 
reasonable not to suggest it, because it is neither "what the compiler sees, 
elucidated for the human reader" nor "what the programmer meant, corrected for 
the compiler." However, as it's not suggested, it shouldn't be documented in 
this comment.


================
Comment at: clang/test/Misc/warning-wall.c:86
 CHECK-NEXT:  -Wparentheses
+CHECK-NEXT:    -Wcompare-op-parentheses
 CHECK-NEXT:    -Wlogical-op-parentheses
----------------
My impression is that you (Vincent) are tending toward just adding `x == y == 
z` and `x <= y == z` to this same `-Wcompare-op-parentheses`. That's also my 
preference (except that I wish it could be done all together in one big pull 
request instead of being split up and perhaps deferred).  Have we conclusively 
established that everyone's on board for this?

An alternative (but IMHO a poor alternative) would be to have two or three more 
granular warnings, e.g. `-Wrelational-op-parentheses` and 
`-Wequality-op-parentheses` (and 
`-Wmixed-relational-equality-op-parentheses`?!). If we were to foresee that 
happening, then `-Wcompare-op-parentheses` would be the wrong name for this 
warning option today.


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