[PATCH] D145271: [MSVC compatibility][DLLEXPORT/DLLIMPORT] Allow dllexport/dllimport for local classes

Hans Wennborg via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 8 02:46:05 PST 2023


hans added a reviewer: mstorsjo.
hans added a comment.

+mstorsjo for thoughts about Windows code, even if this might not apply to mingw.

In D145271#4172636 <https://reviews.llvm.org/D145271#4172636>, @wolfgangp wrote:

> A customer complained about the following code (I'm obscuring the class names) compiling with MSVC but
> rejected by clang:
>
>   template <class T>
>   class __declspec(dllimport) A
>   {
>   };
>   
>   void func()
>   {
>     // local class with internal linkage
>     class B: public A<B>
>     {
>     };
>   }

Oh I see, it's not intentionally trying to dllimport/export a local class, the problem is really dllimport/exporting a class template instantiated with a local class as template argument.

The problem can be hit without inheritance too:

  template <typename> struct __declspec(dllimport) Base { };
  
  void f() {
    struct Local { };
    Base<Local> x;
  }
  
  error: 'Base<Local>' must have external linkage when declared 'dllimport'

It still seems like the export/import there is an accident since `Base<f::Local>` can't really be referenced from outside the file anyway.

Perhaps rather than giving `Base<f::Local>` external linkage to allow it to be imported/exported, the better fix would be to drop its dllimport/export attribute when instantiated with a local type?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145271/new/

https://reviews.llvm.org/D145271



More information about the cfe-commits mailing list