r324991 - Fix for PR32992. Static const classes not exported.

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 19 02:10:37 PST 2018


Reduced repro:

$ clang -cc1 -triple i386-pc-windows-msvc19.11.0 -emit-pch
-fms-extensions -fms-compatibility -fms-compatibility-version=19.11
-std=c++14 -fdelayed-template-parsing -x c++-header a.ii -o /dev/null

a.ii:

namespace a {
enum b { c };
}
template <typename> class d { static constexpr a::b e = a::c; };
namespace f {
template <typename g = int> class h : d<g> {};
}
using f::h;
class __declspec(dllexport) i : h<> {};

On Wed, Feb 14, 2018 at 4:22 PM, Hans Wennborg <hans at chromium.org> wrote:
> I ended up having to revert this in r325133 as it broke the Chromium
> build. Please see
> https://bugs.chromium.org/p/chromium/issues/detail?id=812231#c1 for a
> reproducer.
>
> On Tue, Feb 13, 2018 at 10:19 AM, Hans Wennborg via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>> Author: hans
>> Date: Tue Feb 13 01:19:43 2018
>> New Revision: 324991
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=324991&view=rev
>> Log:
>> Fix for PR32992. Static const classes not exported.
>>
>> Patch by zahiraam!
>>
>> Differential Revision: https://reviews.llvm.org/D42968
>>
>> Modified:
>>     cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>>     cfe/trunk/test/CodeGenCXX/dllexport.cpp
>>
>> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=324991&r1=324990&r2=324991&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Tue Feb 13 01:19:43 2018
>> @@ -5476,7 +5476,7 @@ static void CheckAbstractClassUsage(Abst
>>    }
>>  }
>>
>> -static void ReferenceDllExportedMethods(Sema &S, CXXRecordDecl *Class) {
>> +static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class) {
>>    Attr *ClassAttr = getDLLAttr(Class);
>>    if (!ClassAttr)
>>      return;
>> @@ -5491,6 +5491,16 @@ static void ReferenceDllExportedMethods(
>>      return;
>>
>>    for (Decl *Member : Class->decls()) {
>> +    // Defined static variables that are members of an exported base
>> +    // class must be marked export too. Push them to implicit instantiation
>> +    // queue.
>> +    auto *VD = dyn_cast<VarDecl>(Member);
>> +    if (VD && Member->getAttr<DLLExportAttr>() &&
>> +        VD->getStorageClass() == SC_Static &&
>> +        TSK == TSK_ImplicitInstantiation)
>> +      S.PendingLocalImplicitInstantiations.push_back(
>> +          std::make_pair(VD, VD->getLocation()));
>> +
>>      auto *MD = dyn_cast<CXXMethodDecl>(Member);
>>      if (!MD)
>>        continue;
>> @@ -10902,12 +10912,12 @@ void Sema::ActOnFinishCXXNonNestedClass(
>>
>>  void Sema::referenceDLLExportedClassMethods() {
>>    if (!DelayedDllExportClasses.empty()) {
>> -    // Calling ReferenceDllExportedMethods might cause the current function to
>> +    // Calling ReferenceDllExportedMembers might cause the current function to
>>      // be called again, so use a local copy of DelayedDllExportClasses.
>>      SmallVector<CXXRecordDecl *, 4> WorkList;
>>      std::swap(DelayedDllExportClasses, WorkList);
>>      for (CXXRecordDecl *Class : WorkList)
>> -      ReferenceDllExportedMethods(*this, Class);
>> +      ReferenceDllExportedMembers(*this, Class);
>>    }
>>  }
>>
>>
>> Modified: cfe/trunk/test/CodeGenCXX/dllexport.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllexport.cpp?rev=324991&r1=324990&r2=324991&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/dllexport.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/dllexport.cpp Tue Feb 13 01:19:43 2018
>> @@ -28,6 +28,7 @@ struct External { int v; };
>>
>>  // The vftable for struct W is comdat largest because we have RTTI.
>>  // M32-DAG: $"\01??_7W@@6B@" = comdat largest
>> +// M32-DAG: $"\01?smember@?$Base at H@PR32992@@0HA" = comdat any
>>
>>
>>  //===----------------------------------------------------------------------===//
>> @@ -977,3 +978,21 @@ class __declspec(dllexport) ACE_Service_
>>  // MSVC2015-DAG: define weak_odr dllexport {{.+}}ACE_Service_Object@@Q{{.+}}@$$Q
>>  // The declarations should not be exported.
>>  // MSVC2013-NOT: define weak_odr dllexport {{.+}}ACE_Service_Object@@Q{{.+}}@$$Q
>> +
>> +namespace PR32992 {
>> +// Static data members of a instantiated base class should be exported.
>> +template <class T>
>> +class Base {
>> +  virtual void myfunc() {}
>> +  static int smember;
>> +};
>> +// MS-DAG:  @"\01?smember@?$Base at H@PR32992@@0HA" = weak_odr dllexport global i32 77, comdat, align 4
>> +template <class T> int Base<T>::smember = 77;
>> +template <class T>
>> +class __declspec(dllexport) Derived2 : Base<T> {
>> +  void myfunc() {}
>> +};
>> +class Derived : public Derived2<int> {
>> +  void myfunc() {}
>> +};
>> +}  // namespace PR32992
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list