Add r168519 back, but with a fix to also merge the used flag in variables.

llvm-svn: 168564
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index 7b20e775..b04c149 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/lib/AST/DeclBase.cpp
@@ -261,13 +261,6 @@
   if (CheckUsedAttr && hasAttr<UsedAttr>())
     return true;
 
-  // Check redeclarations. We merge attributes, so we don't need to check
-  // attributes in all redeclarations.
-  for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) {
-    if (I->Used)
-      return true;
-  }
-
   return false; 
 }
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 629fccc..6a9065e 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -2388,6 +2388,10 @@
   if (Old->isPure())
     New->setPure();
 
+  // Merge "used" flag.
+  if (Old->isUsed(false))
+    New->setUsed();
+
   // Merge attributes from the parameters.  These can mismatch with K&R
   // declarations.
   if (New->getNumParams() == Old->getNumParams())
@@ -2613,6 +2617,10 @@
       New->getDeclContext() == Old->getDeclContext())
     New->setStorageClass(Old->getStorageClass());
 
+  // Merge "used" flag.
+  if (Old->isUsed(false))
+    New->setUsed();
+
   // Keep a chain of previous declarations.
   New->setPreviousDeclaration(Old);