https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113541
Bug ID: 113541 Summary: Rejects __attribute__((section)) on explicit instantiation declaration of ctor/dtor Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: arthur.j.odwyer at gmail dot com Target Milestone: --- // https://godbolt.org/z/34Wdj1ox8 template<class T> struct S { S(int) {} void operator=(int) {} void f(int) {} ~S() {} }; template __attribute__((section("TEST"))) S<int>::S(int); // error template __attribute__((section("TEST"))) void S<int>::f(int); // OK template __attribute__((section("TEST"))) void S<int>::operator=(int); // OK template __attribute__((section("TEST"))) S<int>::~S(); // error === <source>: In instantiation of 'S<T>::S(int) [with T = int]': <source>:9:56: required from here <source>:3:5: error: section of alias 'S<T>::S(int) [with T = int]' must match section of its target 3 | S(int) {} | ^ The problem seems to be only with the constructor and destructor, i.e., the two kinds of functions that codegen two object-code definitions (base object xtor and complete object xtor) for a single C++ declaration. Somehow, giving `S` a virtual base class (`struct S : virtual B`) fixes the problem. Then both codegenned xtors correctly wind up in the "TEST" section. GCC 4.9.4 is happy with the code as written. The bug started happening with GCC 5. (This was noted on Slack in June 2019, but never reported on Bugzilla AFAICT until now: https://cpplang.slack.com/archives/C5GN4SP41/p1560800562026000 )