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

Reid Kleckner via cfe-commits cfe-commits at lists.llvm.org
Fri May 13 16:01:59 PDT 2016


rnk added inline comments.

================
Comment at: test/SemaCXX/dllimport.cpp:179
@@ -140,1 +178,3 @@
+template <typename T>
+int ExternVarTmplDeclInit = 1;
 
----------------
avt77 wrote:
> 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?
Yep, sounds good for now.

================
Comment at: test/SemaCXX/dllimport.cpp:1137
@@ -1017,1 +1136,3 @@
+template <typename T>
+void ImportClassTmplMembers<T>::normalDef() {}
 #ifdef GNU
----------------
avt77 wrote:
> 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?
Seems like a weird special case. I wouldn't worry about addressing it right now.


http://reviews.llvm.org/D18953





More information about the cfe-commits mailing list