When typo-correcting a member using-declaration, only consider members of base classes.

llvm-svn: 207680
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index d49e68e..b1b67a6 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -7318,9 +7318,9 @@
 class UsingValidatorCCC : public CorrectionCandidateCallback {
 public:
   UsingValidatorCCC(bool HasTypenameKeyword, bool IsInstantiation,
-                    bool RequireMember)
+                    CXXRecordDecl *RequireMemberOf)
       : HasTypenameKeyword(HasTypenameKeyword),
-        IsInstantiation(IsInstantiation), RequireMember(RequireMember) {}
+        IsInstantiation(IsInstantiation), RequireMemberOf(RequireMemberOf) {}
 
   bool ValidateCandidate(const TypoCorrection &Candidate) override {
     NamedDecl *ND = Candidate.getCorrectionDecl();
@@ -7329,13 +7329,14 @@
     if (!ND || isa<NamespaceDecl>(ND))
       return false;
 
-    // FIXME: We should check if ND is member of base class of class having
-    // using declaration and direct base class in case using declaration names
-    // a constructor.
-    if (RequireMember && !ND->isCXXClassMember())
-      return false;
+    if (RequireMemberOf) {
+      auto *RD = dyn_cast<CXXRecordDecl>(ND->getDeclContext());
+      if (!RD || RequireMemberOf->isProvablyNotDerivedFrom(RD))
+        return false;
+      // FIXME: Check that the base class member is accessible?
+    }
 
-    if (RequireMember && !isa<FieldDecl>(ND) && !isa<CXXMethodDecl>(ND) &&
+    if (RequireMemberOf && !isa<FieldDecl>(ND) && !isa<CXXMethodDecl>(ND) &&
         !isa<TypeDecl>(ND))
       return false;
 
@@ -7352,7 +7353,7 @@
 private:
   bool HasTypenameKeyword;
   bool IsInstantiation;
-  bool RequireMember;
+  CXXRecordDecl *RequireMemberOf;
 };
 } // end anonymous namespace
 
@@ -7476,7 +7477,7 @@
   // Try to correct typos if possible.
   if (R.empty()) {
     UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation,
-                          CurContext->isRecord());
+                          dyn_cast<CXXRecordDecl>(CurContext));
     if (TypoCorrection Corrected = CorrectTypo(R.getLookupNameInfo(),
                                                R.getLookupKind(), S, &SS, CCC,
                                                CTK_ErrorRecovery)){