From c956b6e8ff909858cec5832f024d2af9c58f190b Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Mon, 27 Sep 2010 21:02:09 +0000 Subject: [PATCH] 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114874 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaTemplateInstantiate.cpp | 15 ++++++++---- ...emplate-inner-struct-visibility-hidden.cpp | 24 +++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 test/CodeGenCXX/template-inner-struct-visibility-hidden.cpp diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index e4a8ef59b4..5520f64044 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -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(Record->getDefinition()); diff --git a/test/CodeGenCXX/template-inner-struct-visibility-hidden.cpp b/test/CodeGenCXX/template-inner-struct-visibility-hidden.cpp new file mode 100644 index 0000000000..ca4446cd20 --- /dev/null +++ b/test/CodeGenCXX/template-inner-struct-visibility-hidden.cpp @@ -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 +struct C { + struct Inner { + void f(); + struct Inner2 { + void g(); + static int Static; + }; + }; +}; + +template void C::Inner::f() { } +template void C::Inner::Inner2::g() { } +template int C::Inner::Inner2::Static; + +extern template struct C; +template struct C; -- 2.50.1