]> granicus.if.org Git - clang/commitdiff
don't warn about unused values when the unused value is a statement expression expand...
authorChris Lattner <sabre@nondot.org>
Fri, 31 Aug 2012 22:39:21 +0000 (22:39 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 31 Aug 2012 22:39:21 +0000 (22:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163034 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaStmt.cpp
test/Frontend/macros.c

index c885d484e71ed26ecb8109c086e667cd99dddf4e..76410e20aca5c3145c6b075cfda5109ceb176679 100644 (file)
@@ -160,6 +160,13 @@ void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
       !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.
index 317079709c63a79d9cce88d641149b79dfa5e334..828c762840343a5b964fb7183de8a2d1d1f76af2 100644 (file)
@@ -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!
+}