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:
Nico Weber 2010-09-27 21:02:09 +00:00
parent ca54e280d5
commit d75488d010
2 changed files with 35 additions and 4 deletions

View File

@ -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());

View File

@ -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>;