2

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 へのコード変更を行いましたが、これを正確に修正したリビジョンを特定できませんでした。誰かが正確なリビジョン番号を指摘できますか?

4

0 に答える 0