Typo correction for member access into classes/structs/unions, e.g.,

  s.fnd("hello")

llvm-svn: 92345
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
index 9abbd57..1419ceb 100644
--- a/clang/lib/Sema/SemaLookup.cpp
+++ b/clang/lib/Sema/SemaLookup.cpp
@@ -2134,6 +2134,9 @@
 /// \param SS the nested-name-specifier that precedes the name we're
 /// looking for, if present.
 ///
+/// \param MemberContext if non-NULL, the context in which to look for
+/// a member access expression.
+///
 /// \param EnteringContext whether we're entering the context described by 
 /// the nested-name-specifier SS.
 ///
@@ -2141,7 +2144,7 @@
 /// structure will contain the results of name lookup for the
 /// corrected name. Otherwise, returns false.
 bool Sema::CorrectTypo(LookupResult &Res, Scope *S, const CXXScopeSpec *SS,
-                       bool EnteringContext) {
+                       DeclContext *MemberContext, bool EnteringContext) {
   // We only attempt to correct typos for identifiers.
   IdentifierInfo *Typo = Res.getLookupName().getAsIdentifierInfo();
   if (!Typo)
@@ -2158,7 +2161,9 @@
     return false;
 
   TypoCorrectionConsumer Consumer(Typo);
-  if (SS && SS->isSet()) {
+  if (MemberContext)
+    LookupVisibleDecls(MemberContext, Res.getLookupKind(), Consumer);
+  else if (SS && SS->isSet()) {
     DeclContext *DC = computeDeclContext(*SS, EnteringContext);
     if (!DC)
       return false;
@@ -2193,7 +2198,11 @@
   // success if we found something that was not ambiguous.
   Res.clear();
   Res.setLookupName(BestName);
-  LookupParsedName(Res, S, SS, /*AllowBuiltinCreation=*/false, EnteringContext);
+  if (MemberContext)
+    LookupQualifiedName(Res, MemberContext);
+  else
+    LookupParsedName(Res, S, SS, /*AllowBuiltinCreation=*/false, 
+                     EnteringContext);
 
   if (Res.isAmbiguous()) {
     Res.suppressDiagnostics();