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:
parent
c25d3fe71e
commit
a21719d688
|
@ -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)
|
||||
|
|
|
@ -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}}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue