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>;
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
// 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())
+++ /dev/null
-// 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}}
- }
-}