Fix the search for visible declarations within a Scope to ensure that
we look into a Scope that corresponds to a compound statement whose scope was combined with the scope of the function that owns it. This improves typo correction in many common cases. llvm-svn: 92879
This commit is contained in:
parent
43a0857631
commit
712dcfe921
|
@ -2000,6 +2000,19 @@ static void LookupVisibleDecls(Scope *S, LookupResult &Result,
|
|||
if (!S)
|
||||
return;
|
||||
|
||||
if (!S->getEntity() || !S->getParent() ||
|
||||
((DeclContext *)S->getEntity())->isFunctionOrMethod()) {
|
||||
// Walk through the declarations in this Scope.
|
||||
for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
|
||||
D != DEnd; ++D) {
|
||||
if (NamedDecl *ND = dyn_cast<NamedDecl>((Decl *)((*D).get())))
|
||||
if (Result.isAcceptableDecl(ND)) {
|
||||
Consumer.FoundDecl(ND, Visited.checkHidden(ND));
|
||||
Visited.add(ND);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DeclContext *Entity = 0;
|
||||
if (S->getEntity()) {
|
||||
// Look into this scope's declaration context, along with any of its
|
||||
|
@ -2041,21 +2054,10 @@ static void LookupVisibleDecls(Scope *S, LookupResult &Result,
|
|||
// doing so would force the normal C++ name-lookup code to look into the
|
||||
// translation unit decl when the IdentifierInfo chains would suffice.
|
||||
// Once we fix that problem (which is part of a more general "don't look
|
||||
// in DeclContexts unless we have to" optimization), we can eliminate the
|
||||
// TranslationUnit parameter entirely.
|
||||
// in DeclContexts unless we have to" optimization), we can eliminate this.
|
||||
Entity = Result.getSema().Context.getTranslationUnitDecl();
|
||||
LookupVisibleDecls(Entity, Result, /*QualifiedNameLookup=*/false,
|
||||
Consumer, Visited);
|
||||
} else {
|
||||
// Walk through the declarations in this Scope.
|
||||
for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
|
||||
D != DEnd; ++D) {
|
||||
if (NamedDecl *ND = dyn_cast<NamedDecl>((Decl *)((*D).get())))
|
||||
if (Result.isAcceptableDecl(ND)) {
|
||||
Consumer.FoundDecl(ND, Visited.checkHidden(ND));
|
||||
Visited.add(ND);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Entity) {
|
||||
|
|
|
@ -21,8 +21,9 @@ tring str2; // expected-error{{unknown type name 'tring'; did you mean 'string'?
|
|||
|
||||
::other_std::string str3; // expected-error{{no member named 'other_std' in the global namespace; did you mean 'otherstd'?}}
|
||||
|
||||
float area(float radius, float pi) {
|
||||
return radious * pi; // expected-error{{use of undeclared identifier 'radious'; did you mean 'radius'?}}
|
||||
float area(float radius, // expected-note{{'radius' declared here}}
|
||||
float pi) {
|
||||
return radious * pi; // expected-error{{did you mean 'radius'?}}
|
||||
}
|
||||
|
||||
bool test_string(std::string s) {
|
||||
|
|
|
@ -76,7 +76,7 @@ void test6() {
|
|||
}
|
||||
|
||||
// PR5606
|
||||
int f0(int var) {
|
||||
int f0(int var) { // expected-note{{'var' declared here}}
|
||||
switch (va) { // expected-error{{use of undeclared identifier 'va'}}
|
||||
case 1:
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue