| // RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s |
| |
| struct T { |
| T(); |
| ~T(); |
| }; |
| |
| void f(const T& t = T()); |
| |
| class X { // ... |
| public: |
| X(); |
| X(const X&, const T& t = T()); |
| }; |
| |
| // CHECK-LABEL: define void @_Z1gv() |
| void g() { |
| // CHECK: call void @_ZN1TC1Ev([[T:%.*]]* [[AGG1:%.*]]) |
| // CHECK-NEXT: call void @_Z1fRK1T([[T]]* dereferenceable({{[0-9]+}}) [[AGG1]]) |
| // CHECK-NEXT: call void @_ZN1TD1Ev([[T]]* [[AGG1]]) |
| f(); |
| |
| // CHECK-NEXT: call void @_ZN1TC1Ev([[T:%.*]]* [[AGG2:%.*]]) |
| // CHECK-NEXT: call void @_Z1fRK1T([[T]]* dereferenceable({{[0-9]+}}) [[AGG2]]) |
| // CHECK-NEXT: call void @_ZN1TD1Ev([[T]]* [[AGG2]]) |
| f(); |
| |
| // CHECK-NEXT: call void @_ZN1XC1Ev( |
| X a; |
| |
| // CHECK-NEXT: call void @_ZN1TC1Ev( |
| // CHECK-NEXT: call void @_ZN1XC1ERKS_RK1T( |
| // CHECK-NEXT: call void @_ZN1TD1Ev( |
| X b(a); |
| |
| // CHECK-NEXT: call void @_ZN1TC1Ev( |
| // CHECK-NEXT: call void @_ZN1XC1ERKS_RK1T( |
| // CHECK-NEXT: call void @_ZN1TD1Ev( |
| X c = a; |
| } |
| |
| |
| class obj{ int a; float b; double d; }; |
| // CHECK-LABEL: define void @_Z1hv() |
| void h() { |
| // CHECK: call void @llvm.memset.p0i8.i64( |
| obj o = obj(); |
| } |
| |
| // PR7028 - mostly this shouldn't crash |
| namespace test1 { |
| struct A { A(); }; |
| struct B { B(); ~B(); }; |
| |
| struct C { |
| C(const B &file = B()); |
| }; |
| C::C(const B &file) {} |
| |
| struct D { |
| C c; |
| A a; |
| |
| // CHECK-LABEL: define linkonce_odr void @_ZN5test11DC2Ev(%"struct.test1::D"* %this) unnamed_addr |
| // CHECK: call void @_ZN5test11BC1Ev( |
| // CHECK-NEXT: call void @_ZN5test11CC1ERKNS_1BE( |
| // CHECK-NEXT: call void @_ZN5test11BD1Ev( |
| // CHECK: call void @_ZN5test11AC1Ev( |
| D() : c(), a() {} |
| }; |
| |
| D d; |
| } |
| |
| namespace test2 { |
| // CHECK: define linkonce_odr void @_ZN5test21AIiED2Ev( |
| template <typename T> struct A { A() {} ~A() {} }; |
| template <typename> void f(const A<int> & = {}) {} |
| void g() { f<int>(); } |
| } |