https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52477
Jason Merrill <jason at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |NEW Last reconfirmed| |2017-03-16 CC| |jason at gcc dot gnu.org Resolution|INVALID |--- Ever confirmed|0 |1 --- Comment #6 from Jason Merrill <jason at gcc dot gnu.org> --- I don't think this is undefined; it seems natural for these functions to be ordered with a translation unit along with dynamic initialization of non-local variables. So for --- extern "C" int printf (const char *, ...); struct A { A() { printf ("A\n"); } } a; static void B() __attribute__((constructor)); static void B() { printf ("B\n"); } struct C { C() { printf ("C\n"); } } c; int main() {} --- I would expect A B C, and gcc currently outputs B A C. Instead of emitting constructor functions directly into .init_array as we do now, we should remember them and call them from __static_initialization_and_destruction_0. Note that 4.6 gave the differently wrong A C B, due to running .init_array in the opposite order, so this isn't really a regression.