]> granicus.if.org Git - clang/commitdiff
Factor code out into a DiagnoseUnusedExprResult function.
authorAnders Carlsson <andersca@mac.com>
Thu, 30 Jul 2009 22:17:18 +0000 (22:17 +0000)
committerAnders Carlsson <andersca@mac.com>
Thu, 30 Jul 2009 22:17:18 +0000 (22:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77628 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/Sema.h
lib/Sema/SemaStmt.cpp

index f0fdce5aa3ecc3bb40b203ce4011c7a4aacacf42..fc70090906a68f3cbc19697765d5f74c0bd18341 100644 (file)
@@ -1398,6 +1398,10 @@ public:
                                             MultiStmtArg Handlers);
   void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock);
 
+  /// DiagnoseUnusedExprResult - If the statement passed in is an expression
+  /// whose result is unused, warn.
+  void DiagnoseUnusedExprResult(const Stmt *S);
+  
   //===--------------------------------------------------------------------===//
   // Expression Parsing Callbacks: SemaExpr.cpp.
 
index 11497037c560326203ca0a2e55a53a03445e5db2..badeba79ceabda2eca2a6cbe35a87813a45c7eaa 100644 (file)
@@ -51,6 +51,23 @@ Sema::OwningStmtResult Sema::ActOnDeclStmt(DeclGroupPtrTy dg,
   return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
 }
 
+void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
+  const Expr *E = dyn_cast<Expr>(S);
+  if (!E)
+    return;
+
+  // Ignore expressions that have void type.
+  if (E->getType()->isVoidType())
+    return;
+  
+  SourceLocation Loc;
+  SourceRange R1, R2;
+  if (!E->isUnusedResultAWarning(Loc, R1, R2))
+    return;
+  
+  Diag(Loc, diag::warn_unused_expr) << R1 << R2;
+}
+
 Action::OwningStmtResult
 Sema::ActOnCompoundStmt(SourceLocation L, SourceLocation R,
                         MultiStmtArg elts, bool isStmtExpr) {
@@ -76,20 +93,11 @@ Sema::ActOnCompoundStmt(SourceLocation L, SourceLocation R,
   }
   // Warn about unused expressions in statements.
   for (unsigned i = 0; i != NumElts; ++i) {
-    Expr *E = dyn_cast<Expr>(Elts[i]);
-    if (!E) continue;
-    
-    // Warn about expressions with unused results if they are non-void and if
-    // this not the last stmt in a stmt expr.
-    if (E->getType()->isVoidType() || (isStmtExpr && i == NumElts-1))
+    // Ignore statements that are last in a statement expression.
+    if (isStmtExpr && i == NumElts - 1)
       continue;
     
-    SourceLocation Loc;
-    SourceRange R1, R2;
-    if (!E->isUnusedResultAWarning(Loc, R1, R2))
-      continue;
-
-    Diag(Loc, diag::warn_unused_expr) << R1 << R2;
+    DiagnoseUnusedExprResult(Elts[i]);
   }
 
   return Owned(new (Context) CompoundStmt(Context, Elts, NumElts, L, R));