17d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -emit-llvm -o - | FileCheck %s 27d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 37d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangstruct Member { int x; Member(); Member(int); Member(const Member &); }; 47d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangstruct VBase { int x; VBase(); VBase(int); VBase(const VBase &); }; 57d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 67d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangstruct ValueClass { 77d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ValueClass(int x, int y) : x(x), y(y) {} 87d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang int x; 97d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang int y; 107d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang}; // subject to ABI trickery 117d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 127d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 137d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 147d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/* Test basic functionality. */ 157d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangstruct A { 167d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang A(struct Undeclared &); 177d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang A(ValueClass); 187d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang Member mem; 197d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang}; 207d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 217d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangA::A(struct Undeclared &ref) : mem(0) {} 227d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 237d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// Check that delegation works. 247d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: define void @_ZN1AC1ER10Undeclared(%struct.A* %this, %struct.Undeclared* %ref) unnamed_addr 257d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN1AC2ER10Undeclared( 267d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 277d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: define void @_ZN1AC2ER10Undeclared(%struct.A* %this, %struct.Undeclared* %ref) unnamed_addr 287d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN6MemberC1Ei( 297d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 307d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangA::A(ValueClass v) : mem(v.y - v.x) {} 317d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 327d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: define void @_ZN1AC1E10ValueClass(%struct.A* %this, i64 %v.coerce) unnamed_addr 337d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN1AC2E10ValueClass( 347d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 357d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: define void @_ZN1AC2E10ValueClass(%struct.A* %this, i64 %v.coerce) unnamed_addr 367d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN6MemberC1Ei( 377d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 387d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 397d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/* Test that things work for inheritance. */ 407d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangstruct B : A { 417d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang B(struct Undeclared &); 427d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang Member mem; 437d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang}; 447d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 457d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangB::B(struct Undeclared &ref) : A(ref), mem(1) {} 467d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 477d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: define void @_ZN1BC1ER10Undeclared(%struct.B* %this, %struct.Undeclared* %ref) unnamed_addr 487d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN1BC2ER10Undeclared( 497d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 507d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: define void @_ZN1BC2ER10Undeclared(%struct.B* %this, %struct.Undeclared* %ref) unnamed_addr 517d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN1AC2ER10Undeclared( 527d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN6MemberC1Ei( 537d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 547d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 557d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 567d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/* Test that the delegation optimization is disabled for classes with 577d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang virtual bases (for now). This is necessary because a vbase 587d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang initializer could access one of the parameter variables by 597d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang reference. That's a solvable problem, but let's not solve it right 607d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang now. */ 617d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangstruct C : virtual A { 627d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang C(int); 637d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang Member mem; 647d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang}; 657d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangC::C(int x) : A(ValueClass(x, x+1)), mem(x * x) {} 667d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 677d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: define void @_ZN1CC1Ei(%struct.C* %this, i32 %x) unnamed_addr 687d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN10ValueClassC1Eii( 697d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN1AC2E10ValueClass( 707d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN6MemberC1Ei( 717d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 727d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: define void @_ZN1CC2Ei(%struct.C* %this, i8** %vtt, i32 %x) unnamed_addr 737d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN6MemberC1Ei( 747d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 757d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 767d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 777d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/* Test that the delegation optimization is disabled for varargs 787d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang constructors. */ 797d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangstruct D : A { 807d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang D(int, ...); 817d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang Member mem; 827d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang}; 837d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 847d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangD::D(int x, ...) : A(ValueClass(x, x+1)), mem(x*x) {} 857d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 867d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: define void @_ZN1DC1Eiz(%struct.D* %this, i32 %x, ...) unnamed_addr 877d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN10ValueClassC1Eii( 887d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN1AC2E10ValueClass( 897d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN6MemberC1Ei( 907d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 917d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: define void @_ZN1DC2Eiz(%struct.D* %this, i32 %x, ...) unnamed_addr 927d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN10ValueClassC1Eii( 937d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN1AC2E10ValueClass( 947d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// CHECK: call void @_ZN6MemberC1Ei( 957d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 967d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 977d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang// PR6622: this shouldn't crash 987d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangnamespace test0 { 997d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang struct A {}; 1007d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang struct B : virtual A { int x; }; 1017d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang struct C : B {}; 1027d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1037d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang void test(C &in) { 1047d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang C tmp = in; 1057d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 1067d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 1077d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1087d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangnamespace test1 { 1097d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang struct A { A(); void *ptr; }; 1107d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang struct B { B(); int x; A a[0]; }; 1117d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang B::B() {} 1127d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang // CHECK: define void @_ZN5test11BC2Ev( 1137d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang // CHECK: [[THIS:%.*]] = load [[B:%.*]]** 1147d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang // CHECK-NEXT: ret void 1157d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 1167d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang