diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 2d82750e1b..e5af2b16d7 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -9541,16 +9541,23 @@ DiagnoseTwoPhaseLookup(Sema &SemaRef, SourceLocation FnLoc, SemaRef.FindAssociatedClassesAndNamespaces(FnLoc, Args, AssociatedNamespaces, AssociatedClasses); - // Never suggest declaring a function within namespace 'std'. Sema::AssociatedNamespaceSet SuggestedNamespaces; DeclContext *Std = SemaRef.getStdNamespace(); for (Sema::AssociatedNamespaceSet::iterator it = AssociatedNamespaces.begin(), end = AssociatedNamespaces.end(); it != end; ++it) { - NamespaceDecl *Assoc = cast(*it); - if ((!Std || !Std->Encloses(Assoc)) && - Assoc->getQualifiedNameAsString().find("__") == std::string::npos) - SuggestedNamespaces.insert(Assoc); + // Never suggest declaring a function within namespace 'std'. + if (Std && Std->Encloses(*it)) + continue; + + // Never suggest declaring a function within a namespace with a reserved + // name, like __gnu_cxx. + NamespaceDecl *NS = dyn_cast(*it); + if (NS && + NS->getQualifiedNameAsString().find("__") != std::string::npos) + continue; + + SuggestedNamespaces.insert(*it); } SemaRef.Diag(R.getNameLoc(), diag::err_not_found_by_two_phase_lookup) diff --git a/test/SemaTemplate/dependent-names.cpp b/test/SemaTemplate/dependent-names.cpp index 7ef12b8788..eb75e69ef4 100644 --- a/test/SemaTemplate/dependent-names.cpp +++ b/test/SemaTemplate/dependent-names.cpp @@ -360,3 +360,12 @@ namespace test_reserved_identifiers { tempf(x, y); // expected-note{{in instantiation of}} } } + +// This test must live in the global namespace. +struct PR14695_X {}; +// FIXME: This note is bogus; it is the using directive which would need to move +// to prior to the call site to fix the problem. +namespace PR14695_A { void PR14695_f(PR14695_X); } // expected-note {{'PR14695_f' should be declared prior to the call site or in the global namespace}} +template void PR14695_g(T t) { PR14695_f(t); } // expected-error {{call to function 'PR14695_f' that is neither visible in the template definition nor found by argument-dependent lookup}} +using namespace PR14695_A; +template void PR14695_g(PR14695_X); // expected-note{{requested here}}