[PATCH] D28590: [Sema] Restrict explicit instantation definition dllexport

2017-01-12 Thread Shoaib Meenai via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL291877: [Sema] Restrict explicit instantation definition 
dllexport (authored by smeenai).

Changed prior to commit:
  https://reviews.llvm.org/D28590?vs=84062&id=84202#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D28590

Files:
  cfe/trunk/lib/Sema/SemaTemplate.cpp
  cfe/trunk/test/CodeGenCXX/dllexport.cpp


Index: cfe/trunk/lib/Sema/SemaTemplate.cpp
===
--- cfe/trunk/lib/Sema/SemaTemplate.cpp
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp
@@ -7789,6 +7789,7 @@
   Specialization->setTemplateKeywordLoc(TemplateLoc);
   Specialization->setBraceRange(SourceRange());
 
+  bool PreviouslyDLLExported = Specialization->hasAttr();
   if (Attr)
 ProcessDeclAttributeList(S, Specialization, Attr);
 
@@ -7851,8 +7852,9 @@
 
 // Fix a TSK_ImplicitInstantiation followed by a
 // TSK_ExplicitInstantiationDefinition
-if (Old_TSK == TSK_ImplicitInstantiation &&
-Specialization->hasAttr() &&
+bool NewlyDLLExported =
+!PreviouslyDLLExported && Specialization->hasAttr();
+if (Old_TSK == TSK_ImplicitInstantiation && NewlyDLLExported &&
 (Context.getTargetInfo().getCXXABI().isMicrosoft() ||
  Context.getTargetInfo().getTriple().isWindowsItaniumEnvironment())) {
   // In the MS ABI, an explicit instantiation definition can add a dll
Index: cfe/trunk/test/CodeGenCXX/dllexport.cpp
===
--- cfe/trunk/test/CodeGenCXX/dllexport.cpp
+++ cfe/trunk/test/CodeGenCXX/dllexport.cpp
@@ -732,13 +732,27 @@
 // M32-DAG: define weak_odr dllexport x86_thiscallcc 
%struct.ExplicitInstantiationDeclExportedDefTemplate* 
@"\01??0?$ExplicitInstantiationDeclExportedDefTemplate@H@@QAE@XZ"
 // G32-DAG: define weak_odr x86_thiscallcc void 
@_ZN44ExplicitInstantiationDeclExportedDefTemplateIiE1fEv
 
-template  struct 
ImplicitInstantiationExplicitInstantiationDefExportedTemplate { void f() {} };
+template  struct 
ImplicitInstantiationExportedExplicitInstantiationDefTemplate { virtual void 
f() {} };
+ImplicitInstantiationExportedExplicitInstantiationDefTemplate 
ImplicitInstantiationExportedExplicitInstantiationDefTemplateInstance;
+template struct __declspec(dllexport) 
ImplicitInstantiationExportedExplicitInstantiationDefTemplate;
+USEMEMFUNC(ImplicitInstantiationExportedExplicitInstantiationDefTemplate, 
f);
+// M32-DAG: define weak_odr dllexport x86_thiscallcc void 
@"\01?f@?$ImplicitInstantiationExportedExplicitInstantiationDefTemplate@H@@UAEXXZ"
+// G32-DAG: define weak_odr x86_thiscallcc void 
@_ZN61ImplicitInstantiationExportedExplicitInstantiationDefTemplateIiE1fEv
+
+template  struct __declspec(dllexport) 
ImplicitInstantiationExplicitInstantiationDefExportedTemplate { virtual void 
f() {} };
 ImplicitInstantiationExplicitInstantiationDefExportedTemplate 
ImplicitInstantiationExplicitInstantiationDefExportedTemplateInstance;
-template class __declspec(dllexport) 
ImplicitInstantiationExplicitInstantiationDefExportedTemplate;
+template struct 
ImplicitInstantiationExplicitInstantiationDefExportedTemplate;
 USEMEMFUNC(ImplicitInstantiationExplicitInstantiationDefExportedTemplate, 
f);
-// M32-DAG: define weak_odr dllexport x86_thiscallcc void 
@"\01?f@?$ImplicitInstantiationExplicitInstantiationDefExportedTemplate@H@@QAEXXZ"
+// M32-DAG: define weak_odr dllexport x86_thiscallcc void 
@"\01?f@?$ImplicitInstantiationExplicitInstantiationDefExportedTemplate@H@@UAEXXZ"
 // G32-DAG: define weak_odr x86_thiscallcc void 
@_ZN61ImplicitInstantiationExplicitInstantiationDefExportedTemplateIiE1fEv
 
+template  struct __declspec(dllexport) 
ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate { virtual 
void f() {} };
+ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate 
ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplateInstance;
+template struct __declspec(dllexport) 
ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate;
+USEMEMFUNC(ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate,
 f);
+// M32-DAG: define weak_odr dllexport x86_thiscallcc void 
@"\01?f@?$ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate@H@@UAEXXZ"
+// G32-DAG: define weak_odr x86_thiscallcc void 
@_ZN69ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplateIiE1fEv
+
 namespace { struct InternalLinkageType {}; }
 struct __declspec(dllexport) PR23308 {
   void f(InternalLinkageType*);


Index: cfe/trunk/lib/Sema/SemaTemplate.cpp
===
--- cfe/trunk/lib/Sema/SemaTemplate.cpp
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp
@@ -7789,6 +7789,7 @@
   Specialization->setTemplateKeywordLoc(TemplateLoc);
   Specialization->setBraceRange(SourceRange());
 
+  bool PreviouslyDLLExported = Specialization->hasAttr();
   if (Attr)
 ProcessDeclAttri

[PATCH] D28590: [Sema] Restrict explicit instantation definition dllexport

2017-01-12 Thread Reid Kleckner via Phabricator via cfe-commits
rnk accepted this revision.
rnk added a comment.
This revision is now accepted and ready to land.

lgtm, thanks for the fix!


https://reviews.llvm.org/D28590



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D28590: [Sema] Restrict explicit instantation definition dllexport

2017-01-11 Thread Shoaib Meenai via Phabricator via cfe-commits
smeenai created this revision.
smeenai added reviewers: hans, rnk.
smeenai added subscribers: cfe-commits, steveire.

In the case where the template class itself is already `dllexport`, the
implicit instantiation will have already emitted all members. When we
check the explicit instantiation definition, the `Specialization` will
have inherited the `dllexport` attribute, so we'll attempt to emit all
members for a second time, which causes an assertion failure. Restrict
the exporting to when the `dllexport` attribute is newly introduced by
the explicit instantiation definition.

Fixes PR31608.


https://reviews.llvm.org/D28590

Files:
  lib/Sema/SemaTemplate.cpp
  test/CodeGenCXX/dllexport.cpp


Index: test/CodeGenCXX/dllexport.cpp
===
--- test/CodeGenCXX/dllexport.cpp
+++ test/CodeGenCXX/dllexport.cpp
@@ -732,13 +732,27 @@
 // M32-DAG: define weak_odr dllexport x86_thiscallcc 
%struct.ExplicitInstantiationDeclExportedDefTemplate* 
@"\01??0?$ExplicitInstantiationDeclExportedDefTemplate@H@@QAE@XZ"
 // G32-DAG: define weak_odr x86_thiscallcc void 
@_ZN44ExplicitInstantiationDeclExportedDefTemplateIiE1fEv
 
-template  struct 
ImplicitInstantiationExplicitInstantiationDefExportedTemplate { void f() {} };
+template  struct 
ImplicitInstantiationExportedExplicitInstantiationDefTemplate { virtual void 
f() {} };
+ImplicitInstantiationExportedExplicitInstantiationDefTemplate 
ImplicitInstantiationExportedExplicitInstantiationDefTemplateInstance;
+template struct __declspec(dllexport) 
ImplicitInstantiationExportedExplicitInstantiationDefTemplate;
+USEMEMFUNC(ImplicitInstantiationExportedExplicitInstantiationDefTemplate, 
f);
+// M32-DAG: define weak_odr dllexport x86_thiscallcc void 
@"\01?f@?$ImplicitInstantiationExportedExplicitInstantiationDefTemplate@H@@UAEXXZ"
+// G32-DAG: define weak_odr x86_thiscallcc void 
@_ZN61ImplicitInstantiationExportedExplicitInstantiationDefTemplateIiE1fEv
+
+template  struct __declspec(dllexport) 
ImplicitInstantiationExplicitInstantiationDefExportedTemplate { virtual void 
f() {} };
 ImplicitInstantiationExplicitInstantiationDefExportedTemplate 
ImplicitInstantiationExplicitInstantiationDefExportedTemplateInstance;
-template class __declspec(dllexport) 
ImplicitInstantiationExplicitInstantiationDefExportedTemplate;
+template struct 
ImplicitInstantiationExplicitInstantiationDefExportedTemplate;
 USEMEMFUNC(ImplicitInstantiationExplicitInstantiationDefExportedTemplate, 
f);
-// M32-DAG: define weak_odr dllexport x86_thiscallcc void 
@"\01?f@?$ImplicitInstantiationExplicitInstantiationDefExportedTemplate@H@@QAEXXZ"
+// M32-DAG: define weak_odr dllexport x86_thiscallcc void 
@"\01?f@?$ImplicitInstantiationExplicitInstantiationDefExportedTemplate@H@@UAEXXZ"
 // G32-DAG: define weak_odr x86_thiscallcc void 
@_ZN61ImplicitInstantiationExplicitInstantiationDefExportedTemplateIiE1fEv
 
+template  struct __declspec(dllexport) 
ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate { virtual 
void f() {} };
+ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate 
ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplateInstance;
+template struct __declspec(dllexport) 
ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate;
+USEMEMFUNC(ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate,
 f);
+// M32-DAG: define weak_odr dllexport x86_thiscallcc void 
@"\01?f@?$ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplate@H@@UAEXXZ"
+// G32-DAG: define weak_odr x86_thiscallcc void 
@_ZN69ImplicitInstantiationExportedExplicitInstantiationDefExportedTemplateIiE1fEv
+
 namespace { struct InternalLinkageType {}; }
 struct __declspec(dllexport) PR23308 {
   void f(InternalLinkageType*);
Index: lib/Sema/SemaTemplate.cpp
===
--- lib/Sema/SemaTemplate.cpp
+++ lib/Sema/SemaTemplate.cpp
@@ -,6 +,7 @@
   Specialization->setTemplateKeywordLoc(TemplateLoc);
   Specialization->setBraceRange(SourceRange());
 
+  bool PreviouslyDLLExported = Specialization->hasAttr();
   if (Attr)
 ProcessDeclAttributeList(S, Specialization, Attr);
 
@@ -7839,8 +7840,9 @@
 
 // Fix a TSK_ImplicitInstantiation followed by a
 // TSK_ExplicitInstantiationDefinition
-if (Old_TSK == TSK_ImplicitInstantiation &&
-Specialization->hasAttr() &&
+bool NewlyDLLExported =
+!PreviouslyDLLExported && Specialization->hasAttr();
+if (Old_TSK == TSK_ImplicitInstantiation && NewlyDLLExported &&
 (Context.getTargetInfo().getCXXABI().isMicrosoft() ||
  Context.getTargetInfo().getTriple().isWindowsItaniumEnvironment())) {
   // In the MS ABI, an explicit instantiation definition can add a dll


Index: test/CodeGenCXX/dllexport.cpp
===
--- test/CodeGenCXX/dllexport.cpp
+++ test/CodeGenCXX/dllexport.cpp
@@ -732,