diff options
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r-- | lib/CodeGen/CGVtable.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index 9204e4e565..cedefba1e4 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -3805,7 +3805,17 @@ void CodeGenVTables::EmitVTableRelatedData(GlobalDecl GD) { return; TemplateSpecializationKind kind = RD->getTemplateSpecializationKind(); - if (kind == TSK_ImplicitInstantiation) + + + // The reason we have TSK_ExplicitInstantiationDeclaration in here (but not + // in Sema::MaybeMarkVirtualMembersReferenced) is for the case + // template<> void stdio_sync_filebuf<wchar_t>::xsgetn() { + // } + // extern template class stdio_sync_filebuf<wchar_t>; + // Since we are called after the extern declaration is seen. + + if (kind == TSK_ImplicitInstantiation || + kind == TSK_ExplicitInstantiationDeclaration) CGM.DeferredVtables.push_back(RD); else GenerateClassData(CGM.getVtableLinkage(RD), RD); |