Correctly instantiate templates with non-type template arguments that

are local externs.  Fixes <rdar://problem/8302138>.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111570 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
John McCall 2010-08-19 23:06:02 +00:00
Родитель 21e09b63df
Коммит 7667245662
2 изменённых файлов: 41 добавлений и 1 удалений

Просмотреть файл

@ -2559,7 +2559,7 @@ NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D,
DeclContext *ParentDC = D->getDeclContext();
if (isa<ParmVarDecl>(D) || isa<NonTypeTemplateParmDecl>(D) ||
isa<TemplateTypeParmDecl>(D) || isa<TemplateTemplateParmDecl>(D) ||
ParentDC->isFunctionOrMethod()) {
(ParentDC->isFunctionOrMethod() && ParentDC->isDependentContext())) {
// D is a local of some kind. Look into the map of local
// declarations to their instantiations.
return cast<NamedDecl>(CurrentInstantiationScope->getInstantiationOf(D));

Просмотреть файл

@ -203,3 +203,43 @@ namespace PR6964 {
struct as_nview<Sequence, I0> // expected-note{{while checking a default template argument used here}}
{ };
}
// rdar://problem/8302138
namespace test8 {
template <int* ip> struct A {
int* p;
A() : p(ip) {}
};
void test0() {
extern int i00;
A<&i00> a00;
}
extern int i01;
void test1() {
A<&i01> a01;
}
struct C {
int x;
char y;
double z;
};
template <C* cp> struct B {
C* p;
B() : p(cp) {}
};
void test2() {
extern C c02;
B<&c02> b02;
}
extern C c03;
void test3() {
B<&c03> b03;
}
}