https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109380
Bug ID: 109380
Summary: inline member function symbol not exported with
explicit template instantiation declaration on MinGW
Product: gcc
Version: 12.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: vittorio.romeo at outlook dot com
Target Milestone: ---
Created attachment 54801
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54801&action=edit
Full example (lib.h, lib.cpp, main.cpp, build.sh)
Given the following code:
// ----------------------------
// lib.h
template <typename>
struct S
{
void f();
void g() { }
};
template <typename T> void S<T>::f() { }
extern template struct __declspec(dllexport) S<int>;
// ----------------------------
// lib.cpp
#include "lib.h"
template struct S<int>;
// ----------------------------
// main.cpp
#include "lib.h"
int main() { S<int>{}.g(); }
When building with:
g++ -c -o main.o main.cpp && \
g++ -c -o lib.o lib.cpp && \
g++ -shared -o lib.dll lib.o -Wl,--out-implib,liblib.dll.a && \
g++ -o main.exe main.o -L. -llib
This linker error is erroneously produced:
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:
main.o:main.cpp:(.text+0x15): undefined reference to `S<int>::g()'
collect2.exe: error: ld returned 1 exit status
This is likely the same as bug #89088:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89088
And probably related to this Clang PR and review:
https://reviews.llvm.org/D61118
I bumped into this issue today, using GCC version 12.2.0, on MinGW/MSYS2.
The last bug report is UNCONFIRMED since 2019.