diff options
| -rw-r--r-- | clang/lib/Sema/SemaCXXScopeSpec.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 3 | ||||
| -rw-r--r-- | clang/test/SemaCXX/member-expr.cpp | 11 | 
5 files changed, 27 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaCXXScopeSpec.cpp b/clang/lib/Sema/SemaCXXScopeSpec.cpp index c0ec9e997d1..42c346fbe83 100644 --- a/clang/lib/Sema/SemaCXXScopeSpec.cpp +++ b/clang/lib/Sema/SemaCXXScopeSpec.cpp @@ -458,8 +458,10 @@ Sema::CXXScopeTy *Sema::BuildCXXNestedNameSpecifier(Scope *S,        if (NamedDecl *ND = Found.getAsSingle<NamedDecl>())          Diag(ND->getLocation(), diag::note_previous_decl)            << ND->getDeclName(); -    } else +    } else {        Found.clear(); +      Found.setLookupName(&II); +    }    }    NamedDecl *SD = Found.getAsSingle<NamedDecl>(); diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index bf75773f6d0..63452f9cbc4 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1139,6 +1139,7 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD,              return true;            R.clear(); +          R.setLookupName(MemberOrBase);          }        } @@ -3516,6 +3517,9 @@ Sema::DeclPtrTy Sema::ActOnUsingDirective(Scope *S,            << Corrected;          NamespcName = Corrected.getAsIdentifierInfo(); +      } else { +        R.clear(); +        R.setLookupName(NamespcName);        }      }    } @@ -4240,6 +4244,9 @@ Sema::DeclPtrTy Sema::ActOnNamespaceAliasDef(Scope *S,            << Corrected;          Ident = Corrected.getAsIdentifierInfo(); +      } else { +        R.clear(); +        R.setLookupName(Ident);        }      } diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index e5c8e973c53..ae16d57870f 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2620,6 +2620,7 @@ LookupMemberExprInRecord(Sema &SemaRef, LookupResult &R,      return false;    } else {      R.clear(); +    R.setLookupName(Name);    }    return false; @@ -3080,6 +3081,9 @@ Sema::LookupMemberExpr(LookupResult &R, Expr *&BaseExpr,                                              IV->getNameAsString());            Diag(IV->getLocation(), diag::note_previous_decl)              << IV->getDeclName(); +        } else { +          Res.clear(); +          Res.setLookupName(Member);          }        } diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 735809f1854..7e5377ab9a9 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -258,7 +258,7 @@ void Sema::LookupTemplateName(LookupResult &Found,      // If we did not find any names, attempt to correct any typos.      DeclarationName Name = Found.getLookupName();      if (DeclarationName Corrected = CorrectTypo(Found, S, &SS, LookupCtx,  -                                                 false, CTC_CXXCasts)) { +                                                false, CTC_CXXCasts)) {        FilterAcceptableTemplateNames(Context, Found);        if (!Found.empty()) {          if (LookupCtx) @@ -277,6 +277,7 @@ void Sema::LookupTemplateName(LookupResult &Found,        }      } else {        Found.clear(); +      Found.setLookupName(Name);      }    } diff --git a/clang/test/SemaCXX/member-expr.cpp b/clang/test/SemaCXX/member-expr.cpp index e83fdbf0870..6830c5fdafb 100644 --- a/clang/test/SemaCXX/member-expr.cpp +++ b/clang/test/SemaCXX/member-expr.cpp @@ -90,3 +90,14 @@ namespace test5 {      x->A::foo<int>(); // expected-error {{'test5::A' is not a pointer}}    }  } + +namespace PR7508 { +  struct A { +    struct CleanupScope {}; +    void PopCleanupBlock(); +  }; + +  void foo(A &a) { +    a.PopCleanupScope(); // expected-error{{no member named 'PopCleanupScope' in 'PR7508::A'}} +  } +}  | 

