From: Nick Lewycky Date: Thu, 5 Aug 2010 06:27:49 +0000 (+0000) Subject: Remove the warning for variables declared in the if-expression being used in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c133e9ea17d61062bcfb3bd6009c300c9a78161f;p=clang Remove the warning for variables declared in the if-expression being used in 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 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 470261425a..2ff8de310e 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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; diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 1dffa0e64c..6799da1ab6 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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()) { 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 index 1307c43bc2..0000000000 --- a/test/SemaCXX/warn-for-var-in-else.cpp +++ /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}} - } -}