// RUN: clang-cc %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s

// PR5484
namespace PR5484 {
struct A { };
extern A a;

void f(const A & = a);

void g() {
  f();
}
}

struct A1 {
 A1();
 ~A1();
};

struct A2 {
 A2();
 ~A2();
};

struct B {
 B(const A1& = A1(), const A2& = A2());
};

// CHECK: define void @_Z2f1v()
void f1() {

 // CHECK: call void @_ZN2A1C1Ev(
 // CHECK: call void @_ZN2A2C1Ev(
 // CHECK: call void @_ZN1BC1ERK2A1RK2A2(
 // CHECK: call void @_ZN2A2D1Ev
 // CHECK: call void @_ZN2A1D1Ev
 B bs[2];
}

struct C {
 B bs[2];
 C();
};

// CHECK: define void @_ZN1CC1Ev(
// CHECK: call void @_ZN2A1C1Ev(
// CHECK: call void @_ZN2A2C1Ev(
// CHECK: call void @_ZN1BC1ERK2A1RK2A2(
// CHECK: call void @_ZN2A2D1Ev
// CHECK: call void @_ZN2A1D1Ev

// CHECK: define void @_ZN1CC2Ev(
// CHECK: call void @_ZN2A1C1Ev(
// CHECK: call void @_ZN2A2C1Ev(
// CHECK: call void @_ZN1BC1ERK2A1RK2A2(
// CHECK: call void @_ZN2A2D1Ev
// CHECK: call void @_ZN2A1D1Ev
C::C() { }

// CHECK: define void @_Z2f3v()
void f3() {
 // CHECK: call void @_ZN2A1C1Ev(
 // CHECK: call void @_ZN2A2C1Ev(
 // CHECK: call void @_ZN1BC1ERK2A1RK2A2(
 // CHECK: call void @_ZN2A2D1Ev
 // CHECK: call void @_ZN2A1D1Ev
 B *bs = new B[2];
 delete bs;
}
