// RUN: clang-cc -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s struct A { A(); ~A(); void f(); }; void f1() { // CHECK: call void @_ZN1AC1Ev // CHECK: call void @_ZN1AD1Ev (void)A(); // CHECK: call void @_ZN1AC1Ev // CHECK: call void @_ZN1AD1Ev A().f(); } // Function calls struct B { B(); ~B(); }; B g(); void f2() { // CHECK-NOT: call void @_ZN1BC1Ev // CHECK: call void @_ZN1BD1Ev (void)g(); } // Member function calls struct C { C(); ~C(); C f(); }; void f3() { // CHECK: call void @_ZN1CC1Ev // CHECK: call void @_ZN1CD1Ev // CHECK: call void @_ZN1CD1Ev C().f(); } // Function call operator struct D { D(); ~D(); D operator()(); }; void f4() { // CHECK: call void @_ZN1DC1Ev // CHECK: call void @_ZN1DD1Ev // CHECK: call void @_ZN1DD1Ev D()(); } // Overloaded operators struct E { E(); ~E(); E operator+(const E&); E operator!(); }; void f5() { // CHECK: call void @_ZN1EC1Ev // CHECK: call void @_ZN1EC1Ev // CHECK: call void @_ZN1ED1Ev // CHECK: call void @_ZN1ED1Ev // CHECK: call void @_ZN1ED1Ev E() + E(); // CHECK: call void @_ZN1EC1Ev // CHECK: call void @_ZN1ED1Ev // CHECK: call void @_ZN1ED1Ev !E(); } struct F { F(); ~F(); F& f(); }; void f6() { // CHECK: call void @_ZN1FC1Ev // CHECK: call void @_ZN1FD1Ev F().f(); } struct G { G(); G(A); ~G(); operator A(); }; void a(const A&); void f7() { // CHECK: call void @_ZN1AC1Ev // CHECK: call void @_Z1aRK1A // CHECK: call void @_ZN1AD1Ev a(A()); // CHECK: call void @_ZN1GC1Ev // CHECK: call void @_ZN1Gcv1AEv // CHECK: call void @_Z1aRK1A // CHECK: call void @_ZN1AD1Ev // CHECK: call void @_ZN1GD1Ev a(G()); } namespace PR5077 { struct A { A(); ~A(); int f(); }; void f(); int g(const A&); struct B { int a1; int a2; B(); ~B(); }; B::B() // CHECK: call void @_ZN6PR50771AC1Ev // CHECK: call i32 @_ZN6PR50771A1fEv // CHECK: call void @_ZN6PR50771AD1Ev : a1(A().f()) // CHECK: call void @_ZN6PR50771AC1Ev // CHECK: call i32 @_ZN6PR50771gERKNS_1AE // CHECK: call void @_ZN6PR50771AD1Ev , a2(g(A())) { // CHECK: call void @_ZN6PR50771fEv f(); } struct C { C(); const B& b; }; C::C() // CHECK: call void @_ZN6PR50771BC1Ev : b(B()) { // CHECK: call void @_ZN6PR50771fEv f(); // CHECK: call void @_ZN6PR50771BD1Ev } } A f8() { // CHECK: call void @_ZN1AC1Ev // CHECK-NOT: call void @_ZN1AD1Ev return A(); // CHECK: ret void } struct H { H(); ~H(); H(const H&); }; void f9(H h) { // CHECK: call void @_ZN1HC1Ev // CHECK: call void @_Z2f91H // CHECK: call void @_ZN1HD1Ev f9(H()); // CHECK: call void @_ZN1HC1ERKS_ // CHECK: call void @_Z2f91H // CHECK: call void @_ZN1HD1Ev f9(h); } void f10(const H&); void f11(H h) { // CHECK: call void @_ZN1HC1Ev // CHECK: call void @_Z3f10RK1H // CHECK: call void @_ZN1HD1Ev f10(H()); // CHECK: call void @_Z3f10RK1H // CHECK-NOT: call void @_ZN1HD1Ev // CHECK: ret void f10(h); }