Fix handling of destructor names that name typedefs.

1) Fix a regression in llvmorg-11-init-2485-g0e3a4877840 that would
reject some cases where a class name is shadowed by a typedef-name
causing a destructor declaration to be rejected. Prefer a tag type over
a typedef in destructor name lookup.

2) Convert the "type in destructor declaration is a typedef" error to an
error-by-default ExtWarn to allow codebases to turn it off. GCC and MSVC
do not enforce this rule.
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index a39b0b1..8333385 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -201,11 +201,9 @@
 
     if (TypeDecl *Type = Found.getAsSingle<TypeDecl>()) {
       QualType T = Context.getTypeDeclType(Type);
-      MarkAnyDeclReferenced(Type->getLocation(), Type, /*OdrUse=*/false);
-
       if (SearchType.isNull() || SearchType->isDependentType() ||
           Context.hasSameUnqualifiedType(T, SearchType)) {
-        // We found our type!
+        MarkAnyDeclReferenced(Type->getLocation(), Type, /*OdrUse=*/false);
         return CreateParsedType(T,
                                 Context.getTrivialTypeSourceInfo(T, NameLoc));
       }
@@ -222,7 +220,7 @@
 
     IsDependent |= SearchType->isDependentType();
 
-    LookupResult Found(*this, &II, NameLoc, LookupOrdinaryName);
+    LookupResult Found(*this, &II, NameLoc, LookupDestructorName);
     DeclContext *LookupCtx = computeDeclContext(SearchType);
     if (!LookupCtx)
       return nullptr;
@@ -239,7 +237,7 @@
     if (!LookupCtx)
       return nullptr;
 
-    LookupResult Found(*this, &II, NameLoc, LookupOrdinaryName);
+    LookupResult Found(*this, &II, NameLoc, LookupDestructorName);
     if (RequireCompleteDeclContext(LookupSS, LookupCtx)) {
       Failed = true;
       return nullptr;
@@ -252,7 +250,7 @@
     if (Failed || !S)
       return nullptr;
 
-    LookupResult Found(*this, &II, NameLoc, LookupOrdinaryName);
+    LookupResult Found(*this, &II, NameLoc, LookupDestructorName);
     LookupName(Found, S);
     return CheckLookupResult(Found);
   };