]> granicus.if.org Git - clang/commitdiff
Remove the warning for variables declared in the if-expression being used in
authorNick Lewycky <nicholas@mxc.ca>
Thu, 5 Aug 2010 06:27:49 +0000 (06:27 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Thu, 5 Aug 2010 06:27:49 +0000 (06:27 +0000)
the else clause. The problem is that it's overly zealous and will respond to
uses in assignments, or after assignments. We should bring this back once we
can do it right. Fixes PR7100.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110314 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/SemaCXX/warn-for-var-in-else.cpp [deleted file]

index 470261425a97f625da483a433d12ea4d36dc0694..2ff8de310e328af96a8669527ac135e233533611 100644 (file)
@@ -2508,9 +2508,6 @@ def note_condition_assign_to_comparison : Note<
 def note_condition_assign_silence : Note<
   "place parentheses around the assignment to silence this warning">;
 
-def warn_value_always_zero : Warning<
-  "%0 is always %select{zero|false|NULL}1 in this context">;
-
 def warn_ivar_variable_conflict : Warning<
   "%0 lookup will access the property ivar in nonfragile-abi2 mode">, 
   InGroup<NonfragileAbi2>;
index 1dffa0e64c2c4c3f8ff4246a0af7d80125fe108a..6799da1ab68b5522f76166ef661e50a8f3513831 100644 (file)
@@ -1191,26 +1191,6 @@ Sema::OwningExprResult Sema::ActOnIdExpression(Scope *S,
         Diag(Property->getLocation(), diag::note_property_declare);
       }
     }
-    
-    // Warn about constructs like:
-    //   if (void *X = foo()) { ... } else { X }.
-    // In the else block, the pointer is always false.
-    if (Var->isDeclaredInCondition() && Var->getType()->isScalarType()) {
-      Scope *CheckS = S;
-      while (CheckS && CheckS->getControlParent()) {
-        if ((CheckS->getFlags() & Scope::ElseScope) &&
-            CheckS->getControlParent()->isDeclScope(DeclPtrTy::make(Var))) {
-          ExprError(Diag(NameLoc, diag::warn_value_always_zero)
-            << Var->getDeclName()
-            << (Var->getType()->isPointerType() ? 2 :
-                Var->getType()->isBooleanType() ? 1 : 0));
-          break;
-        }
-
-        // Move to the parent of this scope.
-        CheckS = CheckS->getParent();
-      }
-    }
   } else if (FunctionDecl *Func = R.getAsSingle<FunctionDecl>()) {
     if (!getLangOptions().CPlusPlus && !Func->hasPrototype()) {
       // C99 DR 316 says that, if a function type comes from a
@@ -4973,7 +4953,7 @@ Sema::CheckSingleAssignmentConstraints(QualType lhsType, Expr *&rExpr) {
   // This check seems unnatural, however it is necessary to ensure the proper
   // conversion of functions/arrays. If the conversion were done for all
   // DeclExpr's (created by ActOnIdExpression), it would mess up the unary
-  // expressions that surpress this implicit conversion (&, sizeof).
+  // expressions that suppress this implicit conversion (&, sizeof).
   //
   // Suppress this for references: C++ 8.5.3p5.
   if (!lhsType->isReferenceType())
diff --git a/test/SemaCXX/warn-for-var-in-else.cpp b/test/SemaCXX/warn-for-var-in-else.cpp
deleted file mode 100644 (file)
index 1307c43..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
-// rdar://6425550
-int bar();
-void do_something(int);
-int *get_ptr();
-
-int foo() {
-  if (int X = bar()) {
-    return X;
-  } else {
-    do_something(X); // expected-warning{{'X' is always zero in this context}}
-    return 0;
-  }
-}
-
-bool foo2() {
-  if (bool B = bar()) {
-    if (int Y = bar()) {
-      return B;
-    } else {
-      do_something(Y); // expected-warning{{'Y' is always zero in this context}}
-      return B;
-    }
-  } else {
-    if (bool B2 = B) { // expected-warning{{'B' is always false in this context}}
-      do_something(B); // expected-warning{{'B' is always false in this context}}
-    } else if (B2) {  // expected-warning{{'B2' is always false in this context}}
-      do_something(B); // expected-warning{{'B' is always false in this context}}
-      do_something(B2); // expected-warning{{'B2' is always false in this context}}
-    }
-    return B; // expected-warning{{'B' is always false in this context}}
-  }
-}
-
-void foo3() {  
-  if (int *P1 = get_ptr())
-    do_something(*P1);
-  else if (int *P2 = get_ptr()) {
-    do_something(*P1); // expected-warning{{'P1' is always NULL in this context}}
-    do_something(*P2);
-  } else {
-    do_something(*P1); // expected-warning{{'P1' is always NULL in this context}}
-    do_something(*P2); // expected-warning{{'P2' is always NULL in this context}}
-  }
-}