зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
21e09b63df
Коммит
7667245662
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче