// Test that we've scoped the destructor properly for variables declared // in a conditional. // { dg-do run } extern "C" void abort (); class C { bool live; public: C(); C(const C &); ~C (); operator bool() const; }; void f1 () { while (C br = C()) abort (); } void f2 () { for (; C br = C(); ) abort (); } void f3 () { if (C br = C()) abort (); } void f4 () { switch (C br = C()) { default: abort (); case false: break; } } int main() { f1(); f2(); f3(); f4(); return 0; } C::C() { live = true; } C::C(const C &o) { if (!o.live) abort (); live = true; } C::~C() { live = false; } C::operator bool() const { if (!live) abort (); return false; }