[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 Kai Tietz changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED CC||ktietz at gcc dot gnu.org Resolution||DUPLICATE --- Comment #13 from Kai Tietz 2012-02-02 21:00:41 UTC --- Yes, this is a dup of bug #40068. *** This bug has been marked as a duplicate of bug 40068 ***
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #12 from Martin Lederhilger 2011-08-18 12:27:50 UTC --- For the case with using "extern template...": If you look at bug #40068, you can see that there was a similar problem (not exported typeinfo to DLL) once - for normal classes. There were two solutions, one in comment 1 (has not been applied to GCC) and another in comment 4 (has been applied to GCC). If I apply the patch of comment 1, then my problems with the not exported typeinfo disappears;) It would be nice, if someone with more knowledge than me can have a look at this (and how it could be applied to GCC). Thanks
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #11 from Martin Lederhilger 2011-08-16 14:47:08 UTC --- Created attachment 25024 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=25024 Export table of the dll. This is a part of i686-mingw32-objdump's output. Contains the export table of the DLL for the following combinations: with/without extern template and with/without INTERFACE on the class template definition
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #10 from Martin Lederhilger 2011-08-16 14:18:38 UTC --- Created attachment 25023 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=25023 Output of i686-mingw32-nm for dll.dll
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #9 from Martin Lederhilger 2011-08-16 14:17:32 UTC --- Results for: template class INTERFACE A : public Base ... Case one without "extern template": warning is still there but links fine. Case two with "extern template": still undefined reference to `typeinfo for A' I should note that I cannot use INTERFACE on the class template definition, because I want to explicitly instantiate the template in multiple DLLs and then I would need dllimport and dllexport at the same time on the class template definition. For example instantiate A in A.dll, and A in B.dll: When I want to use A and A in B.dll then I would need dllimport and dllexport at the same time. Thats why I want to apply INTERFACE to "extern template INTERFACE...". Output from nm for case two (with "extern template...") generated by i686-mingw32-nm dll.dll | i686-mingw32-c++filt > nm.txt
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #8 from Jonathan Wakely 2011-08-16 14:00:12 UTC --- (In reply to comment #0) > - When using "extern template..." there is something wrong with exporting > the > symbols for the typeinfo (i686-mingw32-nm shows that they are in the dll, but > it seems that they are not exported). what exactly does nm show? what happens if you put INTERFACE on the class template definition instead of the instantiation: template class INTERFACE A : public Base ...
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 Martin Lederhilger changed: What|Removed |Added Version|4.5.2 |4.6.1 --- Comment #7 from Martin Lederhilger 2011-08-16 13:17:44 UTC --- I have also tried it with a newer version of gcc, but I receive the same results. Information about the new gcc version is listed below: Using built-in specs. COLLECT_GCC=i686-mingw32-g++ COLLECT_LTO_WRAPPER=/home/martin/mingw-4.6.1/install-i686-pc-linux-gnu/libexec/gcc/i686-mingw32/4.6.1/lto-wrapper Target: i686-mingw32 Configured with: ../configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=i686-mingw32 --prefix=/home/martin/mingw-4.6.1/install-i686-pc-linux-gnu --with-gmp=/home/martin/mingw-4.6.1/install-i686-pc-linux-gnu --with-mpfr=/home/martin/mingw-4.6.1/install-i686-pc-linux-gnu --with-mpc=/home/martin/mingw-4.6.1/install-i686-pc-linux-gnu --with-ppl=/home/martin/mingw-4.6.1/install-i686-pc-linux-gnu --with-cloog=/home/martin/mingw-4.6.1/install-i686-pc-linux-gnu --enable-cloog-backend=isl --enable-threads=win32 --enable-tls --enable-languages=c,c++ --with-sysroot=/home/martin/mingw-4.6.1/install-i686-pc-linux-gnu/i686-mingw32 --disable-win32-registry --enable-sjlj-exceptions --disable-libstdcxx-pch --with-host-libstdcxx='-lstdc++ -lsupc++' Thread model: win32 gcc version 4.6.1 (GCC) I think I should use extern template class INTERFACE A; in A.h, and then template class A; to explicitly instantiate it in A.cpp. Is my use of "extern template ..." right - in the meaning that I should specify the attributes there? Does the warning "type attributes ignored after type is already defined" just wants to protect me of having instances of the same type with different attributes in one translation unit (if that is even possible)? In general (not 100 % related to my problem) "extern template ..." would also help me to have the same attributes on the type, if I used it in other translation units as well - I could think that it makes problems (which version should the linker use?) while linking if there are template instantiations with different attributes (I got this enlightenment from bug #38175) - have I understood this correctly? Then since I should probably use "extern template ...", what should I do about the undefined reference to the typeinfo? Could this be related to bug #21243? Thank you, Martin
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #6 from Martin Lederhilger 2011-08-11 13:40:40 UTC --- Created attachment 24982 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24982 Makefile to build the DLL and the application.
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #5 from Martin Lederhilger 2011-08-11 13:40:07 UTC --- Created attachment 24981 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24981 main.cpp - the application
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #4 from Martin Lederhilger 2011-08-11 13:39:31 UTC --- Created attachment 24980 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24980 Interface.h - defines macros for the dllexport/import attributes
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #3 from Martin Lederhilger 2011-08-11 13:38:47 UTC --- Created attachment 24979 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24979 A_imp.h - Implementation of the template. This file is included in A.cpp
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #2 from Martin Lederhilger 2011-08-11 13:38:02 UTC --- Created attachment 24978 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24978 A.h - Header which is used by the DLL and the application
[Bug c++/50044] Attributes for explicit template instantiation are ignored after an implicit template instantiation occurred.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044 --- Comment #1 from Martin Lederhilger 2011-08-11 13:37:15 UTC --- Created attachment 24977 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24977 A.cpp - goes into the DLL