brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.0 KiB · 2a21605 Raw
47 lines · cpp
1// Check that destructors of memcpy-able struct members are called properly2// during stack unwinding after an exception.3//4// Check that destructor's argument (address of member to be destroyed) is5// obtained by taking offset from struct, not by bitcasting pointers.6//7// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -O0 -fno-elide-constructors -emit-llvm %s -o - | FileCheck %s8 9struct ImplicitCopy {10  int id;11  ImplicitCopy() { id = 10; }12  ~ImplicitCopy() { id = 20; }13};14 15struct ThrowCopy {16  int id;17  ThrowCopy() { id = 15; }18  ThrowCopy(const ThrowCopy &x) {19    id = 25;20    throw 1;21  }22  ~ThrowCopy() { id = 35; }23};24 25struct Container {26  int id;27  ImplicitCopy o1;28  ThrowCopy o2;29 30  Container() { id = 1000; }31  ~Container() { id = 2000; }32};33 34int main() {35  try {36    Container c1;37    // CHECK-LABEL: main38    // CHECK: %{{.+}} = getelementptr inbounds nuw %struct.Container, ptr %{{.+}}, i32 0, i32 139    Container c2(c1);40 41    return 2;42  } catch (...) {43    return 1;44  }45  return 0;46}47