Quuxplusone added a comment.

Seems low-value at first glance, but I guess I can't argue with those Twitter 
and codesearch results.

Do you have codesearch results for `^2`? 
https://codesearch.isocpp.org/cgi-bin/cgi_ppsearch?q=%5E+2&search=Search  Seems 
like a lot of false positives (and a lot of code comments turning up in 
codesearch??), but would be perhaps even more valuable to the kinds of users 
who would write `10^x` or `x^2`.

What is going on in this case, and would a warning here be a false positive or 
a true positive? 
https://codesearch.isocpp.org/cgi-bin/cgi_ppsearch?q=10+%5E+7&search=Search



================
Comment at: lib/Sema/SemaExpr.cpp:10913
+  if (ExprStr.find("0b") != llvm::StringRef::npos)
+    return;
+  if (S.getLangOpts().CPlusPlus) {
----------------
Why do you special-case `0b` prefix (or suffix — `0x0b` is also special-cased 
by this snippet), but you don't special-case octal or hexadecimal constants? 
I'm sure `x ^ 0x1234` will be a more common spelling than `x ^ 0b1001000110100`.


================
Comment at: lib/Sema/SemaExpr.cpp:10924
+
+  if (LeftSideValue == 2 || LeftSideValue == 10) {
+    llvm::APInt XorValue = LeftSideValue ^ RightSideValue;
----------------
Do you have metrics indicating that this line is an improvement over `if (true) 
{`?


================
Comment at: lib/Sema/SemaExpr.cpp:10959
+    S.Diag(Loc, diag::note_xor_used_as_pow_silence)
+        << ("(" + LHSStr + ") ^ " + RHSStr);
+  }
----------------
I don't understand why parenthesizing one argument should silence the warning. 
Wouldn't it be more natural to suggest converting both arguments to hexadecimal 
or binary?  That is, convert `10 ^ x` to `0xA ^ x`, or `2 ^ 16` to `0x2 ^ 0x10`.


================
Comment at: test/Sema/warn-xor-as-pow.c:38
+  res = 0b10 ^ 16;
+  res = 2 ^ 0b100;
+  res = XOR(2, 16);
----------------
Please add test cases for `2 ^ 0x4` and `2 ^ 04` and `0x2 ^ 10` and `02 ^ 10`.


================
Comment at: test/Sema/warn-xor-as-pow.c:39
+  res = 2 ^ 0b100;
+  res = XOR(2, 16);
+  unsigned char two = 2;
----------------
I don't understand why this line doesn't warn. Is it because the macro's name 
has the case-insensitive string `xor` in it? Is it because there is a macro 
involved at all? In either case, please add another test case for `res = 
FOOBAR(2, 16)`.

Also `res = EPSILON` where `#define EPSILON 10^-300`. That seems to come up in 
the codesearch results a lot.


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

https://reviews.llvm.org/D63423



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

Reply via email to