[PATCH] D18953: [ms][dll] #26935 Defining a dllimport function should cause it to be exported

Andrew V. Tischenko via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 28 04:27:18 PDT 2016


avt77 added inline comments.

================
Comment at: test/SemaCXX/dllimport.cpp:179
@@ -140,1 +178,3 @@
+template <typename T>
+int ExternVarTmplDeclInit = 1;
 
----------------
majnemer wrote:
> avt77 wrote:
> > rnk wrote:
> > > Can you check with MSVC 2015 update 2 actually does with definitions of dllimport variable templates? I bet it doesn't export them.
> > They don't support variable templates at all:
> > 
> > error C2399: variable templates are not supported in this release
> Your compiler is too old, they are definitely supported.
> 
> > Previously a template declaration was only allowed to be a function, class, or alias. Now, in the MSVC compiler it can be a variable as well.
> 
> https://blogs.msdn.microsoft.com/vcblog/2016/02/11/compiler-improvements-in-vs-2015-update-2/
OK, I updated several additional components and now CL supports variable templates. I checked the issue again and got the following:

C:\_bugs>cl -c  t1.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23918 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

t1.cpp
t1.cpp(8): warning C4273: 'ExternVarTmplDeclInit': inconsistent dll linkage
t1.cpp(2): note: see previous definition of 'ExternVarTmplDeclInit'

C:\_bugs>dumpbin /directives t1.obj
Microsoft (R) COFF/PE Dumper Version 14.00.23918.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file t1.obj

File Type: COFF OBJECT

   Linker Directives
   -----------------
   /DEFAULTLIB:LIBCMT
   /DEFAULTLIB:OLDNAMES
   /EXPORT:??$ExternVarTmplDeclInit at H@@3HA,DATA//

As you see they produce warning and change the export attribute. I suppose Clang should do the same, right?

================
Comment at: test/SemaCXX/dllimport.cpp:1137
@@ -1017,1 +1136,3 @@
+template <typename T>
+void ImportClassTmplMembers<T>::normalDef() {}
 #ifdef GNU
----------------
avt77 wrote:
> rnk wrote:
> > I'm pretty sure MSVC considers all free function templates to be 'inline', i.e. they put them in comdats. I doubt MSVC exports these. Can you verify what it does?
> They prohibit such a definition in the latest MSVC: 
> 
> error C2491: 'ImportClassTmplMembers<T>::normalDef': definition of dllimport function not allowed
> 
> The same error I see for other definitions as well
With the latest compiler they disallow the definition of dllimport functions as well. I suppose Clang should do the same, right?


http://reviews.llvm.org/D18953





More information about the cfe-commits mailing list