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