From 46ae6e2d952c95fdb88256b7d5a7e9b995353bf7 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Mon, 3 Nov 2014 17:03:07 +0000 Subject: [PATCH] This patch reverts r220496 which issues warning on comparing parameters with nonnull attribute when comparison is always true/false. Patch causes false positive when parameter is modified in the function. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221163 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.td | 8 ------ lib/Sema/SemaChecking.cpp | 32 +--------------------- test/Sema/nonnull.c | 25 ----------------- 3 files changed, 1 insertion(+), 64 deletions(-) diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 4cd831febe..6503aef324 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -2507,10 +2507,6 @@ def warn_impcast_pointer_to_bool : Warning< "address of%select{| function| array}0 '%1' will always evaluate to " "'true'">, InGroup; -def warn_cast_nonnull_to_bool : Warning< - "nonnull parameter '%0' will always evaluate to " - "'true'">, - InGroup; def warn_this_bool_conversion : Warning< "'this' pointer cannot be null in well-defined C++ code; pointer may be " "assumed to always convert to true">, InGroup; @@ -2523,10 +2519,6 @@ def warn_null_pointer_compare : Warning< "comparison of %select{address of|function|array}0 '%1' %select{not |}2" "equal to a null pointer is always %select{true|false}2">, InGroup; -def warn_nonnull_parameter_compare : Warning< - "comparison of nonnull parameter '%0' %select{not |}1" - "equal to a null pointer is always %select{true|false}1">, - InGroup; def warn_this_null_compare : Warning< "'this' pointer cannot be null in well-defined C++ code; comparison may be " "assumed to always evaluate to %select{true|false}0">, diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 495fa3253e..ea4f3476b6 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -6678,37 +6678,7 @@ void Sema::DiagnoseAlwaysNonNullPointer(Expr *E, // Weak Decls can be null. if (!D || D->isWeak()) return; - // Check for parameter decl with nonnull attribute - if (ParmVarDecl* PV = dyn_cast(D)) { - if (FunctionDecl* FD = dyn_cast(PV->getDeclContext())) { - unsigned NumArgs = FD->getNumParams(); - llvm::SmallBitVector AttrNonNull(NumArgs); - for (const auto *NonNull : FD->specific_attrs()) { - if (!NonNull->args_size()) { - AttrNonNull.set(0, NumArgs); - break; - } - for (unsigned Val : NonNull->args()) { - if (Val >= NumArgs) - continue; - AttrNonNull.set(Val); - } - } - if (!AttrNonNull.empty()) - for (unsigned i = 0; i < NumArgs; ++i) - if (FD->getParamDecl(i) == PV && AttrNonNull[i]) { - std::string Str; - llvm::raw_string_ostream S(Str); - E->printPretty(S, nullptr, getPrintingPolicy()); - unsigned DiagID = IsCompare ? diag::warn_nonnull_parameter_compare - : diag::warn_cast_nonnull_to_bool; - Diag(E->getExprLoc(), DiagID) << S.str() << E->getSourceRange() - << Range << IsEqual; - return; - } - } - } - + QualType T = D->getType(); const bool IsArray = T->isArrayType(); const bool IsFunction = T->isFunctionType(); diff --git a/test/Sema/nonnull.c b/test/Sema/nonnull.c index 53f94dd3a4..3b654a8890 100644 --- a/test/Sema/nonnull.c +++ b/test/Sema/nonnull.c @@ -83,28 +83,3 @@ void redecl_test(void *p) { redecl(p, 0); // expected-warning{{null passed}} redecl(0, p); // expected-warning{{null passed}} } - -// rdar://18712242 -#define NULL (void*)0 -__attribute__((__nonnull__)) -int evil_nonnull_func(int* pointer, void * pv) -{ - if (pointer == NULL) { // expected-warning {{comparison of nonnull parameter 'pointer' equal to a null pointer is always false}} - return 0; - } else { - return *pointer; - } - - if (pv == NULL) {} // expected-warning {{comparison of nonnull parameter 'pv' equal to a null pointer is always false}} -} - -int another_evil_nonnull_func(int* pointer, char ch, void * pv) __attribute__((nonnull(1, 3))); -int another_evil_nonnull_func(int* pointer, char ch, void * pv) { - if (pointer == NULL) { // expected-warning {{comparison of nonnull parameter 'pointer' equal to a null pointer is always false}} - return 0; - } else { - return *pointer; - } - - if (pv == NULL) {} // expected-warning {{comparison of nonnull parameter 'pv' equal to a null pointer is always false}} -} -- 2.40.0