public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c++/57728] New: Explicit template instantiation with defaulted method causes missing symbol @ 2013-06-26 14:43 bmerry at gmail dot com 2013-06-26 15:42 ` [Bug c++/57728] " redi at gcc dot gnu.org ` (3 more replies) 0 siblings, 4 replies; 5+ messages in thread From: bmerry at gmail dot com @ 2013-06-26 14:43 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57728 Bug ID: 57728 Summary: Explicit template instantiation with defaulted method causes missing symbol Product: gcc Version: 4.8.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: bmerry at gmail dot com Created attachment 30378 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30378&action=edit Minimal test case I don't claim to fully understand all the intricies of C++11, but the following smells fishy to me. I am using a combination of features: 1. The = default syntax to restore implicit constructors/assignments that were otherwise hidden (e.g. default constructor when there are no user-defined constructors), in a templated class. 2. "extern template" in the header to suppress instantiation of a specific instance, with an explicit instantiation in one translation unit. In some cases (I assume depending on compiler eliding) this causes a link-time error for the defaulted constructor. I have attached a minimal test case. I don't know whether there is supposed to be a symbol or whether the compiler is supposed to inline the default implementation, but currently there is a mismatch. System information: Ubuntu 12.04 with gcc version 4.8.1 (Ubuntu 4.8.1-2ubuntu1~12.04) Output (there's a more detailed log in the attachment with -v -save-temps): g++-4.8 -std=c++11 -c defaulted.cpp g++-4.8 -std=c++11 -c impl.cpp g++-4.8 -std=c++11 -o defaulted defaulted.o impl.o defaulted.o: In function `main': defaulted.cpp:(.text+0x10): undefined reference to `A<int>::A()' collect2: error: ld returned 1 exit status make: *** [defaulted] Error 1 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/57728] Explicit template instantiation with defaulted method causes missing symbol 2013-06-26 14:43 [Bug c++/57728] New: Explicit template instantiation with defaulted method causes missing symbol bmerry at gmail dot com @ 2013-06-26 15:42 ` redi at gcc dot gnu.org 2013-06-26 15:46 ` bmerry at gmail dot com ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: redi at gcc dot gnu.org @ 2013-06-26 15:42 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57728 Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2013-06-26 CC| |jason at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- The explicit instantiation declaration suppresses the definition of A<int>::A() in defaulted.o, but the explicit instantiation definition doesn't cause that symbol to be emitted in impl.o, so when that constructor is not inlined there is no definition. As a single file: template<typename T> struct A { T x; A() = default; A(const A &other) = delete; }; extern template class A<int>; int main() { A<int> a; } This compiles with clang but not G++ because Clang doesn't create a reference to A<int>::A() from main(), so it doesn't matter that the explicit instantiation is not defined in the program. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/57728] Explicit template instantiation with defaulted method causes missing symbol 2013-06-26 14:43 [Bug c++/57728] New: Explicit template instantiation with defaulted method causes missing symbol bmerry at gmail dot com 2013-06-26 15:42 ` [Bug c++/57728] " redi at gcc dot gnu.org @ 2013-06-26 15:46 ` bmerry at gmail dot com 2013-06-26 15:49 ` redi at gcc dot gnu.org 2013-08-04 12:03 ` paolo.carlini at oracle dot com 3 siblings, 0 replies; 5+ messages in thread From: bmerry at gmail dot com @ 2013-06-26 15:46 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57728 --- Comment #2 from Bruce Merry <bmerry at gmail dot com> --- (In reply to Jonathan Wakely from comment #1) > The explicit instantiation declaration suppresses the definition of > A<int>::A() in defaulted.o, but the explicit instantiation definition > doesn't cause that symbol to be emitted in impl.o, so when that constructor > is not inlined there is no definition. That's more or less what I figured was happening. Can you clarify whether you think this a GCC bug or just me misunderstanding the language? Thanks. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/57728] Explicit template instantiation with defaulted method causes missing symbol 2013-06-26 14:43 [Bug c++/57728] New: Explicit template instantiation with defaulted method causes missing symbol bmerry at gmail dot com 2013-06-26 15:42 ` [Bug c++/57728] " redi at gcc dot gnu.org 2013-06-26 15:46 ` bmerry at gmail dot com @ 2013-06-26 15:49 ` redi at gcc dot gnu.org 2013-08-04 12:03 ` paolo.carlini at oracle dot com 3 siblings, 0 replies; 5+ messages in thread From: redi at gcc dot gnu.org @ 2013-06-26 15:49 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57728 --- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- It's a bug ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/57728] Explicit template instantiation with defaulted method causes missing symbol 2013-06-26 14:43 [Bug c++/57728] New: Explicit template instantiation with defaulted method causes missing symbol bmerry at gmail dot com ` (2 preceding siblings ...) 2013-06-26 15:49 ` redi at gcc dot gnu.org @ 2013-08-04 12:03 ` paolo.carlini at oracle dot com 3 siblings, 0 replies; 5+ messages in thread From: paolo.carlini at oracle dot com @ 2013-08-04 12:03 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57728 Paolo Carlini <paolo.carlini at oracle dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |edward.hades at gmail dot com --- Comment #4 from Paolo Carlini <paolo.carlini at oracle dot com> --- *** Bug 58078 has been marked as a duplicate of this bug. *** ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-08-04 12:03 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2013-06-26 14:43 [Bug c++/57728] New: Explicit template instantiation with defaulted method causes missing symbol bmerry at gmail dot com 2013-06-26 15:42 ` [Bug c++/57728] " redi at gcc dot gnu.org 2013-06-26 15:46 ` bmerry at gmail dot com 2013-06-26 15:49 ` redi at gcc dot gnu.org 2013-08-04 12:03 ` paolo.carlini at oracle dot com
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).