diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index d19d2c42a9d894eb4091093e43d9270425f7bf37..81ade1f3ce0911147c79ef96de073a37d225d036 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 0000000000000000000000000000000000000000..472ac8298999fa220f78304811b7127b34f146a8 --- /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 d51c17356632e134ebde0a43611f192073daa341..65721f44f57073467732cef5546e62cfb9493962 100644 --- a/test/SemaCXX/warn-func-not-needed.cpp +++ b/test/SemaCXX/warn-func-not-needed.cpp @@ -42,3 +42,12 @@ namespace test4 { g<int>(); } } + +namespace test4 { + static void func(); + void bar() { + void func(); + func(); + } + static void func() {} +}