When filtering the list of associated namespaces so that we don't suggest people

add functions to namespace 'std', also filter out namespaces with '__' anywhere
in the name.

llvm-svn: 167786
This commit is contained in:
Nick Lewycky 2012-11-13 00:08:34 +00:00
parent c25d3fe71e
commit a21719d688
2 changed files with 23 additions and 11 deletions

View File

@ -9536,18 +9536,16 @@ DiagnoseTwoPhaseLookup(Sema &SemaRef, SourceLocation FnLoc,
SemaRef.FindAssociatedClassesAndNamespaces(FnLoc, Args,
AssociatedNamespaces,
AssociatedClasses);
// Never suggest declaring a function within namespace 'std'.
// Never suggest declaring a function within namespace 'std'.
Sema::AssociatedNamespaceSet SuggestedNamespaces;
if (DeclContext *Std = SemaRef.getStdNamespace()) {
for (Sema::AssociatedNamespaceSet::iterator
it = AssociatedNamespaces.begin(),
end = AssociatedNamespaces.end(); it != end; ++it) {
if (!Std->Encloses(*it))
SuggestedNamespaces.insert(*it);
}
} else {
// Lacking the 'std::' namespace, use all of the associated namespaces.
SuggestedNamespaces = AssociatedNamespaces;
DeclContext *Std = SemaRef.getStdNamespace();
for (Sema::AssociatedNamespaceSet::iterator
it = AssociatedNamespaces.begin(),
end = AssociatedNamespaces.end(); it != end; ++it) {
NamespaceDecl *Assoc = cast<NamespaceDecl>(*it);
if ((!Std || !Std->Encloses(Assoc)) &&
Assoc->getQualifiedNameAsString().find("__") == std::string::npos)
SuggestedNamespaces.insert(Assoc);
}
SemaRef.Diag(R.getNameLoc(), diag::err_not_found_by_two_phase_lookup)

View File

@ -346,3 +346,17 @@ namespace rdar12629723 {
virtual void foo() { }
};
}
namespace test_reserved_identifiers {
template<typename A, typename B> void tempf(A a, B b) {
a + b; // expected-error{{call to function 'operator+' that is neither visible in the template definition nor found by argument-dependent lookup}}
}
namespace __gnu_cxx { struct X {}; }
namespace ns { struct Y {}; }
void operator+(__gnu_cxx::X, ns::Y); // expected-note{{or in namespace 'test_reserved_identifiers::ns'}}
void test() {
__gnu_cxx::X x;
ns::Y y;
tempf(x, y); // expected-note{{in instantiation of}}
}
}