hans added inline comments.

================
Comment at: clang/lib/Sema/SemaDeclCXX.cpp:5719
+          TSK != TSK_ExplicitInstantiationDeclaration &&
+          TSK != TSK_ExplicitInstantiationDefinition) {
+        if (ClassExported) {
----------------
takuto.ikuta wrote:
> takuto.ikuta wrote:
> > takuto.ikuta wrote:
> > > hans wrote:
> > > > takuto.ikuta wrote:
> > > > > hans wrote:
> > > > > > I still don't understand why we need these checks for template 
> > > > > > instantiations. Why does it matter whether the functions get 
> > > > > > inlined or not?
> > > > > When function of dllimported class is not inlined, such funtion needs 
> > > > > to be dllexported from implementation library.
> > > > > 
> > > > > c.h
> > > > > ```
> > > > > template<typename T>
> > > > > class EXPORT C {
> > > > >  public:
> > > > >   void f() {}
> > > > > };
> > > > > ```
> > > > > 
> > > > > cuser.cc
> > > > > ```
> > > > > #include "c.h"
> > > > > 
> > > > > void cuser() {
> > > > >   C<int> c;
> > > > >   c.f();  // This function may not be inlined when EXPORT is 
> > > > > __declspec(dllimport), so link may fail.
> > > > > }
> > > > > ```
> > > > > 
> > > > > When cuser.cc and c.h are built to different library, cuser.cc needs 
> > > > > to be able to see dllexported C::f() when C::f() is not inlined.
> > > > > This is my understanding.
> > > > Your example doesn't use explicit instantiation definition or 
> > > > declaration, so doesn't apply here I think.
> > > > 
> > > > As long as the dllexport and dllimport attributes matches it's fine. It 
> > > > doesn't matter whether the function gets inlined or not, the only thing 
> > > > that matters is that if it's marked dllimport on the "consumer side", 
> > > > it must be dllexport when building the dll.
> > > Hmm, I changed the linkage for functions having 
> > > DLLExport/ImportStaticLocal Attr.
> > > 
> > I changed linkage in ASTContext so that inline function is emitted when it 
> > is necessary when we use fno-dllexport-inlines.
> I revived explicit template instantiation check. 
> Found that this is necessary.
> 
> For explicit template instantiation, inheriting dll attribute from function 
> for local static var is run before inheriting dll attribute from class for 
> member functions. So I cannot detect local static var of inline function 
> after class level dll attribute processing for explicit template 
> instantiation.
> 
Oh I see, it's a static local problem..
Can you provide a concrete example that does not work without your check?
Maybe this is the right thing to do, but I would like to understand exactly 
what the problem is.


https://reviews.llvm.org/D51340



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

Reply via email to