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 )

Reply via email to