[PATCH] D47687: [Sema] Missing -Wlogical-op-parentheses warnings in macros (PR18971)

Duncan P. N. Exon Smith via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 18 08:47:33 PDT 2018


dexonsmith added a comment.

Did you miss this comment from my previous review?

> I would like to see tests like the following:
> 
>   NESTING_VOID_WRAPPER(&&, ||, i, i, i && i); // no warning.
>   NESTING_VOID_WRAPPER(||, &&, i, i, i || i); // no warning.





================
Comment at: lib/Sema/SemaExpr.cpp:12254-12255
+    if (SM.isMacroArgExpansion(LHSExpr->getExprLoc(), &ExprExpansionLoc) &&
+        !SM.getImmediateMacroCallerLoc(LHSExpr->getExprLoc()).isMacroID() &&
+        OpExpansionLoc == ExprExpansionLoc)
+      DiagnoseLogicalAndInLogicalOrLHS(Self, OpLoc, LHSExpr, RHSExpr);
----------------
Can you reverse these two checks?  The second one looks cheaper.


================
Comment at: lib/Sema/SemaExpr.cpp:12243
+    DiagnoseLogicalAndInLogicalOrRHS(Self, OpLoc, LHSExpr, RHSExpr);
+  } else {
+    SourceLocation OpExpansionLoc;
----------------
dexonsmith wrote:
> You can reduce nesting below by adding an early return above this.
> 
> I also think you should describe at a high-level what you're trying to do in the code that follows.  Something like:
> ```
> // Only diagnose operators in macros if they're from the same argument position.
> ```
You added an early return -- but then you didn't actually reduce the nesting.  Please remove the else that follows.


================
Comment at: test/Sema/parentheses.c:114
+  NON_NESTING_VOID_0(i && i || i); // expected-warning {{'&&' within '||'}} \
+                                   // expected-note {{place parentheses around the '&&' expression to silence this warning}}
+  NON_NESTING_VOID_0((i && i) || i); // no warning.
----------------
Higuoxing wrote:
> Higuoxing wrote:
> > dexonsmith wrote:
> > > Can you add fix-it CHECKs?
> > ```
> > llvm/tools/clang/test/Sema/parentheses.c:109:15: note: place parentheses around the '&&' expression to silence this warning
> >   VOID_CAST(i && i || i); // expected-warning {{'&&' within '||'}} \
> >             ~~^~~~
> > llvm/tools/clang/test/Sema/parentheses.c:17:34: note: expanded from macro 'VOID_CAST'
> > #define VOID_CAST(cond) ( (void)(cond) )
> >                                  ^~~~
> > ```
> > 
> > Sorry, it seems that when deal with expressions in macros, there is no fix-it hint ...
> The `suggestParentheses` suppress the fix-it hint when the expression is in macros
> 
> ```
>   if (ParenRange.getBegin().isFileID() && ParenRange.getEnd().isFileID() &&
>       EndLoc.isValid()) {
>     Self.Diag(Loc, Note)
>       << FixItHint::CreateInsertion(ParenRange.getBegin(), "(")
>       << FixItHint::CreateInsertion(EndLoc, ")");
>   } else {
>     // We can't display the parentheses, so just show the bare note.
>     Self.Diag(Loc, Note) << ParenRange;
>   }
> ```
> 
> You see, there is a `isFileID()`
Can you make it work?  The diagnostic was disabled because it was low quality: no fix-it, and firing when it was not actionable.  I'm not convinced we should turn it back on until we can give a fix-it.


https://reviews.llvm.org/D47687





More information about the cfe-commits mailing list