initlist の有効期間が延長されるテスト ケースがあります。
#include <initializer_list>
extern "C" void abort();
bool ok;
bool do_throw;
struct A {
A(int) {
if (do_throw) throw 42;
}
~A() {
if (!ok) abort();
}
};
typedef std::initializer_list<A> AL;
typedef std::initializer_list<AL> AL2;
typedef std::initializer_list<AL2> AL3;
struct B {
AL al;
const AL& alr;
};
int main(int argc, const char** argv) {
do_throw = (argc > 1); // always false, but optimizer can't tell
AL ar[] = {{1,2},{3,4}};
B b = {{5,6},{7,8}};
AL3 al3 = {{{1},{2},{3}}};
ok = true;
}
ここで、オブジェクト b の初期化は、そのサブオブジェクト al (初期化リスト) の有効期間が延長されるため、成功するはずです。gcc でコードをコンパイルすると成功しますが、clang 3.3 でエラーがスローされます。Clang 3.4 は成功します。clang 3.3 から 3.4 へのコード変更を行いましたが、これを正確に修正したリビジョンを特定できませんでした。誰かが正確なリビジョン番号を指摘できますか?