//------------------------------------------------------------------------------
// CLING - the C++ LLVM-based InterpreterG :)
//
// This file is dual-licensed: you can choose to license it under the University
// of Illinois Open Source License or the GNU Lesser General Public License. See
// LICENSE.TXT for details.
//------------------------------------------------------------------------------

// RUN: cat %s | %cling -Xclang -verify 2>&1 | FileCheck %s
// Test valueDestruction

.rawInput

extern "C" int printf(const char*,...);

class A {
  int m_A[2] = 0;
public:
  A() {}
  ~A() { printf("A::~A()\n"); }
};

class B : public A {
  int m_B[2];
public:
};

extern "C" {
  struct C {
    int m_C[4];
  };

  typedef struct {
    int C0, c1;
  } C2;
}

class D {
  int m_D[2];
public:
};

int gTest = 0;

class E {
  char mem = 0;
public:
  ~E() { gTest = 101; }
};

.rawInput

A()
//      CHECK: (A) @0x{{[0-9a-f]+}}
// CHECK-NEXT: A::~A()

B()
// CHECK-NEXT: (B) @0x{{[0-9a-f]+}}
// CHECK-NEXT: A::~A()

C()
// CHECK-NEXT: (C) @0x{{[0-9a-f]+}}

C2()
// CHECK-NEXT: (C2) @0x{{[0-9a-f]+}}

C2 c = {1, 2}
// CHECK-NEXT: (C2 &) @0x{{[0-9a-f]+}}

D()
// CHECK-NEXT: (D) @0x{{[0-9a-f]+}}

gTest
// CHECK-NEXT: 0

E()
// CHECK-NEXT: (E) @0x{{[0-9a-f]+}}

gTest
// CHECK-NEXT: 101

// Don't call destructor on printed lambda
[] {}
// CHECK-NEXT: () @0x{{[0-9a-f]+}}

// expected-no-diagnostics
.q