Improve the unused-value check to look into comma expressions and filter out
voids in sub-expressions.  Patch by Mike M!

Fixes PR4806.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98335 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index efd0fd1..1b3202d 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -788,6 +788,8 @@
 
   switch (getStmtClass()) {
   default:
+    if (getType()->isVoidType())
+      return false;
     Loc = getExprLoc();
     R1 = getSourceRange();
     return true;
@@ -834,8 +836,8 @@
         if (IE->getValue() == 0)
           return false;
 
-      return (BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) ||
-              BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
+      return (BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) ||
+              BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
     }
 
     if (BO->isAssignmentOp())
@@ -936,6 +938,8 @@
       if (const Expr *E = dyn_cast<Expr>(CS->body_back()))
         return E->isUnusedResultAWarning(Loc, R1, R2, Ctx);
 
+    if (getType()->isVoidType())
+      return false;
     Loc = cast<StmtExpr>(this)->getLParenLoc();
     R1 = getSourceRange();
     return true;
@@ -949,6 +953,8 @@
     R1 = cast<CStyleCastExpr>(this)->getSubExpr()->getSourceRange();
     return true;
   case CXXFunctionalCastExprClass: {
+    if (getType()->isVoidType())
+      return false;
     const CastExpr *CE = cast<CastExpr>(this);
     
     // If this is a cast to void or a constructor conversion, check the operand.