forked from OSchip/llvm-project
Correctly set "explicit template instantiation" kind on inner structs of templates whose explicit instantiation is first declared and then defined.
Fixes http://llvm.org/pr8207 llvm-svn: 114874
This commit is contained in:
parent
ca54e280d5
commit
d75488d010
|
@ -1447,7 +1447,7 @@ Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation,
|
|||
if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK,
|
||||
Function,
|
||||
MSInfo->getTemplateSpecializationKind(),
|
||||
MSInfo->getPointOfInstantiation(),
|
||||
MSInfo->getPointOfInstantiation(),
|
||||
SuppressNew) ||
|
||||
SuppressNew)
|
||||
continue;
|
||||
|
@ -1483,7 +1483,7 @@ Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation,
|
|||
if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK,
|
||||
Var,
|
||||
MSInfo->getTemplateSpecializationKind(),
|
||||
MSInfo->getPointOfInstantiation(),
|
||||
MSInfo->getPointOfInstantiation(),
|
||||
SuppressNew) ||
|
||||
SuppressNew)
|
||||
continue;
|
||||
|
@ -1518,11 +1518,11 @@ Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation,
|
|||
if (MSInfo->getTemplateSpecializationKind()
|
||||
== TSK_ExplicitSpecialization)
|
||||
continue;
|
||||
|
||||
|
||||
if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK,
|
||||
Record,
|
||||
MSInfo->getTemplateSpecializationKind(),
|
||||
MSInfo->getPointOfInstantiation(),
|
||||
MSInfo->getPointOfInstantiation(),
|
||||
SuppressNew) ||
|
||||
SuppressNew)
|
||||
continue;
|
||||
|
@ -1549,6 +1549,13 @@ Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation,
|
|||
InstantiateClass(PointOfInstantiation, Record, Pattern,
|
||||
TemplateArgs,
|
||||
TSK);
|
||||
} else {
|
||||
if (TSK == TSK_ExplicitInstantiationDefinition &&
|
||||
Record->getTemplateSpecializationKind() ==
|
||||
TSK_ExplicitInstantiationDeclaration) {
|
||||
Record->setTemplateSpecializationKind(TSK);
|
||||
MarkVTableUsed(PointOfInstantiation, Record, true);
|
||||
}
|
||||
}
|
||||
|
||||
Pattern = cast_or_null<CXXRecordDecl>(Record->getDefinition());
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
// RUN: %clang_cc1 -fvisibility hidden -emit-llvm -o - %s | FileCheck %s
|
||||
|
||||
// Verify that symbols are hidden.
|
||||
// CHECK: @_ZN1CIiE5Inner6Inner26StaticE = weak hidden global
|
||||
// CHECK: define weak_odr hidden void @_ZN1CIiE5Inner1fEv
|
||||
// CHECK: define weak_odr hidden void @_ZN1CIiE5Inner6Inner21gEv
|
||||
|
||||
template<typename T>
|
||||
struct C {
|
||||
struct Inner {
|
||||
void f();
|
||||
struct Inner2 {
|
||||
void g();
|
||||
static int Static;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
template<typename T> void C<T>::Inner::f() { }
|
||||
template<typename T> void C<T>::Inner::Inner2::g() { }
|
||||
template<typename T> int C<T>::Inner::Inner2::Static;
|
||||
|
||||
extern template struct C<int>;
|
||||
template struct C<int>;
|
Loading…
Reference in New Issue