1*67e74705SXin Li // RUN: %clang_cc1 -triple i386-apple-darwin9 -emit-llvm -o - %s | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li // Non-trivial dtors, should both be passed indirectly. 4*67e74705SXin Li struct S { 5*67e74705SXin Li ~S(); 6*67e74705SXin Li short s; 7*67e74705SXin Li }; 8*67e74705SXin Li 9*67e74705SXin Li // CHECK-LABEL: define void @_Z1fv(%struct.S* noalias sret % f()10*67e74705SXin LiS f() { return S(); } 11*67e74705SXin Li // CHECK-LABEL: define void @_Z1f1S(%struct.S*) f(S)12*67e74705SXin Livoid f(S) { } 13*67e74705SXin Li 14*67e74705SXin Li // Non-trivial dtors, should both be passed indirectly. 15*67e74705SXin Li class C { 16*67e74705SXin Li public: 17*67e74705SXin Li ~C(); 18*67e74705SXin Li double c; 19*67e74705SXin Li }; 20*67e74705SXin Li 21*67e74705SXin Li // CHECK-LABEL: define void @_Z1gv(%class.C* noalias sret % g()22*67e74705SXin LiC g() { return C(); } 23*67e74705SXin Li 24*67e74705SXin Li // CHECK-LABEL: define void @_Z1f1C(%class.C*) f(C)25*67e74705SXin Livoid f(C) { } 26*67e74705SXin Li 27*67e74705SXin Li 28*67e74705SXin Li 29*67e74705SXin Li 30*67e74705SXin Li // PR7058 - Missing byval on MI thunk definition. 31*67e74705SXin Li 32*67e74705SXin Li // CHECK-LABEL: define void @_ZThn4_N18BasicAliasAnalysis13getModRefInfoE8CallSite 33*67e74705SXin Li // ... 34*67e74705SXin Li // CHECK: %struct.CallSite* byval align 4 %CS) 35*67e74705SXin Li struct CallSite { 36*67e74705SXin Li unsigned Ptr; CallSiteCallSite37*67e74705SXin Li CallSite(unsigned XX) : Ptr(XX) {} 38*67e74705SXin Li }; 39*67e74705SXin Li 40*67e74705SXin Li struct AliasAnalysis { 41*67e74705SXin Li virtual void xyz(); 42*67e74705SXin Li virtual void getModRefInfo(CallSite CS) = 0; 43*67e74705SXin Li }; 44*67e74705SXin Li 45*67e74705SXin Li struct ModulePass { 46*67e74705SXin Li virtual void xx(); 47*67e74705SXin Li }; 48*67e74705SXin Li 49*67e74705SXin Li struct BasicAliasAnalysis : public ModulePass, public AliasAnalysis { 50*67e74705SXin Li void getModRefInfo(CallSite CS); 51*67e74705SXin Li }; 52*67e74705SXin Li getModRefInfo(CallSite CS)53*67e74705SXin Livoid BasicAliasAnalysis::getModRefInfo(CallSite CS) { 54*67e74705SXin Li } 55*67e74705SXin Li 56*67e74705SXin Li // Check various single element struct type conditions. 57*67e74705SXin Li // 58*67e74705SXin Li // PR7098. 59*67e74705SXin Li 60*67e74705SXin Li // CHECK-LABEL: define i64 @_Z2f0v() 61*67e74705SXin Li struct s0_0 { int x; }; 62*67e74705SXin Li struct s0_1 : s0_0 { int* y; }; f0()63*67e74705SXin Lis0_1 f0() { return s0_1(); } 64*67e74705SXin Li 65*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2f1v() 66*67e74705SXin Li struct s1_0 { int x; }; 67*67e74705SXin Li struct s1_1 : s1_0 { }; f1()68*67e74705SXin Lis1_1 f1() { return s1_1(); } 69*67e74705SXin Li 70*67e74705SXin Li // CHECK-LABEL: define double @_Z2f2v() 71*67e74705SXin Li struct s2_0 { double x; }; 72*67e74705SXin Li struct s2_1 : s2_0 { }; f2()73*67e74705SXin Lis2_1 f2() { return s2_1(); } 74*67e74705SXin Li 75*67e74705SXin Li // CHECK-LABEL: define double @_Z2f3v() 76*67e74705SXin Li struct s3_0 { }; 77*67e74705SXin Li struct s3_1 { double x; }; 78*67e74705SXin Li struct s3_2 : s3_0, s3_1 { }; f3()79*67e74705SXin Lis3_2 f3() { return s3_2(); } 80*67e74705SXin Li 81*67e74705SXin Li // CHECK-LABEL: define i64 @_Z2f4v() 82*67e74705SXin Li struct s4_0 { float x; }; 83*67e74705SXin Li struct s4_1 { float x; }; 84*67e74705SXin Li struct s4_2 : s4_0, s4_1 { }; f4()85*67e74705SXin Lis4_2 f4() { return s4_2(); } 86*67e74705SXin Li 87*67e74705SXin Li // CHECK-LABEL: define i32* @_Z2f5v() 88*67e74705SXin Li struct s5 { s5(); int &x; }; f5()89*67e74705SXin Lis5 f5() { return s5(); } 90*67e74705SXin Li 91*67e74705SXin Li // CHECK-LABEL: define i32 @_Z4f6_0M2s6i(i32 %a) 92*67e74705SXin Li // CHECK: define i64 @_Z4f6_1M2s6FivE({ i32, i32 }* byval align 4) 93*67e74705SXin Li // FIXME: It would be nice to avoid byval on the previous case. 94*67e74705SXin Li struct s6 {}; 95*67e74705SXin Li typedef int s6::* s6_mdp; 96*67e74705SXin Li typedef int (s6::*s6_mfp)(); f6_0(s6_mdp a)97*67e74705SXin Lis6_mdp f6_0(s6_mdp a) { return a; } f6_1(s6_mfp a)98*67e74705SXin Lis6_mfp f6_1(s6_mfp a) { return a; } 99*67e74705SXin Li 100*67e74705SXin Li // CHECK-LABEL: define double @_Z2f7v() 101*67e74705SXin Li struct s7_0 { unsigned : 0; }; 102*67e74705SXin Li struct s7_1 { double x; }; 103*67e74705SXin Li struct s7 : s7_0, s7_1 { }; f7()104*67e74705SXin Lis7 f7() { return s7(); } 105*67e74705SXin Li 106*67e74705SXin Li // CHECK-LABEL: define void @_Z2f8v(%struct.s8* noalias sret %agg.result) 107*67e74705SXin Li struct s8_0 { }; 108*67e74705SXin Li struct s8_1 { double x; }; 109*67e74705SXin Li struct s8 { s8_0 a; s8_1 b; }; f8()110*67e74705SXin Lis8 f8() { return s8(); } 111*67e74705SXin Li 112*67e74705SXin Li // CHECK-LABEL: define void @_Z2f9v(%struct.s9* noalias sret %agg.result) 113*67e74705SXin Li struct s9_0 { unsigned : 0; }; 114*67e74705SXin Li struct s9_1 { double x; }; 115*67e74705SXin Li struct s9 { s9_0 a; s9_1 b; }; f9()116*67e74705SXin Lis9 f9() { return s9(); } 117