зеркало из https://github.com/microsoft/clang-1.git
Implement template instantiation for using directives, which is dead simple.
Also, make the "don't know how to instantiate a particular kind of declaration" diagnostic nicer, so we don't have to trap Clang in a debugger to figure out what went wrong. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89050 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
b3375cba79
Коммит
48c32a7e7c
|
@ -65,11 +65,17 @@ namespace {
|
|||
Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
|
||||
Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
|
||||
Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
|
||||
Decl *VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
|
||||
Decl *VisitUnresolvedUsingDecl(UnresolvedUsingDecl *D);
|
||||
|
||||
// Base case. FIXME: Remove once we can instantiate everything.
|
||||
Decl *VisitDecl(Decl *) {
|
||||
assert(false && "Template instantiation of unknown declaration kind!");
|
||||
Decl *VisitDecl(Decl *D) {
|
||||
unsigned DiagID = SemaRef.getDiagnostics().getCustomDiagID(
|
||||
Diagnostic::Error,
|
||||
"cannot instantiate %0 yet");
|
||||
SemaRef.Diag(D->getLocation(), DiagID)
|
||||
<< D->getDeclKindName();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1005,6 +1011,20 @@ TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
|
|||
return Param;
|
||||
}
|
||||
|
||||
Decl *TemplateDeclInstantiator::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
|
||||
// Using directives are never dependent, so they require no explicit
|
||||
|
||||
UsingDirectiveDecl *Inst
|
||||
= UsingDirectiveDecl::Create(SemaRef.Context, Owner, D->getLocation(),
|
||||
D->getNamespaceKeyLocation(),
|
||||
D->getQualifierRange(), D->getQualifier(),
|
||||
D->getIdentLocation(),
|
||||
D->getNominatedNamespace(),
|
||||
D->getCommonAncestor());
|
||||
Owner->addDecl(Inst);
|
||||
return Inst;
|
||||
}
|
||||
|
||||
Decl *
|
||||
TemplateDeclInstantiator::VisitUnresolvedUsingDecl(UnresolvedUsingDecl *D) {
|
||||
NestedNameSpecifier *NNS =
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
// RUN: clang-cc -fsyntax-only -verify %s
|
||||
|
||||
namespace N { }
|
||||
|
||||
template<typename T>
|
||||
struct A {
|
||||
void f();
|
||||
|
@ -10,6 +12,7 @@ struct B : A<T> {
|
|||
using A<T>::f;
|
||||
|
||||
void g() {
|
||||
using namespace N;
|
||||
f();
|
||||
}
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче