From: Hans Wennborg Date: Wed, 14 Feb 2018 15:19:46 +0000 (+0000) Subject: Revert r324991 "Fix for PR32992. Static const classes not exported." X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1532324f1979660b1fc429eff544e1a9c1b79332;p=clang Revert r324991 "Fix for PR32992. Static const classes not exported." This broke the Chromium build on Windows; see https://crbug.com/812231 > Fix for PR32992. Static const classes not exported. > > Patch by zahiraam! > > Differential Revision: https://reviews.llvm.org/D42968 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@325133 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index d3f3a1a938..45adbe3a16 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -5476,7 +5476,7 @@ static void CheckAbstractClassUsage(AbstractUsageInfo &Info, } } -static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class) { +static void ReferenceDllExportedMethods(Sema &S, CXXRecordDecl *Class) { Attr *ClassAttr = getDLLAttr(Class); if (!ClassAttr) return; @@ -5491,16 +5491,6 @@ static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class) { 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(Member); - if (VD && Member->getAttr() && - VD->getStorageClass() == SC_Static && - TSK == TSK_ImplicitInstantiation) - S.PendingLocalImplicitInstantiations.push_back( - std::make_pair(VD, VD->getLocation())); - auto *MD = dyn_cast(Member); if (!MD) continue; @@ -10912,12 +10902,12 @@ void Sema::ActOnFinishCXXNonNestedClass(Decl *D) { void Sema::referenceDLLExportedClassMethods() { if (!DelayedDllExportClasses.empty()) { - // Calling ReferenceDllExportedMembers might cause the current function to + // Calling ReferenceDllExportedMethods might cause the current function to // be called again, so use a local copy of DelayedDllExportClasses. SmallVector WorkList; std::swap(DelayedDllExportClasses, WorkList); for (CXXRecordDecl *Class : WorkList) - ReferenceDllExportedMembers(*this, Class); + ReferenceDllExportedMethods(*this, Class); } } diff --git a/test/CodeGenCXX/dllexport.cpp b/test/CodeGenCXX/dllexport.cpp index 97ce5b54c4..a446147b6c 100644 --- a/test/CodeGenCXX/dllexport.cpp +++ b/test/CodeGenCXX/dllexport.cpp @@ -28,7 +28,6 @@ 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@H@PR32992@@0HA" = comdat any //===----------------------------------------------------------------------===// @@ -978,21 +977,3 @@ class __declspec(dllexport) ACE_Service_Object : public ACE_Shared_Object {}; // 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 Base { - virtual void myfunc() {} - static int smember; -}; -// MS-DAG: @"\01?smember@?$Base@H@PR32992@@0HA" = weak_odr dllexport global i32 77, comdat, align 4 -template int Base::smember = 77; -template -class __declspec(dllexport) Derived2 : Base { - void myfunc() {} -}; -class Derived : public Derived2 { - void myfunc() {} -}; -} // namespace PR32992