https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98485
Bug ID: 98485 Summary: Symbols for identical constrained specializations have different linkage Product: gcc Version: 10.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: admin at maniacsvault dot net Target Milestone: --- Created attachment 49861 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=49861&action=edit Minimal example code When using multiple constrained specializations, the symbols generated have different linkage based on the order the specializations are defined in the file. The first specialization will generate weak symbols as expected, the second generates local symbols. See attached example. S1 is a structure containing a static member function. S2 and S3 differ in some way that's detectable through concepts. main.cpp can only see these definitions so all it knows is that S1<T>::f() is forward declared. a.cpp and b.cpp include s1-defs.h which contains two basically identical specializations of S1. The first is applied for S2, the second for S3. a.cpp instantiates S1<S2>. b.cpp instantiates S1<S3>. These do not need to be separate files, this was just done to make it easier to diff the two outputs. What you will notice is that a.o contains an externally visible S1<S2>::f1 symbol. b.o contains a local S1<S3>::f1 symbol. Thus the program can't link since main can't reference S1<S3>::f1. Despite there being basically no difference in the two specializations the linkage is unexpectedly different. If the order of the two specializations in s1-defs.h is reversed then S1<S2>::f1 will become problematic. In s1-defs.h there's a USE_SINGLE define which when toggled uses if constexpr instead of two specializations. This effectively works around the issue and the program links.