зеркало из https://github.com/microsoft/clang-1.git
PR14695: Fix assert from bad cast<>. Not every namespace is a NamespaceDecl; it might instead be a TranslationUnitDecl.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@170976 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
a734a0eab2
Коммит
19e0d95917
|
@ -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<NamespaceDecl>(*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<NamespaceDecl>(*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)
|
||||
|
|
|
@ -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<typename T> 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}}
|
||||
|
|
Загрузка…
Ссылка в новой задаче