19430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar// RUN: %clang_cc1 -triple i386-apple-darwin9 -emit-llvm -o - %s | FileCheck %s 2bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson 3bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson// Non-trivial dtors, should both be passed indirectly. 4bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlssonstruct S { 5bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson ~S(); 67e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner short s; 7bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson}; 8bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson 993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fv(%struct.S* noalias sret % 10bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders CarlssonS f() { return S(); } 1193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f1S(%struct.S*) 12bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlssonvoid f(S) { } 13bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson 14bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson// Non-trivial dtors, should both be passed indirectly. 15bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlssonclass C { 169430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarpublic: 17bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson ~C(); 18bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson double c; 19bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson}; 20bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson 2193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1gv(%class.C* noalias sret % 22bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders CarlssonC g() { return C(); } 23bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlsson 2493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f1C(%class.C*) 25bfc008d5970b5bff0fd3ec15ecbd5b46f56fd9a1Anders Carlssonvoid f(C) { } 267e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner 277e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner 287e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner 297e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner 307e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner// PR7058 - Missing byval on MI thunk definition. 317e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner 3293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZThn4_N18BasicAliasAnalysis13getModRefInfoE8CallSite 337e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner// ... 34c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: %struct.CallSite* byval align 4 %CS) 357e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattnerstruct CallSite { 367e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner unsigned Ptr; 377e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner CallSite(unsigned XX) : Ptr(XX) {} 387e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner}; 397e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner 407e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattnerstruct AliasAnalysis { 417e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner virtual void xyz(); 427e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner virtual void getModRefInfo(CallSite CS) = 0; 437e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner}; 447e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner 457e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattnerstruct ModulePass { 467e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner virtual void xx(); 477e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner}; 487e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner 497e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattnerstruct BasicAliasAnalysis : public ModulePass, public AliasAnalysis { 507e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner void getModRefInfo(CallSite CS); 517e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner}; 527e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner 537e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattnervoid BasicAliasAnalysis::getModRefInfo(CallSite CS) { 547e21ffb97e1da7ee5470865859c5b4bfbe0b91a3Chris Lattner} 559430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 569430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar// Check various single element struct type conditions. 579430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar// 589430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar// PR7098. 599430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 6093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i64 @_Z2f0v() 619430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s0_0 { int x; }; 629430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s0_1 : s0_0 { int* y; }; 639430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbars0_1 f0() { return s0_1(); } 649430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 6593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @_Z2f1v() 669430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s1_0 { int x; }; 679430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s1_1 : s1_0 { }; 689430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbars1_1 f1() { return s1_1(); } 699430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 7093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @_Z2f2v() 719430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s2_0 { double x; }; 729430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s2_1 : s2_0 { }; 739430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbars2_1 f2() { return s2_1(); } 749430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 7593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @_Z2f3v() 769430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s3_0 { }; 779430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s3_1 { double x; }; 789430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s3_2 : s3_0, s3_1 { }; 799430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbars3_2 f3() { return s3_2(); } 809430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 8193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i64 @_Z2f4v() 829430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s4_0 { float x; }; 839430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s4_1 { float x; }; 849430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbarstruct s4_2 : s4_0, s4_1 { }; 859430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbars4_2 f4() { return s4_2(); } 86a1842d32a1964712e42078e9b389dce9258c6a8cDaniel Dunbar 8793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32* @_Z2f5v() 88a1842d32a1964712e42078e9b389dce9258c6a8cDaniel Dunbarstruct s5 { s5(); int &x; }; 89a1842d32a1964712e42078e9b389dce9258c6a8cDaniel Dunbars5 f5() { return s5(); } 907711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbar 9193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @_Z4f6_0M2s6i(i32 %a) 92c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: define i64 @_Z4f6_1M2s6FivE({ i32, i32 }* byval align 4) 937711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbar// FIXME: It would be nice to avoid byval on the previous case. 947711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbarstruct s6 {}; 957711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbartypedef int s6::* s6_mdp; 967711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbartypedef int (s6::*s6_mfp)(); 977711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbars6_mdp f6_0(s6_mdp a) { return a; } 987711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbars6_mfp f6_1(s6_mfp a) { return a; } 995ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 10093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @_Z2f7v() 1015ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s7_0 { unsigned : 0; }; 1025ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s7_1 { double x; }; 1035ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s7 : s7_0, s7_1 { }; 1045ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbars7 f7() { return s7(); } 1055ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 10693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z2f8v(%struct.s8* noalias sret %agg.result) 1075ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s8_0 { }; 1085ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s8_1 { double x; }; 1095ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s8 { s8_0 a; s8_1 b; }; 1105ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbars8 f8() { return s8(); } 1115ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 11293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z2f9v(%struct.s9* noalias sret %agg.result) 1135ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s9_0 { unsigned : 0; }; 1145ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s9_1 { double x; }; 1155ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbarstruct s9 { s9_0 a; s9_1 b; }; 1165ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbars9 f9() { return s9(); } 117