From 65f958dca64ef64d43bf85e871ec64e638ff2602 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 22 Oct 2013 21:56:29 +0000 Subject: [PATCH] Consider hidden decls for isUsed checks. This fixes pr17624. A FIXME from Richard Smith: It seems to me that the root cause is that a per-Decl 'used' flag doesn't really make much sense in the way we use it now. I think we should either track whether that particular declaration is used (with isUsed scanning the entire redecl chain), or we should only have one flag for the entire redeclaration chain (perhaps by always looking at the flag on either the most recent decl or the canonical decl). Modeling it as "is this declaration or any previous declaration used" is weird, and requires contortions like the loop at the end of Sema::MarkFunctionReferenced. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193202 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDecl.cpp | 4 ++-- test/Sema/warn-variable-not-needed.c | 9 +++++++++ test/SemaCXX/warn-func-not-needed.cpp | 9 +++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test/Sema/warn-variable-not-needed.c diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index d19d2c42a9..81ade1f3ce 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2788,7 +2788,7 @@ bool Sema::MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old, New->setPure(); // Merge "used" flag. - New->setIsUsed(Old->isUsed(false)); + New->setIsUsed(Old->getMostRecentDecl()->isUsed(false)); // Merge attributes from the parameters. These can mismatch with K&R // declarations. @@ -3101,7 +3101,7 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) { } // Merge "used" flag. - New->setIsUsed(Old->isUsed(false)); + New->setIsUsed(Old->getMostRecentDecl()->isUsed(false)); // Keep a chain of previous declarations. New->setPreviousDecl(Old); diff --git a/test/Sema/warn-variable-not-needed.c b/test/Sema/warn-variable-not-needed.c new file mode 100644 index 0000000000..472ac82989 --- /dev/null +++ b/test/Sema/warn-variable-not-needed.c @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wall %s +// expected-no-diagnostics + +static int a; +int bar() { + extern int a; + return a; +} +static int a; diff --git a/test/SemaCXX/warn-func-not-needed.cpp b/test/SemaCXX/warn-func-not-needed.cpp index d51c173566..65721f44f5 100644 --- a/test/SemaCXX/warn-func-not-needed.cpp +++ b/test/SemaCXX/warn-func-not-needed.cpp @@ -42,3 +42,12 @@ namespace test4 { g(); } } + +namespace test4 { + static void func(); + void bar() { + void func(); + func(); + } + static void func() {} +} -- 2.40.0