And now with a more portable test, courtesy of Benjamin Kramer. Only the CHECK lines changed.
On Sun, Sep 26, 2010 at 3:14 PM, Nico Weber <[email protected]> wrote: > Updated the patch with a slightly beefier test case. The actual code > change is the same as in the previous patch. > > Please review. > > Nico > > On Sat, Sep 25, 2010 at 11:29 PM, Nico Weber <[email protected]> wrote: >> Hi, >> >> the attached patch fixes llvm.org/pr8207 (and potentially more). The >> reason the bug happens is the following code in CodeGenModule: >> >> LangOptions::VisibilityMode >> CodeGenModule::getDeclVisibilityMode(const Decl *D) const { >> // ... >> >> if (getLangOptions().CPlusPlus) { >> // Entities subject to an explicit instantiation declaration get default >> // visibility. >> if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { >> // ... >> } else if (const ClassTemplateSpecializationDecl *ClassSpec >> = dyn_cast<ClassTemplateSpecializationDecl>(D)) >> { >> if (ClassSpec->getSpecializationKind() >> == >> TSK_ExplicitInstantiationDeclaration) >> return LangOptions::Default; >> } else if (const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) { >> if (Record->getTemplateSpecializationKind() >> == >> TSK_ExplicitInstantiationDeclaration) >> return LangOptions::Default; >> } else if (const VarDecl *Var = dyn_cast<VarDecl>(D)) { >> // ... >> } >> >> // ... >> } >> >> // If this decl is contained in a class, it should have the same visibility >> // as the parent class. >> if (const DeclContext *DC = D->getDeclContext()) >> if (DC->isRecord()) >> return getDeclVisibilityMode(cast<Decl>(DC)); >> >> return getLangOptions().getVisibilityMode(); >> } >> >> >> When a template specialization declaration is overridden with a >> template specialization definition, the template specialization kind >> of inner structs was not updated. Hence, when the function above >> checked the visibility of the inner struct's function, it would look >> in the parent class (== the inner struct) because of the code at the >> end of the function, and then would return LangOptions::Default, >> because the inner struct would still have specialization kind >> TSK_ExplicitInstantiationDeclaration. >> >> The fix is to correctly re-set the specialization kind of inner >> structs on the TSK_ExplicitInstantiationDeclaration -> >> TSK_ExplicitInstantiationDefinition transition on the base class. >> >> Nico >> >> >> ps: I'm not sure if the call to MarkVTableUsed is needed, but it's >> called further up in that file when >> TSK_ExplicitInstantiationDefinition is set too. >> >
clang-visibility.patch
Description: Binary data
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
