[cfe-commits] patch for llvm.org/pr8207

Nico Weber thakis at chromium.org
Sun Sep 26 15:14:20 PDT 2010


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 <thakis at chromium.org> 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.
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: clang-visibility.patch
Type: application/octet-stream
Size: 3713 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20100926/445729d2/attachment.obj>


More information about the cfe-commits mailing list