「これGCCのバグじゃねーの?」→ 私がC++を正しく理解してないだけだった

くっそ通常運転すぎる... なんという日常の一コマ.
下記のソースで C::C(const X &x) [X=C] が呼ばれないのに C::~C() は呼ばれる! Copy elisionのバグじゃね? とか騒いでいたのだが,問題の根源は「C::C(const X &x) よりデフォルトcopy ctorの方が特定的だからデフォルトcopy ctorが呼ばれる」ということかな.確認してないけどそうだろう.デフォルトcopy ctorは -O0 であっても名前の付いた関数としてアセンブリに出ることは無いのね.適当なメンバ変数を追加して -fdump-tree-all で出したGIMPLEにはややそれらしいものが出るが...
問題を誤認していたせいでかなり時間を無駄にした.悔しい... (まぁGCCとClang/LLVMで同じ振る舞いをしてた時点でバグってことはねーだろという感じではあった)
まぁいいや,またちょっとx86アセンブリGCCの勉強を深める機会になったよ.

struct C {
    template <typename X>
    C(const X &x) { }

    // C(const C &c) { }

    ~C() { }
};

struct D {
    D(const D &d) { }

    ~D() { }
};

void foo(const C &c) {
    (C(c));
}

void bar(const D &d) {
    (D(d));
}