| // Check that destructors of memcpy-able struct members are called properly |
| // during stack unwinding after an exception. |
| // Check that destructor's argument (address of member to be destroyed) is |
| // obtained by taking offset from struct, not by bitcasting pointers. |
| // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -O0 -fno-elide-constructors -emit-llvm %s -o - | FileCheck %s |
| ImplicitCopy() { id = 10; } |
| ~ImplicitCopy() { id = 20; } |
| ThrowCopy(const ThrowCopy &x) { |
| ~ThrowCopy() { id = 35; } |
| Container() { id = 1000; } |
| ~Container() { id = 2000; } |
| // CHECK: %{{.+}} = getelementptr inbounds %struct.Container, %struct.Container* %{{.+}}, i32 0, i32 1 |
| // CHECK-NOT: %{{.+}} = bitcast %struct.Container* %{{.+}} to %struct.ImplicitCopy* |