[cfe-commits] r163034 - in /cfe/trunk: lib/Sema/SemaStmt.cpp test/Frontend/macros.c

Chris Lattner sabre at nondot.org
Fri Aug 31 15:39:21 PDT 2012


Author: lattner
Date: Fri Aug 31 17:39:21 2012
New Revision: 163034

URL: http://llvm.org/viewvc/llvm-project?rev=163034&view=rev
Log:
don't warn about unused values when the unused value is a statement expression expanded from a macro.  This is of dubious utility in general, but is specifically a major issue for the linux kernel.  This resolves PR13747.

Modified:
    cfe/trunk/lib/Sema/SemaStmt.cpp
    cfe/trunk/test/Frontend/macros.c

Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=163034&r1=163033&r2=163034&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
+++ cfe/trunk/lib/Sema/SemaStmt.cpp Fri Aug 31 17:39:21 2012
@@ -160,6 +160,13 @@
       !E->isUnusedResultAWarning(WarnExpr, Loc, R1, R2, Context))
     return;
 
+  // If this is a GNU statement expression expanded from a macro, it is probably
+  // unused because it is a function-like macro that can be used as either an
+  // expression or statement.  Don't warn, because it is almost certainly a
+  // false positive.
+  if (isa<StmtExpr>(E) && Loc.isMacroID())
+    return;
+
   // Okay, we have an unused result.  Depending on what the base expression is,
   // we might want to make a more specific diagnostic.  Check for one of these
   // cases now.

Modified: cfe/trunk/test/Frontend/macros.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/macros.c?rev=163034&r1=163033&r2=163034&view=diff
==============================================================================
--- cfe/trunk/test/Frontend/macros.c (original)
+++ cfe/trunk/test/Frontend/macros.c Fri Aug 31 17:39:21 2012
@@ -2,3 +2,11 @@
 
 int a[(B A) == 1 ? 1 : -1];
 
+
+// PR13747 - Don't warn about unused results with statement exprs in macros.
+void stuff(int,int,int);
+#define memset(x,y,z) ({ stuff(x,y,z); x; })
+
+void foo(int a, int b, int c) {
+  memset(a,b,c);  // No warning!
+}





More information about the cfe-commits mailing list